![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Создание игры. [Delphi, Windows]
Zak3D[@Tm] © (2004-01-04 17:22:00)Всем присет. Мастера, вот какая просьба у меня есть к вам. Я только учусь програмировать(пол года, три раза в недель по два часа), мне очено хочется создать игру, чтоб машинка ехала вперёд и объезжала препятствия и другие машины. Вот в чем вопрос, что для этого лучше использовать(Image или мож на канве формы рисовать...), что бы игра работала побыстрее и ещё вопрос, как сделать счётчик fps. Всем заранее спасибо.
ЗЫ Игру буду делать на Седьмой Делфи.
Zak3D[@Tm] (2004-01-08 15:42:00) [1]Мастера, помогите советом, сегодня начал добавлять к игре меню опции и заставку, всё было нормально, никаких ошибок не выскакивало, но машина(Image1) перестала ездить. Подробнее, сначала я добавил две формы(одну для заставки, а другую для меню), потом назначил главной форму с заставкой т.к. я не знаю как сделать, чтобы сначала проигрывался ролик, потом появлялось меню настроек и только потом игра(что не делал, всегда сначала игра появляется или вобше ошибки выдаёт), собственно после этого рисунок и замер. Помогите пожалуйста советом, если не тяжело...
Ермак (2004-01-07 13:33:00) [2]Насчет fps... Компонент таймера сам тормозит, поскольку работает по сообщению, которое винда посылает окну. А если окно в это время рисует? Что тогда? Правильно, торомозит. Надо юзать ВинАПИ всегда и везде. Там есть таймеры уровня ядра - эти работают с точностью до 20 мс. Но не влезая в дебри, деалем вот что:
uses Windows;
а дальше GetTickCount - возвращает число милисекунд, прошедших с начала запуска системы.
То есть:
Var time: cardinal;
fps: real;
...
begin
...
time := GetTickCount;
...Здесь мы рисуем очередной кадр...
time := GetTickCount - time; //А здесь посчитали, сколько милисекунд ушло на кадр.
fps := 1000 / time; //Поскольку в секунде тысяча милисекунд...
...Выводим куда-нить ФПС...
end
Если хочешь писать игрушки, изучи сначала хоть немного Виндоус, а затем путь один - ДиректХ. А компоненты для ДиректХ не используй никогда. Вообще все, что можно писать через стандартные процедуры Виндоус пиши только так. Другого пути для программиста нет.
Рекомендую:
Краснов М. DirectX графика в проектах Delphi.
Финогенов. Win32 - Основы программирования.
Дж.Рихтер. Программирование Win32 для профессионалов.
Правда, первые две книжки на СИ, но у Финогенова Си с нуля объясняется. В любом случае Си чуть-чуть нужно знать, на уровне уметь перевести с Си на Паскаль. А вообще два языка абсолютно идентичны, так что привыкать надо и к тому и к другому.
Zak3D[@Tm] (2004-01-05 16:25:00) [3]Да, спасибо, хотя я это уже на соседнем обсуждении нашёл. Кстати помогает.
Thor (2004-01-05 15:55:00) [4]Положим на Form.Create нужно написать DoubleBuffered:=True;
Zak3D[@Tm] (2004-01-05 14:28:00) [5]Короче решил я шас сделать игру на простом делфи, но вот возник вопрос, как избавиться от мерщиния?
Thor (2004-01-05 12:47:00) [6]
> Omar2002 © (04.01.04 23:30) [15]
ну не знаю.
меня лично такая скорость не устроила. особенно когда много объектов имеется. конечно, довольно удобный спрайтовый движок для тех кто свой еще не в силах сделать, но вот работа с альфой и, например, поворотами спрайтов там плохо сделана. лучше тогда сразу учиться на PowerDraw. Примеров там достаточно :)
Zak3D[@Tm] (2004-01-05 10:22:00) [7]Ладно Omar2002, так и сделаю. Спасибо. Farcaller библиотеку тоже ща скачаю, посмотрю, чт там.
Omar2002 (2004-01-04 23:30:00) [8]
> Zak3D[@Tm] © (04.01.04 22:38) [12]
> Ладно.
Пиши на Дельыиксах. Это как раз вариант для спрайтовой графики наиболее оптимальный в соотношении сложность\скорость.
А про DelphiX документацию можешь найти либо на DelphiGFX, либо на Геймдеве.
TButton (2004-01-04 23:18:00) [9]ну это как посмотреть ОГЛ работает одинаково плохо на всех платформах, директХ чутка по лучше, но только на виндах
Farcaller (2004-01-04 22:58:00) [10]А я бы посоветовал не лезть в дебри GUI'шные. А посоветовал бы библиотеку SDL ( http://www.delphi-jedi.org/Jedi:TEAM_SDL_HOME). IMHO полезнее будет. Я и сам раньше на GLScene сидел (ДиректХ не юзаю, так как пишу софт и под винду и под линух).
Zak3D[@Tm] (2004-01-04 22:38:00) [11]Ладно.
TButton (2004-01-04 22:36:00) [12]я разницы особой не вижу.
Zak3D[@Tm] (2004-01-04 21:46:00) [13]Да... Ладно, спасибо вам за помошь, как сделаю игру олязательно вам рассажу. Если что понадобится можете найти меня по аське 265627188, или написать на мыло.
ЗЫ и на последок такой вопрос, всётаки как лучше на канде рисовать, или можь в Паинт боксе, или просто Имейджем обойтись?
Ещё раз спасибо, удачного всем програминга...:)
TButton (2004-01-04 21:35:00) [14]да, а я те посоветую как начнешь разбираться средненько с уклоном в сторону хорошо, не изучай компонентов изучай чистый директ - х.. а то привыкнешь к компонентам, потом тяжело бует.
Thor (2004-01-04 21:28:00) [15]хе-хе...
в этом-то и заключается основной конфликт - на чем делать игру.
многие начинали с обычного Image. ну а потом переходили на DirectX, OpenGL. если хочешь научиться делать игры, то сначала сделай свою игру на обычных имаджах. а потом уже изучай другие компоненты, коих немало. лично я сейчас на PowerDraw Deluxe учусь :)
Zak3D[@Tm] (2004-01-04 21:22:00) [16]Всё, нормально работает, но если сделать как ты сказал Timer1.interval=100, то fps=10 если Timer1.interval=1 то fps=64, почему так мало, всего-то 1 image с картинкой БТР'а гоняет с одного края формы на другую? Отсюда возникает вопрос, как увеличить fps или скорость таймера что ли??? А то Дум 3 35 fps, а у меня картинка на 10 fps гоняет... вопрос.
TButton (2004-01-04 21:21:00) [17]не за что
Zak3D[@Tm] (2004-01-04 21:05:00) [18]Нормально, ща будем делать. Спасибо!
Thor (2004-01-04 20:50:00) [19]
> Zak3D[@Tm] © (04.01.04 19:14) [3]
У тебя есть таймер при событии которого происходит отображение чего-либо на канву или имадж. Положим интервал у этого таймера 100 миллисекунд. Тебе нужно завести глобальную переменную frames: integer. При каждом событии твоего таймера (в котором у тебя происходит рисование), ты увеличивашь значение frames, иными словами сколько раз было отрисовано. заводишь у себя второй таймер. в нем интервал ставишь на 1 секунду. в событии этого нового таймера пишешь fps:=frames; frames:=0; и соответственно куда-нить выводишь это значение FPS, например на ту же канву. Таким образом получатся что ты каждую секунду смотришь, сколько тиков таймера-отрисовщика имело место. Это и будет твой FPS. ведь FPS - Frames Per Second, т.е. Кадров в секунду.
фуф. вроде все так объяснил.
Zak3D[@Tm] (2004-01-04 19:14:00) [20]Попробовал создать счётчик fps... не получилось, можно поподробней создание описать плз...