Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 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.044 c
2-1156338849
Gadenysh
2006-08-23 17:14
2006.09.10
упростить выражение


11-1132373168
XProger
2005-11-19 07:06
2006.09.10
try...except своими руками


15-1155471301
Desdechado
2006-08-13 16:15
2006.09.10
Что скажете о качестве дисков Omega


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


2-1156019232
md
2006-08-20 00:27
2006.09.10
обработка событий





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский