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

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

Насчет спрайтов в DelphiX [Delphi, DelphiX, Windows]


Страницы:   1 2

Рикитикитави ©   (2005-12-15 13:46:00) 

Тут игру делаю на подобии Кримсонленд. И незнаю как зделать что б монстр время от времени менял свое нaправление и шел не к игроку а в произвольную точку несколько секунд, а потом снова шел к игроку. Помогите плиз я новичек. Вот собсна код : webfile.ru/691999


Cash   (2005-12-23 21:42:00) [1]

Рикитикитави   (23.12.05 03:35) [23]:
П7 все за меня объяснил. Там у DxTimer в событии OnTimer
есть переменная LagCount, она - то, что тебе надо, для этого подсчета.
Только она целочисленная, поэтому на нее надо не умножать, а делить.

Рикитикитави   (23.12.05 04:42) [25]:
Но, вижу ты уже все сам понял! Это хорошо! :)

П7   (23.12.05 10:54) [26]:
Под тиком подразумевается 1 кадр.
В принципе да, и для DelphiX такое определение подходит,
но я всетаки под тиками имел ввиду количество перемещений.
То есть, в моем понимании, 100 раз за секунду вызывается Move,
стало быть 100 тиков - это одна секунда.
Это полезно, когда перемещения и отрисовка происходят не
последовательно.


П7   (2005-12-23 10:54:00) [2]

Смари, за каждый кадр у тебя проходит определённое время.
Если ты ты кадры не ограничиваешь, то все передвижения за кадр ты должен синхронизировать с этим временем.
Т.е. если у тебя юнит передвигается со скоростью 10 пикселей в секунду, а за кадр прошло 0.001 секунда (ну, к примеру), то юнита ты должен передвинуть на 10*0.001 пиксель. Т.е. получается, с какой бы скоростью не работала игра, юниты всё равно будут перемещаться с одной скоростью. В этом плане для координат (и прочих велечин) следует использовать тип Single. Для 2D его следует при рисовании округлить, чтобы у тебя изображение не плыло.
Если ограничить FPS игры, скажем, 30, то скорости, и прочие завязанные на времени характеристики, можно задавать уже не относительно времени, а относительно игровых тиков. Под тиком подразумевается 1 кадр.


Рикитикитави   (2005-12-23 04:42:00) [3]

АААА!!!! ПОЛУЧИЛОСЬ!!! ПАСИБА РЕБЯТА! ОСОБЕННО Cash !!!!!! АА КАК Я РАД!!


Рикитикитави   (2005-12-23 03:52:00) [4]

я тут сделал, но получается, что тики доходят до 100 со скоростью света :)

а как сделать чтоб тик увеличивался на 1 за каждую секунду?


Рикитикитави   (2005-12-23 03:35:00) [5]

2 Cash

ПЛИЗ ОБЬЯСНИ КАК ЭТО ВСЕ РАБОТАЕТ! АА!!! ХОЧУ ЗНАТЬ :)


Рикитикитави   (2005-12-23 03:05:00) [6]

Я че-то всеравно не пойму что за тики :( это как бы секунды?


Cash   (2005-12-18 17:42:00) [7]

Рикитикитави   (18.12.05 13:59) [20]:
а если я 50 монстров зразу сосздаю не через конструктор, а массивом
Так, а это еще что такое? А говоришь - умеешь! :)))
Ну что значит: "Не через конструктор"? А как их еще можно создавать? ;)

var
 P: array [0..255] of TMonster;
 i: integer;
begin
 i:=0;
 while i < 256 do begin
   P[i] := TMonster.Create(MainSprite);
 end;
end;

"Create(aParent: TSprite)" - этож и есть конструктор.

А теперь вернемся обратно! (к вопросу)

если вызовешь написанный тобой код в
TMainForm.OnCreate(Sender: TObject),то получится, что ты
Create(aParent); берешь и вызываешь у предкаTForm, то
есть (по моему) конструктор TCustomForm!
Это не дело!
Да и где ты тики (Ticks) возьмешь у самой формы?

Табеж четко и ясно показанно, как это надо делать! :)


Рикитикитави   (2005-12-18 13:59:00) [8]

2Cash сенк ща буду разбираться :)

ну у меня же в игре созданны классы знач умею :)

кстати пару вопросов

а если я 50 монстров зразу сосздаю не через конструктор, а массивом, то
inherited Create(aParent);
Ticks := 0;

можно вставить сюда?

 for I := 0 to 49 do
   begin
     monster[I] := Tkozel.Create(DXSpriteEngine1.Engine);
     monster[I].Image := DXImageList3.Items.Find('mniz');
     monster[I].Width := kozel[I].Image.Width;
     monster[I].Height := kozel[I].Image.Height;
     monster[I].Z := 2;
      monster[I].X := -100000000;
      monster[I].Y := DXDraw1.Height - 50000000;

       monster [I].AnimCount :=8;
       monster[I].AnimLooped := True;
       monster[i].AnimSpeed:=15/1000;

inherited Create(aParent);
Ticks := 0;

   end;

и второй вопрос

что такое эти тики и что такое imageindex?


Cash   (2005-12-18 09:57:00) [9]

Рикитикитави   (18.12.05 00:12) [16]:
Неее, это получается профанация процесса создания игры.
А вот если сумеешь выкрамсать то, что надо из тестового кода, то это
и будет некоторое обучение.
Смотри:

Type
 TMonster = class(TImageSprite)
   Private
     Ticks: integer;
   Protected
     Procedure DoMove(MoveCount: Integer); override;
   Public
     Constructor Create(AParent: TSprite); override;
 end;

implementation

Constructor TMonster.Create(AParent: TSprite);
begin
 inherited Create(aParent);
 Ticks := 0;
end;

Procedure TMonster.DoMove(MoveCount: Integer);
begin
 if Ticks > 100 then begin
   ImageIndex:=ImageIndex+1;
   Ticks:=0;
 end else inc(Ticks);
end;


В свеье такого вопроса и далее следующих постов
на мой взгляд уместен вопрос (у меня сомнения закрались)!
Товарищь Рикитикитави, а ты классысоздавать умеешь?


Рикитикитави   (2005-12-18 01:36:00) [10]

Шутю! :)


П7   (2005-12-18 01:05:00) [11]

Больше так не шути!


Рикитикитави   (2005-12-18 00:12:00) [12]

Ребяты вы можете тут выложить код моей игры с готовым процессом изменения пути монстров (только плиз опишите мне все что добавили, БУДУ ОЧЕНЬ РАД И ПРИЗНАТЕЛЕН :)))) )


Cash   (2005-12-17 14:55:00) [13]

П7   (16.12.05 03:03) [5]:
COOL!!! :) Вот это сила!!! Надо нашим преподам посоветовать
таким псевдокодом пользоваться, а то задолбали юзать Си-Паскальского
синтаксического мутанта. :)))

А может Рикитикитави просто использует в качестве "курить"
или "место_для_курения" глобальные переменные?

Рикитикитави   (17.12.05 12:50) [13]:
Можно! но не таймер, а счетчик "тиков".
Юзаем DelphiX?, тогда, если не ошибаюсь, там процедуры называеются
"DoMove(MoveCount: Integer)" и "DoDraw;". (else поправьте)
В своем классе, в разделе "Private" прописываем переменную "TickCount",
которую обнуляем в конструкторе этого класса. Возми любой
целочисленный тип. А в процедуре "DoMove" перед ее "end;"-ом впиши
"inc(TickCount);". Типа это увеличене тиков. И еще, в той же процедуре,
там, где надо пропиши, мол "если TickCount больше чем надо, тогда
делаем то, что задумали и TickCoun:=0;". Вот тебе и внутренний таймер
для каждого монстряка из этого класса.


П7   (2005-12-17 13:44:00) [14]

Не понял. (:
Видимо у нас разные понятия слова таймер.
Поройся тут, мож чего интересного найдёшь. (:
http://reijii.mirg.ru/?id=1&ind=1


Рикитикитави   (2005-12-17 12:50:00) [15]

А можно, не используя таймера, как-то в коде создать таймер для каждого монстряка?


П7   (2005-12-17 07:05:00) [16]

У тебя же класс монстра один? Вот и создай параметры класса. Класс же потом будет для всех монстров использоваться? Так и получится для каждого монстра свои параметры.


Рикитикитави   (2005-12-16 23:00:00) [17]

Эта типо каждому монстру параметра курить надо обьявить когда клас сойдаешь после privat?


П7   (2005-12-16 14:25:00) [18]


> megabyte-ceercop ©   (16.12.05 14:24) [9]

Ну, это само собой разумеется.


megabyte-ceercop   (2005-12-16 14:24:00) [19]

Каждому монстру свой параметр КУРИТЬ а не один на всех.

> :) пардон, не удержался


П7   (2005-12-16 14:20:00) [20]

1. Монстров можно создавать асинхронно.
2. ВРЕМЯ_КУРИТЬ и ВРЕМЯ_УБИВАТЬ может быть в разное время разным. Что добавит асинхронности в действия монстров.

Для реализации подойдёт обычный random. Стоит только немного подумать и всё решаемо. (:


Страницы:   1 2

Наверх

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