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)

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:25.

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