Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.12.23;
Скачать: CL | DM;

Вниз

DelphiX проблема   Найти похожие ветки 

 
Daiger   (2007-02-11 17:55) [0]

Я недавно начал изучать DelphiX...столкнулся с одной проблемкой. Вот представим что нас есть есть что - то типа похожее на игру , вид сверху...класс Стена...то бишь кирпичи из которой сделана карта. К примеру можно представить Танчики....вот и есть игрок...нужно чтобы игрок при столкновении тупо остался на месте..т.е. чтобы не проходил сквозь стену

Procedure TPlayer.DoCollision(Sprite: TSprite; Var Done: Boolean);
begin
if Sprite Is TStena then begin
что нужно прописать???


 
Vovan # 2   (2007-02-11 18:32) [1]

Надо написать, что происходит при столкновении.

http://old.mirgames.ru/article/delphix/collision.html
http://delphigamedev.com/tutorials/dxtut3c.htm


 
Daiger   (2007-02-11 20:20) [2]

Ну ты простой парень...я вот и спрашиваю...что..помоги...сам код забацать...там ведь па любому не много нужно написать...мне очень нравиться такая лаконичная команда dead была бы ещё для такого случая подобная..было бы прекрасно..


 
Vovan # 2   (2007-02-12 00:08) [3]

Например, так. В класс TPlayer добавляешь поле FHitWall. В DoMove прежде чем установить новые координаты, запоминаешь старые. Устанавливаешь FHitWall в False. Делаешь тест на столкновение.

procedure TPlayer.DoCollision(Sprite: TSprite; Var Done: Boolean);
begin
 if Sprite Is TStena then FHitWall := True;
end;

после теста в DoMove проверяешь: если FHitWall = True, то откатываешь к старым координатам.


 
Daiger   (2007-02-12 00:14) [4]

Напиши плиз,как объявить это поле....и вобще как и где координаты записывать...? можно просто код напиши....


 
Vovan # 2   (2007-02-12 14:35) [5]


class TMyPlayer(TSprite)
 ...
 FHitWall: Boolean;
 ...
 end;



procedure TPlayer.DoMove...
var oldX, oldY: Integer;
begin
 ...
end;


 
Daiger   (2007-02-12 15:42) [6]

Весёлая игра найди ошибку:
TPlayer = class(TImageSprite)
FHitWall: Boolean;
protected
Procedure DoCollision(Sprite: TSprite; Var Done: Boolean); Override;
Procedure DoMove(MoveCount: Integer); override;
public
 constructor Create(AParent: TSprite); override;
end;

TBlock = Class(TImageSprite)
    Procedure DoMove(MoveCount: Integer); Override;
   Procedure DoCollision(Sprite: TSprite; Var Done: Boolean); Override;
 Public
   Constructor Create(AParent: TSprite); Override;
 End;

Procedure TBlock.DoCollision(Sprite: TSprite; Var Done: Boolean);

Begin

end;

Procedure Tblock.DoMove(MoveCount: Integer);
Begin
 Inherited DoMove(MoveCount);
 Collision;

end;

constructor TPlayer.Create(AParent: TSprite);
begin
 inherited Create(AParent);
 Image := Form2.DXImageList1.Items.Find("player");
 X := 512;
 Y := 678;
 Z := 0;
 Width := Image.Width;
 Height := Image.Height;
 PixelCheck := True;
end;

Procedure TPlayer.domove(MoveCount: Integer);
var oldX, oldY: Integer;
begin

inherited DoMove(MoveCount);

collision;
if FHitWall = True then x:= oldx;
if FHitWall = True then y:= oldy;

if (isLeft in Form2.DXInput1.States) and (x>0) then x:=x-5;
if (isRight in Form2.DXInput1.States) and(x<1024-width) then x:=x+5;
if (isUp in Form2.DXInput1.States) and (y>0)  then y:=y-5;
if (isDown in Form2.DXInput1.States) and (y<768-height)  then y:=y+5;

end;

Procedure TTarelka.DoCollision(Sprite: TSprite; Var Done: Boolean);
begin

if Sprite Is TBlock then begin
FHitWall := True;



 
Vovan # 2   (2007-02-12 19:39) [7]


procedure TPlayer.domove(MoveCount: Integer);
var oldX, oldY: Integer;
begin
 inherited DoMove(MoveCount);

 oldX := X;
 oldY := Y;

 if (isLeft in Form2.DXInput1.States) and (x>0) then x:=x-5;
 if (isRight in Form2.DXInput1.States) and(x<1024-width) then x:=x+5;
 if (isUp in Form2.DXInput1.States) and (y>0)  then y:=y-5;
 if (isDown in Form2.DXInput1.States) and (y<768-height)  then y:=y+5;

 collision;
 if FHitWall = True then x:= oldx;
 if FHitWall = True then y:= oldy;
end;


 
Daiger   (2007-02-12 19:56) [8]

терь ему не нравиться
[Error] Unit2.pas(174): E2010 Incompatible types: "Integer" and "Double"


 
Vovan # 2   (2007-02-12 20:28) [9]

var oldX, oldY: Integer;  --->  var oldX, oldY: Double;


 
Daiger   (2007-02-12 21:50) [10]

ну это ладно я так и сделал....но теперь при столкновении с объектом просто и тупо прилипает к этому объкту и сё...


 
Vovan # 2   (2007-02-12 23:15) [11]

Так, а если перед  collision; написать:
FHitWall := False;


...
if (isDown in Form2.DXInput1.States) and (y<768-height)  then y:=y+5;

FHitWall := False;
collision;
if FHitWall = True then x:= oldx;
...


???


 
Daiger   (2007-02-12 23:58) [12]

Ну спасибо тебе огромное, За то что возился тут со мной....всё заработало..



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

Текущий архив: 2007.12.23;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.015 c
15-1195736070
Кот
2007-11-22 15:54
2007.12.23
css меню


15-1195584790
lookin
2007-11-20 21:53
2007.12.23
Песня хорошая


15-1195942892
KilkennyCat
2007-11-25 01:21
2007.12.23
Рерихи зажигают.


15-1195712208
NX
2007-11-22 09:16
2007.12.23
выручайте! какой загрузчик у висты


15-1195800245
KSergey
2007-11-23 09:44
2007.12.23
Пресловутый переход на висту