Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2004.07.04;
Скачать: [xml.tar.bz2];

Вниз

Оцените игру - 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.04 c
14-1087159105
Oxy
2004-06-14 00:38
2004.07.04
Report


14-1087119364
GanibalLector
2004-06-13 13:36
2004.07.04
алгоритм Джонсона


3-1086330720
avgur
2004-06-04 10:32
2004.07.04
Помогите составить запрос.(я уже туплю)...


4-1085420501
notA
2004-05-24 21:41
2004.07.04
"описатель окна"(HWND)


6-1084189865
Ziay
2004-05-10 15:51
2004.07.04
Client and Server





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский