forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Основной форум (http://forum.boolean.name/forumdisplay.php?f=49)
-   -   проект (http://forum.boolean.name/showthread.php?t=481)

jimon 28.12.2005 23:39

короче несколько вопросов-направлений для балагана :)
1) возможно ли нормальная, комерческая разработка проекта на Midletpascal'е ?

2)какие будут идеи по проекту

3)есть ли уже готовые проекты ?

SubZer0 29.12.2005 00:32

1. возможна... допустим карточные игры или чтонить подобное, постое...

2. идеи - самые простые... физику конечно реализовать не получится, но какие нить ребусы или ченить подобное...

3. пока еще нет, но мне тут один постучался в аську, грит нужен MidletPascal программист... дороворились мы с ним с нового года начать работать... посмотрим что из этого получится...

3.1. имхо лучше на MobileBasic, там уже поддержка тайловых карт есть... на MidletPascal движение по карте реализовать весьма проблематично, а че за игра если даже по карте перещаться нельзя...

:)

Guest 29.12.2005 07:29

Видемо вы плохо знаете MidletPascal!
Карту как на MobileBasic написать очень легко!

Да и жанр игры может быть любой от гонок до аркады.

И необманывай есть игры на MidletPascal,пошарте по форумам найдёте,есть очень даже достойные.

SubZer0 29.12.2005 18:56

значит гришь карту реализовать как раз плюнуть... хотелось бы посмотреть как это можно сделать...

у меня даже есть небольшие наброски по такому поводу...

http://boolean.name/archive/temp/Tanks.zip

и мне чето никто ничего вразумительного не может сказать, как это усовершенствовать, чтоб это работало не 6 ФПС а больше

Red Ninja 29.12.2005 20:23

Неазнаю у меня на X100 нетормозит!

jimon 29.12.2005 22:57

народ ! неправильно строим код !
смотреть на мой пример (крестики нолики без ai и пару недоработок)
+ я незделал то что midlet на паузу может уходить

Код:

program game1;
var

//midlet main varibales
 run:boolean;
 need_to_update:boolean;
 Midlet_reboot:boolean;

//game variables
 a:array[1..3,1..3] of integer;
 buf1,buf2:integer;
 winer:integer;

procedure Cls;
begin
        setcolor(255,255,255);
        fillRect(0, 0, 128, 128);
        setcolor(0,0,0);
end;

procedure Midlet_update;
begin
        if Midlet_reboot=true then
 begin
 for buf1:=1 to 3 do
        for buf2:=1 to 3 do
  a[buf1,buf2]:=0;
 Midlet_reboot:=false;
 need_to_update:=true;
 end;

        repaint;       
        need_to_update:=false;
end;

procedure Graphics;
begin
        for buf1:=1 to 3 do
        for buf2:=1 to 3 do
        begin

        drawline(buf1*10,buf2*10,(buf1+1)*10,buf2*10);
        drawline(buf1*10,buf2*10,buf1*10,(buf2+1)*10);

 if a[buf1,buf2]=1 then
 begin
        drawline(buf1*10,buf2*10,(buf1+1)*10,(buf2+1)*10);
        drawline(buf1*10,(buf2+1)*10,(buf1+1)*10,buf2*10);
 end;

 if a[buf1,buf2]=2 then drawEllipse(buf1*10+1,buf2*10+1,10,10);
        end;
       
        drawline(40,10,40,40);
        drawline(10,40,40,40);
end;

procedure Ai;
begin
//fuccckkkk
end;

procedure Keys;
begin
if getKeyPressed<>KE_NONE then
        begin
 if getKeyPressed=KE_KEY1 then if a[1,1]=0 then a[1,1]:=1;
 if getKeyPressed=KE_KEY2 then if a[2,1]=0 then a[2,1]:=1;
 if getKeyPressed=KE_KEY3 then if a[3,1]=0 then a[3,1]:=1;
 if getKeyPressed=KE_KEY4 then if a[1,2]=0 then a[1,2]:=1;
 if getKeyPressed=KE_KEY5 then if a[2,2]=0 then a[2,2]:=1;
 if getKeyPressed=KE_KEY6 then if a[3,2]=0 then a[3,2]:=1;
 if getKeyPressed=KE_KEY7 then if a[1,3]=0 then a[1,3]:=1;
 if getKeyPressed=KE_KEY8 then if a[2,3]=0 then a[2,3]:=1;
 if getKeyPressed=KE_KEY9 then if a[3,3]=0 then a[3,3]:=1;
 if getKeyPressed=KE_KEY0 then run:=false;
 if getKeyPressed=KE_STAR then Midlet_reboot:=true;

 need_to_update:=true;
        end;
end;

procedure Find_Winer;
begin


end;

procedure Update_Game;
begin
        if need_to_update=true then
        begin
 Cls;
 Graphics;
 Midlet_update;
 Ai;
 Find_Winer;
        end;
        Keys;
       

end;

begin
        //midlet start run
        run:=true;
        need_to_update:=true;
        //main loop
 while run=true do Update_Game;
end.

учитесь ! :))

jimon 29.12.2005 22:58

так так... к минусам (ОГРОМНЫМ МИНУСАМ) я отношу то что нету в midletpascalе команды goto !

Red Ninja 30.12.2005 12:18

Это точно!

SubZer0 30.12.2005 13:14

Цитата:

Originally posted by Red Ninja@Dec 29 2005, 07:23 PM
Неазнаю у меня на X100 нетормозит!
у меня на мотороллере Е398 - 6-8 ФПС... :'((

а на эмуле MidpX - 120

SubZer0 30.12.2005 13:16

Цитата:

Originally posted by jimon@Dec 29 2005, 09:58 PM
так так... к минусам (ОГРОМНЫМ МИНУСАМ) я отношу то что нету в midletpascalе команды goto !
ага... goto forever!! ;) ;)

Red Ninja 30.12.2005 14:28

SubZer0
У тебя в Танке занов всю картинку ресиет,а надо чтобы поодельности!
Процедуру создай чтобы она определяла где камера(типо камера ;) )находиться
и отрисовывала ту чать которую надо,а не ташило всю картику!

P.S Я Танчик толком непосмотрел,скинь ещё раз ссылку!

Red Ninja 30.12.2005 14:42

ВОт этим воспользуйся:

SetClip(int x, int y, int width, int height);
width,height-Разрешения монитора!!!

Red Ninja 30.12.2005 14:47

Но я это только нашёл так и непонел чё это! :(

SubZer0 30.12.2005 16:06

Цитата:

Originally posted by Red Ninja@Dec 30 2005, 01:28 PM
SubZer0
У тебя в Танке занов всю картинку ресиет,а надо чтобы поодельности!
Процедуру создай чтобы она определяла где камера(типо камера ;) )находиться
и отрисовывала ту чать которую надо,а не ташило всю картику!

P.S Я Танчик толком непосмотрел,скинь ещё раз ссылку!

ты наверное не доконца понял весь смысл проги...

это показ тайловой карты на экран...

это рассчет позиций: ((xc, yc) - позиция на карте по тайлам, (xc1,yc1) - позиция тайлов на экране (для плавности))

xc:=SXPos/16+i;
yc:=SYPos/16+j;
xc1:=i*16-(SXPos mod 16)-16;
yc1:=j*16-(SYPos mod 16)-16;


а это выводит картинки на экран: (плюс условия на предотвращения ошибок выхода за границу карты)

if (xc>=1) and (xc<=FieldW) and (yc>=1) and (yc<=FieldH) then begin
drawimage(MO[GameFF[xc,yc]],xc1,yc1);
end;


хз где ты там нашел что картинка рисуется вся...

тут я рассчитываю сколько тайлов влезет на экран:
ScreenW:=GetWidth/16+1;
ScreenH:=GetHeight/16+2;

и пускаю по этим значениям главный цикл:
for i:=1 to ScreenW do for j:=1 to ScreenH do begin ........................


:dontknow: :dontknow:

SubZer0 30.12.2005 16:22

Цитата:

Originally posted by Red Ninja@Dec 30 2005, 01:47 PM
Но я это только нашёл так и непонел чё это! :(
SetClip это определение отображаемого участка экрана, и потом в его пределах можно рисовать, а за его пределами не получится :)

Red Ninja(Михайлов Никита) 30.12.2005 18:26

SubZer0
Я просто 1 раз Танк смотрел и код непомню! :)

SubZer0 30.12.2005 20:53

Цитата:

Originally posted by Red Ninja(Михайлов Никита)@Dec 30 2005, 05:26 PM
SubZer0
Я просто 1 раз Танк смотрел и код непомню! :)

к сожалению никто не может мне подать реальную идею, как это можно улучшить... и по нету чето я не могу найти ничего подобного... :unsure:

jimon 30.12.2005 22:33

неюзать интерполяцию

SubZer0 30.12.2005 23:24

Цитата:

Originally posted by jimon@Dec 30 2005, 09:33 PM
неюзать интерполяцию
ага... тогда криво все получится... а кодить кривые игры - мастдай


