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

Вниз

Оцените игру - Tank Wars   Найти похожие ветки 

 
Servelat   (2004-03-08 21:18) [0]

Привет всем.
Собственно, зацените игру, пишется помаленьку уже четвертый месяц. Игра по мотивам старых добрых дендевских танков, хотя планируются улучшения. Не буду долго распространятся, а дам ссылку: www.tankwars.land.ru . Жду вашего мнения, сообщения о багах и т.п. Игра еще не закончена, хотя играть можно, скрины есть по ссылке выше.
ЗЫ Женскую половину мастеров (если такая имеется) - с их законным праздником!


 
Mihey ©   (2004-03-08 22:12) [1]

Сейчас заценим.


 
TButton ©   (2004-03-08 22:18) [2]

оценил. ниче так игра, тока динамичности не хватает, стены разламываются со второго попадания, танк еле ползает, стреляет тоже... вобщем ничего так игрушка.


 
Mihey ©   (2004-03-08 22:31) [3]

На DirectX 8.0 for Win 98 не пашет, не знаю, зачем Мелкософт оставил эту версию у себя на сайте.


 
Servelat   (2004-03-08 22:50) [4]

>танк еле ползает
Слишком медленно?
FPS должен быть 50, вроде скорость нормальная, если сделать быстрее, то танк будет быстро пересекать всю карту.
По поводу противников: нет ли у кого идей, как они должны ездить? (пока катаются на Random"е).


 
Mihey ©   (2004-03-08 23:00) [5]

>По поводу противников: нет ли у кого идей, как они должны ездить? (пока катаются на Random"е).

Тактика должна быть. Попробуй сделай wavepoints.


 
lyeh ©   (2004-03-09 00:20) [6]

2 Mihey ©
> Тактика должна быть. Попробуй сделай wavepoints.

Ты имел ввиду waypoints?


 
Servelat   (2004-03-09 07:51) [7]

>Тактика должна быть. Попробуй сделай wavepoints.
Это для каждой карты надо свои точки делать, по которым танк должен ездить? А при создании новых карт юзеру придется их самому придумавать? Я думаю, так не стоит делать.


 
cyborg ©   (2004-03-09 09:09) [8]

Не грузится сайт у меня.


 
Witcher ©   (2004-03-09 12:21) [9]

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


 
cyborg ©   (2004-03-09 12:22) [10]

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


 
Witcher ©   (2004-03-09 12:22) [11]

Ага, нашел... Точно торможу после праздников :-)


 
Servelat   (2004-03-09 14:27) [12]

>Дивижение оставь рендомные, но с уклоном вниз и вбок, вверх пусть реже ездит и не так часто меняй путь.
В принципе, и штаб, и танки могут появляться в любом месте карты (в редакторе карт нажав кнопку от 6 до 9 можно двигать танки, нажав "f" - штаб), поэтому необязательно вниз и вбок. Пока он вверх ездит действительно реже, но если врагов поместить внизу, а штаб и игрока сверху - будет не очень хорошо.
>Весьма неплохо, но лучше бы ты музыку туда не включал ;).
Неужели так плохо? Музыку можно отключить через файл data\config.cfg.


 
tim ©   (2004-03-09 15:02) [13]

Игру пока не смотрел, но фраза
"FPS должен быть 50..."
меня смутила, может сделать привязку к таймеру?
Когда-то я занимался написанием игрушки. У меня там вертолет летал с определенной скоростью, а FPS зависил от производительности машины. Если есть вопросы, можешь обратиться в мыло.


 
cyborg ©   (2004-03-09 15:17) [14]


> >Весьма неплохо, но лучше бы ты музыку туда не включал ;).
> Неужели так плохо?

Это зависит какая звуковая, большинство обычных очень плохо играют MIDI, сейчас поставил драйвер ямахи, стало более менее хорошо играть, а так один ужас.


 
Servelat   (2004-03-09 15:34) [15]

>Игру пока не смотрел, но фраза
"FPS должен быть 50..."
меня смутила

