![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
DelphiX - Рождение и смерть спрайтов. [Delphi, Windows]
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 );