PS сорри за флейм

Red Ninja(Михайлов Никита) 30.12.2005 23:48

Замути танчики как на Дэнди были!
Сделай картинки 8х8!
Если прикольно замутишь,то довольна классная игра получиться!

jimon 31.12.2005 13:02

вот смотри - карта зачастую однообразная - выводится одна картинка фон, на ней есть другие картинки
вот фон мы двигаем то в низ то верх на чтобы было видно шершавость или то что оно вообще как нить двигается

а остальные картинки юзаем с интерполяцией - только осторожно

Red Ninja(Михайлов Никита) 31.12.2005 13:26

А самое легкое и гибкое решение это на Яве! :D

SubZer0 31.12.2005 16:43

Цитата:

Originally posted by jimon@Dec 31 2005, 12:02 PM
вот смотри - карта зачастую однообразная - выводится одна картинка фон, на ней есть другие картинки
вот фон мы двигаем то в низ то верх на чтобы было видно шершавость или то что оно вообще как нить двигается

а остальные картинки юзаем с интерполяцией - только осторожно

да, я уже думал над этим, но... смотри, это ведь еще только карта... допустим я зделаю по такой технологии, допустим я выиграю с десяток ФПС, но это ведь только карта... а на ней еще танчики должны быть + пули/снаряды + взрывы + бонусы + логика... и тут уже о дополнительных эффектах вообще и думать не приходится...

думаю тут не надо быть большого ума человеком, чтоб понять что это нереально! (поэтому я даже не пробую)

:'(( :'(( :'((


:offtop:

вот сейчас праздники пройдут... попробую это на MobileBasic там есть функции для тайловой карты... если уж и там не получится, то прийдется на OmegaBasic извращаться...

jimon 31.12.2005 17:33

имхо - ето же мобила
она сравнима с компом i486 60 mhz и 1 метром оперативы
что же ты хочеш ? :)

Red Ninja(Михайлов Никита) 31.12.2005 17:35

НА MobileBasic должно получиться!

Но в MobileBasic плохой отклик от клавишь!И
Там есть одна проблема рисовать тайлы ;)

Red Ninja(Михайлов Никита) 01.01.2006 00:25

Вот измени в своём танке код на этот и проверь!

Код:

program Tanks;
var

 GameFF: array[1..30, 1..30] of integer;
 MO: array[0..10] of image;
 i,j,t,xc,yc,xc1,yc1: integer;
 SXPos,SYPos: integer; { Position Screen on Map }
 StageRes: resource;
 Tank1: array [1..4] of image;
 
 keyAction :integer;{Click Key}
 
 UTT:integer; { Type of Tank for User }
 UXPos,UYpos: integer; { UserPosition on Area }
 Exit:integer;{Exit}
 
 Secund:command;
 Secund1,Secund2,SecundD:integer;
 
Procedure Camera(xi,yi:integer;);
begin
 for i:=1 to (getwidth/16) do for j:=1 to (getheight/16) do

 begin
 if xi<0 then xi:=0;
 if yi<0 then yi:=0;
 
 if xi>(30-getwidth/16) then xi:=(30-getwidth/16);
 if yi>(30-getheight/16) then yi:=(30-getheight/16);
 
 drawimage(MO[GameFF[i+xi,j+yi]],(i*16)-16,(j*16)-16);
 end;
end;

 
begin


{ Loading Stage 1 }

{ Setting Stage Constants }

UXPos:=32;UYPos:=32;

{ Loading Images }

MO[1]:=loadimage('/Wall1.png');
MO[0]:=loadimage('/Floor1.png');

Tank1[1]:=loadimage('/tank1.png');
Tank1[2]:=loadimage('/tank2.png');
Tank1[3]:=loadimage('/tank3.png');
Tank1[4]:=loadimage('/tank4.png');

{ Loading Map }

StageRes:=OpenResource('/stage1.tt');

if ResourceAvailable(StageRes) then begin
 for i:=1 to 30 do for j:=1 to 30 do begin
 repeat
 t:=readbyte(StageRes);
 until (t=$30)OR(t=$31);
 GameFF[j,i]:=t-$30;
 end;
end;
CloseResource(StageRes);


