Форум: "Игры";
Текущий архив: 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.018 c