Ну это конечно не очень хорошо, по идее надо было сделать так: два таймера, один - с постоянной скоростью, для движения, другой с максимально возможной, для вывода на экран. Но я как-то не придумал, как сделать чтобы один таймер выполнялся ровно 50 раз в секунду, а другой - сколько вытянет видюха. Второй таймер "забивает" первый. Это наверно можно воплотить через потоки с разными приоритетами, но я пока решил не мудрить, а сделать основу игры.
>Если есть вопросы, можешь обратиться в мыло.
Было бы неплохо узнать методы решения этой проблемы.


 
Mihey ©   (2004-03-09 15:35) [16]

>Это для каждой карты надо свои точки делать, по которым танк должен ездить? А при создании новых карт юзеру придется их самому придумавать? Я думаю, так не стоит делать.

думаю стоит, ты ведь не супермастер, чтобы как в red alert сделать так сразу.


 
cyborg ©   (2004-03-09 16:31) [17]

Просто смотри в какой стороне от танка штаб, в том направлении и делай приоритет движения.


 
TButton ©   (2004-03-09 20:56) [18]

не совсем, смотри как далеко штаб и как далеко противник. и дуй к ближайшему.


 
NailMan ©   (2004-03-10 00:22) [19]

Servelat  
Ну это конечно не очень хорошо, по идее надо было сделать так: два таймера, один - с постоянной скоростью, для движения, другой с максимально возможной, для вывода на экран. Но я как-то не придумал, как сделать чтобы один таймер выполнялся ровно 50 раз в секунду, а другой - сколько вытянет видюха. Второй таймер "забивает" первый. Это наверно можно воплотить через потоки с разными приоритетами, но я
Все это чайниковские бредовые идеи, которые не могут быть реализованы так как...с отдельными потоками ты натрахаешься.

Вот тебе пример синхронизации по системному HighPerfomance счетчику(это не голимый gettickcount с его 18.2 Гц):

объявляем переменные:
var
TimerResolution : Int64;  //Разрешение одной секунды в
                          //HighPerfomance тиках
TimerMSecResolution : Cardinal;  
                          //Разрешение одной миллисекунды в HighPerfomance тиках


Процедура определения разрешения синхронизатора(ее вызывать только в начале игры):

Procedure CalcHPSyncResolution;
begin
QueryPerformanceCounter(z);
 Sleep(1000);
QueryPerformanceCounter(z2);
 TimerResolution:=z2 - z;
 TimerMSecResolution:= round(TimerResolution / 1000);
end;

Объявляем структуру синхронизатора:
TYPE
   TSyncronize = packed record
       LastHPC : Int64;       //Предыдущее значение счетчика
    TimeOffset : Cardinal;    //Время(в HP тиках) синхро-паузы
CorrMultiplier : Extended;    //коэффициент коррекции процесса
   End;


У Актера(игрового объекта) есть свойство Sync:TSyncronize; которое является его личным синхронизатором.

Функция задания задержки синхо-события:
Function SetSync(msecs:Cardinal):TSyncronize;
begin
QueryPerformanceCounter(result.LastHPC);
result.TimeOffset:=TimerMSecResolution * msecs;
Result.CorrMultiplier:=1;
end;


Функция проверки синхро-события:

Function CheckSync(Var Sync:TSyncronize):boolean;
var tickcount,subtraction:int64;
begin
result:=false;
QueryPerformanceCounter(Tickcount);
subtraction:=tickcount - Sync.LastHPC;

//если наступило время срабатывания, то вычисляем коэффициент,
//и даем добро(заодно и деление на ноль пресекаем).
If subtraction>=Sync.TimeOffset then
 begin
  If Sync.TimeOffset=0 then  Sync.CorrMultiplier:=1 else
  Sync.CorrMultiplier:=subtraction / (Sync.TimeOffset);
  result:=true;
 end;
end;


Метод движка который выполняет обработку игровых объектов и игрока:

Procedure TGameEngine.Processing;
var i:integer;
begin
i:=0;
repeat
 Actor[i].Processing
until i=TotalActors;
 UTPlayer.Processing
end;


Теперь как организован игровой цикл:

Procedure TGameEngine.CocpitMode;
var e:integer;
begin
REPEAT
//если вы юзаете формы, то эта строка вам не нужна
if PeekMessage(Msg,Handle,0,0,PM_REMOVE) then begin TranslateMessage(Msg);DispatchMessage(Msg);end;

 //читаем данные от игрока
 ReadInputCocpitMode;
 //обрабатываем все что связано с игровыми объектами
 Processing;
//понятно чего делаем
Dev.BeginScene;
  Scene.Render(False);
Dev.EndScene;
//даем добро на переключение страниц(D3D) и инкрементируем счетчик фпс-ов
Dev.Present(nil, nil, 0, nil);
Inc(FPSCounter);
//до тех пор пока не произойдет одно из этих событий
UNTIL status.ProcStatus in[STAT_EXITCODE,STAT_RESTART, STAT_SCREENSHOT];
end;


Ну и как собсно использовать персональный синхронизатор:

Procedure TActor.Processing;
begin
if CheckSync(Sync) then
BEGIN
 ...
 //что-то делаем важное с актером(скажем задаем ему скорости,
 //анимируем его части, проверяем коллизии и т.д.
 //например...:

    world.ANGV.x:=MoveCaps.YawAngularVelocity * Sync.CorrMultiplier;
    world.ANGV.y:=MoveCaps.PitchAngularVelocity * Sync.CorrMultiplier;
    world.ANGV.z:=MoveCaps.RollAngularVelocity * Sync.CorrMultiplier;
   //Например задаем ему угловые скорости, но с поправкой,
   //которая будет корректировать изменения координат
   //(скоростей) в случае отклонений заданного времени
   //синхро-паузы от фактически прошедшего времени с момента
   //создания синхро. Другими словами "растягивать" движение,
   //если тачка тормозит, и не допускать черезчур быстрой
   //скорости движения при очень быстрой тачке, т.е синхронизировать.

 MoveTo;  //двигаем наконец-таки актера
 Sync:=SetSync(20); //задаем ему задержку в 20 мсек,
                    //когда он будет в следующий раз
                    //проводить все вышеперечисленные
                    //действия.
END;
end;


Таким образом все активные участники сцены(Актеры и Игрок) будут синхронизированы с машинным временем(но е с собой ессно).

Единственное условие(желательное) чтобы Актеры и Игрок начинали свое действие в разное время секунды. Т.е скажем при создании сцены(создании актеров и  игрока) им надо задавать в первый раз SetSync в разные моменты текущей секунды времени. Таким образом нагрузка на проц(при обработке актера и игрока) будет более равномерной по времени и не будет возникать лагов(на дохлых тачках в основном это будет хоть как-то заметно невооруженным взглядом).


 
NailMan ©   (2004-03-10 00:26) [20]

Забыл дописать что в CalcHPSyncResolution
z и z2 - это мусорные int64


 
Mihey ©   (2004-03-10 00:45) [21]

2 NailMan:

Очень классно! Я похожее делал на уровне синхронизации с событием отрисовки, но не на таком уровне. Спасибо за код.


 
Servelat ©   (2004-03-10 15:55) [22]

Добавил патч, реализующий интеллект по методу cyborg"а, с уклоном в сторону штаба:

http://www.tankwars.land.ru/patch.exe

>TButton ©   (09.03.04 20:56) [18]
>не совсем, смотри как далеко штаб и как далеко противник. и дуй к ближайшему.

Тут есть свои ньюансы: как считать расстояние до штаба? если по-прямой, то возможно к штабу ехать намного дольше, чем к игроку (если их разделяет стенка, штаб как-будто рядом, а на самом деле ехать долго). Считать алгоритмом (типа A* ) намного сложнее, и использовать результаты будет менее удобно (большие мучения, а результат вряд ли превзойдет рендом). В общем, еще есть над чем подумать.

>NailMan ©   (10.03.04 00:22) [19]

Огромное спасибо за способ, попробую его воплотить в ближайшее время.



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

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

Наверх




Память: 0.53 MB
Время: 0.025 c
3-1086860530
menja_zovut_deniska
2004-06-10 13:42
2004.07.04
Работа с OracleNavigator


3-1086695303
white
2004-06-08 15:48
2004.07.04
Посоветуйте какой компонент подойдёт...


3-1086676693
ROMshtain
2004-06-08 10:38
2004.07.04
как работать с Oracle


1-1087820428
zep
2004-06-21 16:20
2004.07.04
StringGrid


14-1087197245
Baks
2004-06-14 11:14
2004.07.04
интересный ролик в формате Mpeg