{ Main Loop }
SXPos:=0;
SYPos:=0;
t:=1;
SecundD:=1000;

 repeat
 Secund1:=GetRelativeTimeMs;
 keyAction := keyToAction(getKeyClicked);
 

 if keyAction = GA_RIGHT then SXPos:=SXPos+t;
 if keyAction = GA_LEFT then SXPos:=SXPos-t;
 
 if keyAction = GA_DOWN then SYPos:=SYPos+t;
 if keyAction = GA_UP  then SYPos:=SYPos-t;
 
 Camera(SXPos,SYPos);
 if keyAction = GA_FIRE  then Exit:=999;{EXIT}

 repaint;
 
 delay(SecundD);
 Secund2:=GetRelativeTimeMs;
 RemoveCommand(Secund);
 Secund := CreateCommand(IntegerToString((Secund2-Secund1)-SecundD),CM_OK, 1);
 AddCommand(Secund);
 
 until Exit=999

end.

ФПС должно быть получше и скажи солько у тебя будет равно Secund
Чтобы приложение стало быстрее поставь делай SecundD:=1;

Red Ninja(Михайлов Никита) 01.01.2006 18:33

Тут правда ошибки есть но их легко исправить!
А вот в файле stag.ttt удали ; они там уже ненужны.

Я сам начел писать РПГ,у меня написана такаеже процедупра Камера и на X100
идёт как на компе! :) :D 8)

SubZer0 02.01.2006 02:22

заменил полностью код и теперь " Unable to load class M " :unsure:

Red Ninja(Михайлов Никита) 02.01.2006 09:26

Вложений: 2
Страно!
Давай я тебе сразу код скину!

Вот качай:

SubZer0 02.01.2006 12:27

Работает реально, и ФПС около 100, но хотелось-бы все-равно чтоб присутствовала интерполяция...

значит в тех вычислениях был тормоз... хммм... надо от них избавиться... я поработаю над этим...

:)

Red Ninja(Михайлов Никита) 02.01.2006 12:47

Ну вот и отлично,а ты уже очаевался!

Можно замутитьть как у тебя с быстрой скоростью!
Нажо отрисовывать только те тайлы которые видны на мониторе,а ты рисовал всю карты сразу!

Red Ninja(Михайлов Никита) 02.01.2006 14:01

Вложений: 2
Вот я написал тебе как тебе надо!

pax 03.01.2006 11:31

Вот пытался уменьшить кол-во вычислений... вроде меньше стало, а ФПС такойже остался... значит дело не в кол-ве вычислений...
Код:

program Tanks;
var

 GameFF: array[1..30, 1..30] of integer;
 MO: array[0..10] of image;
 FieldW,FieldH:integer;
 ScreenW,ScreenH:integer;
 i,j,t,xc,yc,xc1,yc1: integer;
 SXPos,SYPos,XMax,YMax: integer; { Position Screen on Map }
 DXPos,DYPos: integer;
 MXPos,MYPos: integer;
 StageRes: resource;
 Tank1: array [1..4] of image;
 
 UTT:integer; { Type of Tank for User }
 UXPos,UYpos: integer; { UserPosition on Area }
 
  FPS_LastCount,FPS_Count,MS,MSL: integer;

begin

{ Setting Constants }

SXPos:=1;
SYPos:=1;

        DXPos:=SXPos/16;
        MXPos:=-(SXPos mod 16)-16;
        DYPos:=SYPos/16;
        MYPos:=-(SYPos mod 16)-16;

ScreenW:=GetWidth/16+1;
ScreenH:=GetHeight/16+2;

FieldW:=30;
FieldH:=30;

XMax:=FieldW*16-ScreenW*16;
YMax:=FieldH*16-ScreenH*16;

{ Loading Stage 1 }

{ Setting Stage Constants }

UXPos:=32;UYPos:=32;

{ Loading Images }

MO[1]:=loadimage('/Wall1.png');
MO[0]:=loadimage('/Floor1.png');

Tank1[1]:=loadimage('/tank1.png');
Tank1[2]:=loadimage('/tank2.png');
Tank1[3]:=loadimage('/tank3.png');
Tank1[4]:=loadimage('/tank4.png');

{ Loading Map }

StageRes:=OpenResource('/stage1.tt');

if ResourceAvailable(StageRes) then begin
 for i:=1 to 30 do for j:=1 to 30 do begin
 t:=readbyte(StageRes);
 if t=$3B then begin t:=readbyte(StageRes);t:=readbyte(StageRes);t:=readbyte(StageRes);end;
 GameFF[j,i]:=t-$30;
 end;
end;
CloseResource(StageRes);


