Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2006.03.19;
Скачать: [xml.tar.bz2];

Вниз

Аркадный движёк на DelphiX   Найти похожие ветки 

 
netboy   (2005-09-12 01:21) [0]

Подсажите пожалуйста почему движение камеры не идёт плавно, когда приложенние в состоянии
(FullScreen)
А когда в оконном режиме, то движение камеры идёт плавно.
Этот движёк я скачал с сайта
www.Migames.ru
Код внизу :
unit Main;
interface
uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls, ExtCtrls, Menus, DXClass, DXSprite, DXInput, DXDraws;
 const Map : array [-10..39,0..14] of integer=((3,4,4,4,4,4,4,4,4,4,4,4,4,4,4),
                                               (3,4,4,4,4,3,4,4,4,4,4,4,4,4,4),
                                               (3,4,3,4,4,4,4,4,4,3,4,4,4,4,4),
                                               (3,4,4,4,4,4,3,4,4,4,4,4,4,4,4),
                                               (3,4,3,4,4,4,4,4,4,4,3,4,4,4,4),
                                               (3,4,4,4,4,4,4,4,4,4,4,4,4,4,4),
                                               (3,4,3,4,4,4,4,3,4,4,4,4,4,4,4),
                                               (3,4,4,4,3,4,4,4,4,4,4,4,4,4,4),
                                               (3,4,4,4,4,4,3,4,4,4,4,4,4,4,4),
                                               (5,5,5,5,5,5,5,5,5,5,3,4,4,4,4),
                                               (1,2,2,2,2,2,2,3,2,2,3,4,4,4,4),
                                               (1,2,2,2,2,2,2,2,2,2,3,4,4,4,4),
                                               (1,2,2,2,2,2,2,2,2,2,3,4,4,4,4),
                                               (1,2,2,2,2,2,2,2,2,2,3,4,4,4,4),
                                               (1,2,2,2,2,2,2,2,2,2,3,4,4,4,4),
                                               (1,2,2,2,2,2,2,2,2,2,3,4,4,4,4),
                                               (1,2,2,2,2,2,2,2,5,2,3,4,4,4,4),
                                               (1,2,2,2,2,2,2,2,5,2,3,4,4,4,4),
                                               (1,2,2,2,2,2,2,2,5,2,3,4,4,4,4),
                                               (1,2,2,2,2,5,2,2,2,2,3,4,4,4,4),
                                               (1,2,2,2,2,5,2,2,2,2,3,4,4,4,4),
                                               (1,2,2,2,2,5,2,2,2,3,3,4,4,4,4),
                                               (1,2,2,2,2,5,2,2,2,2,3,4,4,4,4),
                                               (1,2,2,2,2,2,2,2,2,2,3,4,4,4,4),
                                               (1,2,2,2,2,3,2,2,3,2,3,4,4,4,4),
                                               (1,2,2,2,2,3,2,2,3,2,3,4,4,4,4),
                                               (1,2,2,2,2,3,2,2,3,2,3,4,4,4,4),
                                               (1,2,2,2,2,3,2,2,2,2,3,4,4,4,4),
                                               (1,2,2,2,2,3,2,3,2,2,3,4,4,4,4),
                                               (1,2,2,2,2,2,2,3,2,2,3,4,4,4,4),
                                               (1,2,2,2,2,2,2,3,2,2,3,4,4,4,4),
                                               (1,2,2,2,2,2,3,3,5,5,3,4,4,4,4),
                                               (1,2,2,2,2,2,3,2,2,2,3,4,4,4,4),
                                               (1,2,2,2,2,2,3,2,2,2,3,4,4,4,4),
                                               (1,2,2,2,2,2,3,2,2,2,3,4,4,4,4),
                                               (1,2,2,2,2,2,3,2,2,2,3,4,4,4,4),
                                               (1,2,2,2,2,2,3,2,2,3,3,4,4,4,4),
                                               (1,2,2,2,2,2,3,2,2,2,3,4,4,4,4),
                                               (1,2,2,2,2,2,2,2,3,2,3,4,4,4,4),
                                               (1,2,2,2,2,2,2,3,2,2,3,4,4,4,4),
                                               (1,2,2,2,2,2,3,2,2,2,3,4,4,4,4),
                                               (1,2,2,2,2,3,2,2,2,2,3,4,4,4,4),
                                               (1,2,2,2,2,3,2,2,2,2,3,4,4,4,4),
                                               (1,2,2,2,2,3,2,2,2,2,3,4,4,4,4),
                                               (1,2,2,2,2,2,2,2,2,2,3,4,4,4,4),
                                               (1,2,2,2,2,2,3,2,2,2,3,4,4,4,4),
                                               (1,2,2,2,2,2,3,2,2,2,3,4,4,4,4),
                                               (1,2,2,2,2,2,2,2,3,2,3,4,4,4,4),
                                               (1,2,2,2,2,2,2,2,3,2,3,4,4,4,4),
                                               (1,2,2,2,2,2,2,2,2,2,3,4,4,4,4));
m :integer = 0;                                  //счетчик для анимации
 type
 TMainForm = class(TDXForm)
   DXTimer: TDXTimer;
   DXDraw: TDXDraw;
   DXSpriteEngine: TDXSpriteEngine;
   DXInput: TDXInput;
   ImageList: TDXImageList;
   procedure FormKeyDown(Sender: TObject; var Key: Word;
     Shift: TShiftState);
   procedure FormCreate(Sender: TObject);
   procedure DXTimerTimer(Sender: TObject; LagCount: Integer);
 private
   FMoveMode: Boolean;
 end;

var
 MainForm: TMainForm;
  Player, Enemy: TSprite;
    Direct,n,SpX,SpY: integer;
      Jump,falldown: boolean;
       JumpCount: integer;
        implementation

{$R *.DFM}


 
netboy   (2005-09-12 01:23) [1]

part № 2
----------------------------------------------------------------
type
 TPlayer = class(TImageSprite)
  Visible:boolean;
  VisibleCount:integer;
  AnimCount:integer;
 protected
   procedure DoCollision(Sprite: TSprite; var Done: Boolean); override;
   procedure DoMove(MoveCount: Integer); override;
    end;

 TEnemy = class(TImageSprite)
  Visible:boolean;
  AnimCount:integer;
 protected
   procedure DoMove(MoveCount: Integer); override;
    end;

 TMap = class(TImageSprite)
 protected
 end;

procedure TPlayer.DoCollision(Sprite: TSprite; var Done: Boolean);
begin
   if sprite=Enemy then visible:=false;
end;

procedure TEnemy.DoMove(MoveCount: Integer);
begin
  If (abs(Player.X-Enemy.x)<100)and(not visible) then Y:=Y-2;
  If Y<=273 then visible:=true;
  If (abs(Player.X-Enemy.x)>100)and(visible) then Y:=Y+2;
  If Y>=303 then visible:=false;
     if m mod 6 = 0 then
        If AnimCount<3 then inc(AnimCount) else AnimCount:=0;
        AnimPos := AnimCount;
end;

procedure TPlayer.DoMove(MoveCount: Integer);
begin
 inherited DoMove(MoveCount);
  inc(m);
FallDown:=false;
AnimPos:=6;
SpX:= trunc((Player.X+16)/32);
SpY:= trunc((Player.Y)/32);
if (not jump)then
if (Map[SpX,SpY+1]<3)or((SpY+1)*32-Player.Y<32)
     then Begin Y:=Y+2; FallDown:=true; AnimPos := 9;end;

   if (isUp in MainForm.DXInput.States)and(not falldown)
     then
       Begin
         if Direct = 1 then
      Image := MainForm.ImageList.Items.Find("playerr")
        else if Direct =-1 then
      Image := MainForm.ImageList.Items.Find("playerl");
         Jump:=True;
    end;
if Jump=true then
 Begin
      Inc(JumpCount);
     if JumpCount<36 then
      Begin
        if (Map[trunc((Player.X+16)/32),trunc((Player.Y+30)/32)-1]<5) then {и над головой ничего нет}
      Y := Y - 2;
   AnimPos := 8;
      end;
     if JumpCount>36 then
       Begin
         JumpCount:=0;
         Jump:= False;
                 end;
 end;

   if (isDown in MainForm.DXInput.States)and(not jump)and(not falldown) then
     AnimPos:=7;

//Здесь просто анимация
  if ((isLeft in MainForm.DXInput.States)or(isRight in MainForm.DXInput.States))
  and(not jump)and(not falldown)  then
     Begin
     if m mod 6 = 0 then
     if AnimCount<5 then inc(AnimCount) else AnimCount:=0;
           AnimPos:= AnimCount;
   end;

   If (not Visible)and (VisibleCount mod 12 = 0)
     then Player.Visible := not Player.Visible;
      If not Visible then inc(VisibleCount);
      If VisibleCount>100 then
            begin Visible:=true; VisibleCount:=0; Player.Visible:=true end;
   if isLeft in MainForm.DXInput.States then
     Begin
                        Direct :=-1;
         Image := MainForm.ImageList.Items.Find("playerl");
 if (Map[trunc((Player.X+30)/32)-1,trunc((Player.Y+30)/32)]<5)
       then  X := X - (300/1000)*MoveCount;
   end;

   if isRight in MainForm.DXInput.States then
    Begin
                Direct :=1;
         Image := MainForm.ImageList.Items.Find("playerr");
     if (Map[trunc((Player.X)/32)+1,trunc((Player.Y+30)/32)]<5)
            then
       X := X + (300/1000)*MoveCount;
    end;
      collision;
 Engine.X := -X+Engine.Width div 2-Width div 2;
 Engine.Y := -Y+Engine.Height div 2-Height div 2;
end;

procedure TMainForm.DXTimerTimer(Sender: TObject; LagCount: Integer);
begin
 if not DXDraw.CanDraw then exit;

 DXInput.Update;

 if FMoveMode then
   LagCount := 1000 div 60;

 DXSpriteEngine.Move(LagCount);
 DXSpriteEngine.Dead;

 DxSpriteEngine.Engine.Y:=16;

 DXDraw.Surface.Fill(0);
 DXSpriteEngine.Draw;
   With DXDraw.Surface.Canvas do
 begin
   Brush.Style := bsClear;
   Font.Color := clWhite;
   Font.Size := 12;
   TextOut(20,100,"Pl.x="+floatToStr(Round(Player.x)));
   TextOut(20,115,"Pl.y="+floatToStr(Round(Player.y)));
   TextOut(100,100,"Pl.Wx="+floatToStr(Round(Player.Worldx)));
   TextOut(100,115,"Pl.Wy="+floatToStr(Round(Player.Worldy)));
   TextOut(200,100,"SE.x="+floatToStr(Round(DXSpriteEngine.Engine.x)));
   TextOut(200,115,"SE.y="+floatToStr(Round(DXSpriteEngine.Engine.y)));
   Release;
   end;
 DXDraw.Flip;
end;

procedure TMainForm.FormCreate(Sender: TObject);
var
 i,j: Integer;
begin
    Jump:=False; JumpCount:=0;
 ImageList.Items.MakeColorTable;
   DXDraw.Cursor :=crNone;

 DXDraw.ColorTable := ImageList.Items.ColorTable;
 DXDraw.DefColorTable := ImageList.Items.ColorTable;
 DXDraw.UpdatePalette;

 with TBackgroundSprite.Create(DXSpriteEngine.Engine) do
 begin
   SetMapSize(40, 15);
   Image := ImageList.Items.Find("bg");
   Collisioned := False;
     For j:= -10 to 39 do
    For i:= 0 to 14 do
      Begin
       If Map[j,i]<3 then Chips[j,i]:=Map[j,i]-1 else Chips[j,i]:=1;
       CollisionMap [j,i] := false;
      End;
   Z := -10;
   Tile := false;
 end;

   For j:= -10 to 39 do
    For i:= 0 to 14 do
      If Map[j,i]>2 then
   with TMap.Create(DXSpriteEngine.Engine) do
 begin
   if Map[j,i]=3 then Image:=ImageList.Items.Find("grass");
   if Map[j,i]=4 then Image:=ImageList.Items.Find("earth");
   if Map[j,i]=5 then Image:=ImageList.Items.Find("brix");
   Collisioned := true;
     x:=j*32+16;
     y:= i*32+16;
   Z := -4;
   Tile := False;
 end;

 Player := TPlayer.Create(DXSpriteEngine.Engine);
 with TPlayer(Player) do
 begin
   Image := ImageList.Items.Find("playerr");
   Collisioned:=true;
   pixelcheck:=false;
   Z := 0;
   Width := Image.Width;
   Height := Image.Height;
   x:=1;
   y:=60;
   visible:=true;
     end;

 Enemy := TEnemy.Create(DXSpriteEngine.Engine);
 with TEnemy(Enemy) do
 begin
   Image := ImageList.Items.Find("enemy");
   Collisioned:=true;
   pixelcheck:=false;
   Z := -5;
   Width := Image.Width;
   Height := Image.Height;
   x:=580;
   y:=303;
   visible:=false;
 end;
end;

procedure TMainForm.FormKeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
 if Key=VK_ESCAPE then
   Close;
end;
end.


 
DR0N ©   (2005-09-12 07:47) [2]

дай лучше линк на движок =)


 
netboy   (2005-09-12 19:09) [3]

Линк :)
http://mirgames.ru/files/samples/sample1.zip


 
DR0N ©   (2005-09-12 21:08) [4]

Not Found
The requested URL /files/samples/sample1.zip was not found on this server.

Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.


 
rsy   (2005-09-13 02:35) [5]

Я тоже хочу сделать аркаду и использую этот движёк.
И таже проблема.
Я могу дать линк :
http://www.delphi-live1.narod.ru/sample1.zip


 
DR0N ©   (2005-09-13 10:08) [6]

Вообще большего отстоя чем этот "движок" в жизне не встречал, по доброте душевной предлагаю альтернативу в 100 раз лучше (если надо конечно ;) http://dronprogs.mirgames.ru/files/Sources/MT.rar (все есть + редактор карт ;)

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


 
Servelat ©   (2005-09-13 13:57) [7]


> как мне кажется это из за нестабильных фпс.

Не-а, тут дело вот в чем (ИМХО конечно):
DXDraw компонент имеет размеры 632 на 453. Соответственно, в оконном режиме, таков и размер окна. В полноэкранном режиме стоит размер 640x480 (оно и понятно, будет твой монитор всякие 632 на 453 поддерживать). Дык вот, фишка в кривом отображении крайних тайлов (слева и справа экрана). Как только больше половины крайнего тайла ушло за пределы видимости, тайл перестает отрисовываться. Соответственно, при беге, крайние тайлы, то появляются (когда крайним становится следующий тайл), то исчезают (когда крайний тайл ушел больше чем наполовину). В этом и причина того, что
> движение камеры не идёт плавно

хотя я бы это назвал неправильной отрисовкой крайних тайлов.

В оконном режиме такой ерунды не наблюдается, потому что размеры окна (632х453)меньше, чем размеры установленной поверхности (640x480), поэтому крайние тайлы мы просто не видим вообще, они за границей окна.

Как лечить:
Устанавливать ширину/высоту спрайта, который создается для каждого тайла карты. Не знаю зачем, но создатели этого <censored> движка прибавляли к координатам спрайта ширину полутайла (то есть 16), а ширину и высоту не указывали вообще. Соответственно, заменив в процедуре FormCreate нужный кусок следующим образом:

   For j:= -10 to 39 do
    For i:= 0 to 14 do
      If Map[j,i]>2 then
   with TMap.Create(DXSpriteEngine.Engine) do
 begin
   if Map[j,i]=3 then Image:=ImageList.Items.Find("grass");
   if Map[j,i]=4 then Image:=ImageList.Items.Find("earth");
   if Map[j,i]=5 then Image:=ImageList.Items.Find("brix");
   Collisioned := true;
     x:=j*32;
     y:= i*32;
   Z := -4;
   Tile := False;
   Width := 32;
   Height := 32;
 end;


Мы получим более/менее выглядящий полноэкранный вариант. Это далеко не единственный вариант исправления, и уж наверняка не самый лучший (глядя на код движка хотелось переписать все с начала...), но тем не менее работает.

Да, и напоследок, совет: если вы не могли найти самостоятельно решение такой мелкой проблемы, рано вам игры (особенно аркадные) писать. Скачав кривой чужой движок, хотеть получить от него что-то хорошее, не обладая умением - пустая трата времени и сил. DirectDraw давно устарел, так что DelphiX вчерашний день, да, для начала можно и нужно его использовать, писать на нем что-то простое, учиться, переходить к более сложному. Но качать чужое, а потом постить в форум дескать, что ж тут не так, глупость. Так что вперед, изучать примеры DelhpiX"овские (идут с версией для 5й Делфи), реализовывать свои ПРОСТЫЕ идеи (сапер, крестики-нолики, карточные игры, etc.) и переходить к чему-нибудь получше. Успехов во всех начинаниях
__________________
Good luck & Have fun


 
XProger ©   (2005-09-13 14:23) [8]

Servelat, хорошо сказал! :)


 
MeF Dei Corvi ©   (2005-09-13 15:13) [9]


> http://mirgames.ru/files/samples/sample1.zip

Правильнее, http://mirgames.ru/download.php?id=de325bf179c01aebec46f769583e205a


 
netboy   (2005-09-13 19:09) [10]

> Вообще большего отстоя чем этот "движок" в жизне не встречал, по доброте душевной предлагаю альтернативу в 100 раз лучше (если надо конечно ;) http://dronprogs.mirgames.ru/files/Sources/MT.rar (все есть + редактор карт ;)
Спасибо за предложение, но я пишу на DelphiX.



Страницы: 1 вся ветка

Форум: "Игры";
Текущий архив: 2006.03.19;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.013 c
2-1141461517
Viktop
2006-03-04 11:38
2006.03.19
Установка связи между таблиц (ADO)


2-1141034471
BaBayka007
2006-02-27 13:01
2006.03.19
Доброго всем дня....подскажите пожалуйста.....вроде делаю правиль


2-1141189028
Anton :-))
2006-03-01 07:57
2006.03.19
как определить по какому из объектов был нанесен удар мышью?


3-1138472788
H010d Freeze
2006-01-28 21:26
2006.03.19
Эксклюзивное соединение через ADO


2-1141455206
guru-ru
2006-03-04 09:53
2006.03.19
Многопоточность.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский