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

Вниз

Насчет спрайтов в DelphiX   Найти похожие ветки 

 
Рикитикитави   (2005-12-15 13:46) [0]

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


 
Рикитикитави   (2005-12-15 13:48) [1]

Ой забыл бекграунд убрать :( Если будет долго компилироваться, то ниче :)
И еще, монстры дергаются потому что если зделать чтоб они плавно шли, то тогда они наложатся друг на друга и получится как бы один спрайт а это не есть гуд :) Жду помощи, мастера!


 
Рикитикитави   (2005-12-15 22:47) [2]

Ну помогите, а? а то застопорился я на этой проблеме!


 
Signate ©   (2005-12-15 23:23) [3]

лично я ничего из выше сказанного не понял :)


 
Рикитикитави   (2005-12-16 02:50) [4]

2 Signate

ну смотри ты бегаешь чуваком, а на него постоянно бегут монстры. А мне надо чтоб они не постоянно бежали, а время от времени изменяли рандомно свое направление на пару секунд. Вот и все :) а я незнаю как такого сделать.


 
П7   (2005-12-16 03:03) [5]

Делаешь монстрам параметр - "курить"! (:
И параметр - "время".
И ещё - "место_для_курения".

если монстер.курить = пора тогда
вот
 топаем в монстер.место_для_курения
 монстер.время = монстер.время-время_апдейта
 если монстер.время < 0 тогда
   монстер.курить = покурили
   монстер.время = ВРЕМЯ_УБИВАТЬ
 усё
усё
иначе
вот
 топаем в ОБЪЕКТ_ДЛЯ_УБИЙСТВА
 монстер.время = монстер.время-время_апдейта
 если монстер.время < 0 тогда
   монстер.курить = пора
   монстер.место_для_курения = случайное_место_для_курения
   монстер.время = ВРЕМЯ_КУРИТЬ
 усё
усё


Вот тебе мега-псевдо-код. Если разберёшься.. (:


 
MonoLife   (2005-12-16 06:49) [6]

>П7[5]
Cool! :) пардон, не удержался


 
Рикитикитави   (2005-12-16 13:35) [7]

Не, я такое делал, но проблема в том, что монстры тогда в один момент все идут в случайном направлении а мне надо чтоб некоторые монстряки шли на игрока а некоторые шли курить:)


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

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

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


 
megabyte-ceercop ©   (2005-12-16 14:24) [9]

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

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


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


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

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


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

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


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

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


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

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


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

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


 
Cash ©   (2005-12-17 14:55) [15]

П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;". Вот тебе и внутренний таймер
для каждого монстряка из этого класса.


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

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


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

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


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

Шутю! :)


 
Cash ©   (2005-12-18 09:57) [19]

Рикитикитави   (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 13:59) [20]

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 17:42) [21]

Рикитикитави   (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-23 03:05) [22]

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


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

2 Cash

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


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

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

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


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

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


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

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


 
Cash ©   (2005-12-23 21:42) [27]

Рикитикитави   (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 тиков - это одна секунда.
Это полезно, когда перемещения и отрисовка происходят не
последовательно.



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

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

Наверх




Память: 0.54 MB
Время: 0.033 c
15-1155547420
Darkwing
2006-08-14 13:23
2006.09.10
Оценка труда программиста.


15-1155503710
Юрий Зотов
2006-08-14 01:15
2006.09.10
IFC Capital Group


3-1151580901
KygECHuK
2006-06-29 15:35
2006.09.10
Работа с ClientDataSet


2-1156140048
barakuda
2006-08-21 10:00
2006.09.10
Сложная выборка


15-1155117731
Аноним
2006-08-09 14:02
2006.09.10
Есть ли в Windows возможность использовать несколько мышей?