{ Main Loop }
t:=1;
while true do//GetKeyClicked <> KE_STAR do
begin

 setcolor(0,0,0);fillrect(0,0,getwidth,getheight); { CLS }
 
 if GetKeyPressed = KE_KEY6 then
 Begin
        SXPos:=SXPos+t;
        DXPos:=SXPos/16;
        MXPos:=-(SXPos mod 16)-16;
 End;
 
 if GetKeyPressed = KE_KEY4 then
        Begin
        SXPos:=SXPos-t;
        DXPos:=SXPos/16;
        MXPos:=-(SXPos mod 16)-16;
 End;
 
 if GetKeyPressed = KE_KEY8 then
        Begin
        SYPos:=SYPos+t;
        DYPos:=SYPos/16;
        MYPos:=-(SYPos mod 16)-16;
 End;
 
 if GetKeyPressed = KE_KEY2 then
 Begin
        SYPos:=SYPos-t;
        DYPos:=SYPos/16;
        MYPos:=-(SYPos mod 16)-16;
 End;
 
 for i:=1 to ScreenW do
 for j:=1 to ScreenH do
  begin
  xc:=DXPos+i; yc:=DYPos+j;
  if (xc>0) and (xc<=FieldW) and (yc>0) and (yc<=FieldH) then
  begin
  xc1:=i*16+MXPos; yc1:=j*16+MYPos;
  drawimage(MO[GameFF[xc,yc]],xc1,yc1);
  end;
 end;

  MS:=GetSecond(GetCurrentTime);
  If MS<>MSL Then
  begin
  FPS_LastCount:=FPS_Count;
  FPS_Count:=0;
  MSL:=MS;
  end
  Else
  FPS_Count:=FPS_Count+1;
 
  SetColor(255, 255, 255);
  DrawText('FPS:'+IntegerToString(FPS_LastCount), 0, 0);

 repaint;
 
 
end;
end.


Red Ninja(Михайлов Никита) 03.01.2006 12:15

А мне кажеться что у тебя больше вычесдений! 8)

pax 03.01.2006 17:10

Цитата:

Originally posted by Red Ninja(Михайлов Никита)@Jan 3 2006, 12:15 PM
А мне кажеться что у тебя больше вычесдений! 8)
И где же больше?
Эта часть теперь вычисляется только если есть квадрат для отрисовки:
Код:

xc1:=i*16+MXPos; yc1:=j*16+MYPos;
Теперь части вот этих уравнений вычисляются только при нажатии соответствующей кнопки кнопки, а не при каждой итерации в циклах:

Цитата:

* xc:=SXPos/16+i;

* yc:=SYPos/16+j;

* xc1:=i*16-(SXPos mod 16)-16;

* yc1:=j*16-(SYPos mod 16)-16;

а именно:
Код:

if GetKeyPressed = KE_KEY6 then
 Begin
 *SXPos:=SXPos+t;
 *DXPos:=SXPos/16;
 *MXPos:=-(SXPos mod 16)-16;
 End;
 
if GetKeyPressed = KE_KEY4 then
 *Begin
 *SXPos:=SXPos-t;
 *DXPos:=SXPos/16;
 *MXPos:=-(SXPos mod 16)-16;
 End;
 
if GetKeyPressed = KE_KEY8 then
 *Begin
 *SYPos:=SYPos+t;
 *DYPos:=SYPos/16;
 *MYPos:=-(SYPos mod 16)-16;
 End;
 
if GetKeyPressed = KE_KEY2 then
 Begin
 *SYPos:=SYPos-t;
 *DYPos:=SYPos/16;
 *MYPos:=-(SYPos mod 16)-16;
 End;

Так что, надо сначала в коде разобраться, а не бросаться фразами только глянув... код хоть и больше стал а вычисления уменьшились 8)

Red Ninja(Михайлов Никита) 03.01.2006 18:58

Так ты его код изменил
я думал мой.

У меня похоше!:)

pax 03.01.2006 22:12

Цитата:

Originally posted by Red Ninja(Михайлов Никита)@Jan 3 2006, 06:58 PM
Так ты его код изменил
я думал мой.

У меня похоше!:)

Да но в твоем коде нет интерполяции, т.е. передвижения на часть квадрата, а не на целый квадрат.

Red Ninja(Михайлов Никита) 04.01.2006 08:23

А Ремиксе 1 там на целый квадрат
А в Ремиксе 2 как интерполяции!(ну почти):)

pax 04.01.2006 22:14

Цитата:

Originally posted by Red Ninja(Михайлов Никита)@Jan 4 2006, 08:23 AM
А в Ремиксе 2 как интерполяции!(ну почти):)
Тоже самое можно сделать в коде SubZer0 сделав параметр t=16 ;)


Часовой пояс GMT +4, время: 07:26.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot