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

Вниз

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 вся ветка

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

Наверх





Память: 0.47 MB
Время: 0.043 c
2-1195905054
leonidus
2007-11-24 14:50
2007.12.23
Определение версии IE


2-1196229163
d@nger
2007-11-28 08:52
2007.12.23
Как узнать противоположный цвет?


15-1195910281
Vendict
2007-11-24 16:18
2007.12.23
Wide vs не-Wide 19"LCD


15-1195834916
@!!ex
2007-11-23 19:21
2007.12.23
НПЦ Спектр


15-1195899179
KilkennyCat
2007-11-24 13:12
2007.12.23
Заключение о профессиях и мечтаниях.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский