Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

DelphiX - Рождение и смерть спрайтов. [Delphi, Windows]


Страницы:   1 2

jab~ ©   (2004-02-13 15:17:00) 

За основу взял примерчик
DXSprites ( http://delphigfx.mastak.ru/samples/samp17.rar)

Добавил свой класс
 TDiablo = class(TImageSprite)
 private
   procedure SetAnim(AName : String);
   procedure SetAnimAngle;
   function  FinishStep : Boolean;
   function  FinishMove : Boolean;
   function  FinishFollow : Boolean;
   function  HitBy(ASprite : TDiablo) : Boolean;
   procedure Move;
 protected
   procedure DoDraw; override;
   procedure DoMove(MoveCount: Integer); override;
   procedure DoCollision(Sprite: TSprite; var Done: Boolean); override;
 public
   FDrawE : Boolean;
   FStatus     : TStatus; // Что делаем (идём, стоим, ...)
   FTarget     : TSprite; // Кого атакуем
   FEnergy,
   FAttackRadius,         // Радиус атаки
   FDestX,                // Координаты куда
   FDestY,                // прийти
   FMapX,                 // Координаты
   FMapY,                 // на карте
   FNextX,                // Координаты
   FNextY,                // следующей клетки
   FAngle,                // Угол вектора скорости
   FSpeed      : Integer; // Скорость спрайта
   FX,
   FY          : Double;
   constructor Create(AParent: TSprite); override;
   procedure SetDest(AX, AY : Integer);
   procedure SetTarget(ATarget : TSprite);
 end;

Ну естественно в маине для клика прописал:
procedure TMainForm.DXDrawMouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
// Когда я кликаю правой клавишей мыши
 If ssRight in Shift then
     If Selected<>nil then begin
           Target:=Nil;
           TCursor(MyCursor).Action:=aTarget;
           TCursor(MyCursor).Collision;
           If (Target=Nil) or (Target=Selected) then
             begin
               If Selected is TDiablo then TDiablo(Selected).SetDest(MouseMapX,MouseMapY);
               If Selected is THero then THero(Selected).SetDest(MouseMapX,MouseMapY);
             end Else
             begin
               If Selected is TDiablo then TDiablo(Selected).SetTarget(Target);
               If Selected is THero then THero(Selected).SetTarget(Target);
             end;
           Target:=Nil;
     end;
...
...

Сам класс TDiablo описал так же как и класс THero за исключением имен картинок подгружаемых (спарайтов)
Всё заработало практически сразу! У меня бегают 2 типа монстров и мочат друг друга, но вот незадача.. смерть монстра отображается не тем спрайтом. Смерть показывает именно тем кто убил, а не того кого убили...
Я думаю что нужно что то изменить в процедуре

function THero.HitBy(ASprite : THero) : Boolean;
begin
 FEnergy:=FEnergy - 1;
 If (FTarget=Nil) and (FStatus=stStop) Then SetTarget(ASprite);
 If FEnergy<0
   Then
     begin
       FStatus:=stDead;
       Collisioned:=False;
       SetAnim('Dead');
       Result:=True;
     end
   Else
     Result:=False;
end;

А начал менять то у меня ничего не вышло.... Может кто сможет помочь?


jab~   (2004-02-17 11:05:00) [21]

to m-AAA-d
Хм интересная идея... я об этом задумывался, но очень понимаю как этореализовать. В общем для полноты картины приведу кусок из проги:

// Загружаю карту
constructor TFlur.Create(AParent: TSprite; AX, AY : Integer);
var
 i, j          : Integer;
begin
 inherited Create(AParent);
 SetMapSize(AX,AY);
 Image := MainForm.ImageList.Items.Find('GFlur');
 X := 0;      // Начальная координата по иксу
 Y := 0;      // Начальная координата по игрику
 Z := -2;     // Глубина
 Width := MapWidth  * Image.Width;
 Height:= MapHeight * Image.Height;
//Случайное заполнение карты
 For i:=0 to AX-1 do
   For j:=0 to AY-1 do
     Chips[i,j]:=Random(20);
end;
, где TFlur = class(TBackgroundSprite)

В общем тут всё просто.. я случайным образом заполняю фон квадратиками 32х32 (спрайтами). Указываю размер карты AX, AY : Integer

В формкреате после загрузки картинок в имэдж лист у меня выполняется:
 Flur:=TFlur.Create(DXSpriteEngine.Engine,50,50);

А после я уже играюсь со спрайтами юнитов!
Посмертно классу юнита я присваиваю статус stDead и для всех классов имеющих этот статус отрабатывает следующее:
     begin
       SetAnimAngle;
       If Round(AnimPos)=AnimCount
         then begin
             AnimSpeed:=0;
             Z:=-1;
         end;
     end;
Это просто показываю последний спрайт из посмертного ролика!
Таким образом у меня разбросану по карте куча классов монстров которые показывают последнюю картинку их смерти.

Когда у меня накапливается некоторое колличество этих классов то у меня начинает жудко тормозить комп! (ведь они сидят в оперативке), а ещё я слышал о некой кривизне DXSpriteEngine который иногда проглючивает и меня выкидывает без предупреждения (но это если у меня "мертвых" спрайтов накапливается куча)
>>>>>>>>>>>>>
Как реализовать прорисовку посмертной картинки спрайта поверх фона(карты) TFlur или может есть другой способ?
>>>>>>>>>>>>>


nexxiss   (2004-02-16 11:36:00) [22]

Можно к тайлу добавить свойство с дополнительным изображением или какое другое свойство, по которому можно определить тип изображения для вывода поверх тайла


ZAROLF   (2004-02-16 11:05:00) [23]

>jab~   (16.02.04 09:28) [4]
> Что то не работает такая задержка...
> Попробывал вместо шортинтеджера влепить интеджер так вообще
> всё подвисать стало...
>

var speed:shortint;

If isButton5 in MainForm.DXInput.States Then
begin
if speed>0then Dec(speed);
if speed>0then Exit;
speed:=10; //задержка
//ну так точно должно заработать
with TThin.Create(DXSpriteEngine.Engine)do
begin
....
end;
end;

> Если им (классам) давать Dead по смертно, то тормозов нет,
> но классы умирают (и картинки тоже), а я бы хотел чтоб у
> меня на экране оставалась посмертная картина (куча трупов,
> кровище, оторванные конечности). Т.е. как рисовать на общий
> фон последний спрайт или может есть другой способ?
-----------------------------------------------------------------
Может тебе останавливать спрайт на последнем кадре(посмертный).


m-AAA-d   (2004-02-16 09:55:00) [24]

попробуй перед тем как удалишь спрайт убитого монстра получив его координаты и угол поворота нарисовать прямо на DXDraw.Surface соответствующий паттерн из DXImageCollection


jab~   (2004-02-16 09:28:00) [25]

Что то не работает такая задержка...
Попробывал вместо шортинтеджера влепить интеджер так вообще всё подвисать стало...

*************************
К слову:
Я начал использовать Random(10)
if random(10)=1 then
begin
Тут выполняется то что мне нужно задержать.
end
Такого рода задержка конечно полный абзац, но
работает и ничего не тормозит!
*************************

Есть вопрос:
В формкреате у меня происходит наполнение имэджлиста
 ImageList.Items[0].Picture.LoadFromFile('main\Flur.bmp');
 ImageList.Items[1].Picture.LoadFromFile('fatc\Go.bmp');
 ImageList.Items[2].Picture.LoadFromFile('fatc\Stand.bmp');
 ImageList.Items[3].Picture.LoadFromFile('fatc\Attack.bmp');
 ImageList.Items[4].Picture.LoadFromFile('fatc\Dead.bmp');
 ImageList.Items[6].Picture.LoadFromFile('main\Energy.bmp');
и т.д.
И наполнению этому нет конца и края...
Каким образом выводить картинку того что происходит лоадинг?

И ещё вопрос:
Когда у меня убивается монстр, то происходит смертельный ролик из спрайтов (он падает на землю весь окровавленный) и класс этого монстра принимает статус "sDead", но вот незадача... я нарубил груду монстров и у меня начинает тормозить комп по страшному так как у меня уже накопилась куча "мертвых" классов. Если им (классам) давать Dead по смертно, то тормозов нет, но классы умирают (и картинки тоже), а я бы хотел чтоб у меня на экране оставалась посмертная картина (куча трупов, кровище, оторванные конечности). Т.е. как рисовать на общий фон последний спрайт или может есть другой способ?


ZAROLF   (2004-02-13 18:25:00) [26]

jab~   (13.02.04 17:18) [2]
Ну тут понятно всё... создаётся класс. Вот только проблемка есть, как можно немного замедлить создание, а то я не успеваю нажать на кнопку как у меня вываливается груда монстров... если ставлю sleep() то уменя вся игра замирает... Это ведь й меня основной таймер... Может что подскажеш?
-----------------------------------------------------------------
var speed:shortint;

If isButton5 in MainForm.DXInput.States Then
begin
if speed>0then Dec(speed);
if speed>0then Exit;
speed:=10; //задержка
TThin.Create(DXSpriteEngine.Engine);
end;

Попробуй так.


jab~   (2004-02-13 17:18:00) [27]

ZAROLF
Уже в принципе разобрался...
Могу демку по почте выслать если интересно!?

И ещё проблемка..
Есть у меня в обработчике (таймер) такая штука

 If isButton5 in MainForm.DXInput.States
   Then
     begin
       TThin.Create(DXSpriteEngine.Engine);
     end;

Ну тут понятно всё... создаётся класс. Вот только проблемка есть, как можно немного замедлить создание, а то я не успеваю нажать на кнопку как у меня вываливается груда монстров... если ставлю sleep() то уменя вся игра замирает... Это ведь й меня основной таймер... Может что подскажеш?


ZAROLF   (2004-02-13 15:38:00) [28]

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


jab~   (2004-01-23 13:36:00) [29]

to nexxiss
Что то наверно не так, но у меня не получилось обьявить тип твоим способом...

Получилось так:
type
TGameState = (gs_Play, gs_Pause, gs_MainMenu, gs_InGameMenu, gs_Active );


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо