Форум: "Игры";
Текущий архив: 2006.09.10;
Скачать: [xml.tar.bz2];
ВнизНасчет спрайтов в 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;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.052 c