![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Хочу написать игру лоде-рунер(с редактором карт)на движке DelphiX [Delphi, delphiX, Windows]
Jus © (2004-09-21 06:10:00)Я вот хочу написать игру лоде-рунер (с редактором карт) на движке DelphiX.
Разрешение 800х600
Там каждый спрайт 32х32.
Карта 800х512, т.е. максимальное кол-во спрайтов на карте 400шт.
Я в Form1.Create вывожу эти спрайты по массиву.
(пример без массива):
procedure TForm1.FormCreate(Sender: TObject);
begin
TLestnica.Create(SE.Engine); // лестница
...и т д
end;
и FPSпадает до 0:((
в DXTimere у меня
procedure TForm1.DXTimerTimer(Sender: TObject; LagCount: Integer);
begin
IF not DXDraw.CanDraw Then exit;
DXDraw.Surface.Fill(0);
DXSpriteEngine.Move(1000 div 60);
DXSpriteEngine.Dead;
DXSpriteEngine.Draw;
With DXDraw.Surface.Canvas Do
Begin
Brush.Style := bsClear;
Font.Color := clWhite;
Font.Size := 8;
Textout(10, 10, 'FPS: ' + inttostr(DXTimer.FrameRate));
Release;
end;
DXDraw.Flip;
end;
1)Может для некоторых объектов которые нужно один раз вывести на экран отдельный DXSpriteEngine сделать, например
DXSpriteEngine 2, и не выводить в таймер DXSpriteEngine 2.Draw, а вывести при создании формы после создания всех объектов которые нужно вывести 1 раз?или так неполучится?:(
2)Или как оно делается правильно, ведь кроме лестниц и других объектов будут ещё и всякие монстры, которых надо "отображать" в таймере и FPS упадёт снова?
3)Как повысить FPS?!
Jus (2004-09-25 12:00:00) [101]
> Куда там 10 кнопок? Отсилы 6 нужно.
Кнопки:
основные:
1) влево
2) вправо
3) вниз
4) вверх
5) пробел - (прыжок(если в прыжке ещё раз пробел, то jetpack));
6) Ctrl - удар кувалдой по кирпичам (в направлении куда смотрит. Если рядом со стеной, то рушит стену, если рядом нет стены а на "земле" кирпич то пробивает землю.
Дополнительные:)
//ну кувалда, не кувалда, смотря какое оружие, предмет выбереш. Если шотган, то стрелять будет. Если телепорт - телепортируется.
7)8) Z,X по умолчанию удар кувалдой влево вправо.
9)10) [,] - менять оружие;
11) Tab - по умолчанию teleport (Есть порт из которого появляется игрок в начале, и когда погибает, туда он телепортируется тоже(тратится 1 батарейка);
12) F12 - самоуничтожение;
Может ещё забыл чё. Ну как тут 6 кнопками обойтись?
Зы: как сделать, чтоб можно было игроку расположение кнопок менять в меню? Например присвоить Button1 не пробел, а например Q?
cyborg (2004-09-25 10:44:00) [102]Кстати, разрешение экрана 1024х768 лучше сделай, чтобы много помещалось и красиво было.
cyborg (2004-09-25 10:39:00) [103]Посмотрим ;). Карту на одном экране делай, чтобы всё видно было, что, где и куда бежит.
Куда там 10 кнопок? Отсилы 6 нужно.
Jus (2004-09-24 23:22:00) [104]Вот незнаю как мне лучше сделать? Карту на одном экране, чтоб было видно всё или больше екрана, если больше то для двоих игроков надо буде экран делить (это помоему усложнит мою задачу!).
Jus (2004-09-24 23:19:00) [105]Ждите к на следующей неделе новую супер игру (скорее демо)"Не лоде рунер", так она и будет называтся! Сделано пока 25%. На "игрока" скажем, уделил свыше 50 разных спрайтов(на всякие там лесинки, ходьбу, приседание, удары и т.д), графику рисовал в паинте, хотел в кореле, но получилось лучше некуда. Уже все основные объекты готовы. Игра расчитывается на двоих, и в отличии от "лоде рунера" будет более интересней и играбельней. В игре будут "сюрпризы" - не скажу, ато будет не страшно:), Будет по задумке JetPac(кто незнает - реактивный ранец), а может нет, ещё не решил, но в демке точно небудет, и много интересного. Плюс редактор карт. Кнопок для игрока около 10 ито 6 основных.
Jus (2004-09-23 09:12:00) [106]Ура!!! теперь могу смело делать игру "Не ЛодеРунер"дальше!)
Jus (2004-09-23 09:11:00) [107]УРА!!! FPS=70 на экране 400 объектов! !!!(в смысле спрайтов)
Непонимаю, почему раньше так небыло, делал также, но не совсем.
Есть у меня пример программы (скачивал как-то), где при нажатии на Ctrl создаётся корабль в нижней части на всю ширину экрана, а при нажатии Enter создавались бомбы ТБомб которые падали с верху в низ и при колизион уничтожались( Всё при DXTimer.Interval:=0 >[ФПС=32 и меньше]).
И вот, я ползовался этим же Unit1.pas толко всё лишнее постирал из него и сделал как "заготовка" и писал в нем код. А щас создал всё по новой, и всё окей! Хотя тот код в "заготовке" ничем не отличается от моего!?:)
Jus (2004-09-23 06:13:00) [108]
> breakmaster © (22.09.04 21:32) [25]
> [20]
> назови ее "НЕ ЛодРанер"
Хорошая идея!!!) так и сделаю!
Jus (2004-09-23 06:10:00) [109]
> Omar2002 (23.09.04 00:00) [28]
> Да кстати - спрайты все 60х75 Могу кинуть для показа дему,
> если надо.
Да, если не трудно исходник.
Jus (2004-09-23 06:08:00) [110]
> Nox © (22.09.04 11:26) [24]
> Я сам занимаюсь D. еще мало и может чего не понял в вопросе...
> но попытаться помочь - стоило...
Я примерно так же и делаю.
Но всё равно спасибо!)
Omar2002 (2004-09-23 00:03:00) [111]Извиняюсь - ща пересчитал - примерно 700 спрайтов
Omar2002 (2004-09-23 00:00:00) [112]так у мя рисутся максимум один спрайт за раз, а остальные выводятся так:
dximagelist2.Items[22].Draw(Dxdraw1.Surface,X,Y,0)
И при этом при всем еще рисуются всякие примитивы(прямоугольники). FPS вобще не страдает - 56-59
Конфиг компа:
Athlon 800 512SDRAM GeForce FX 5200 - не так уж и модно на сегодняшний день. С другой видяхой - RivaTNT 2 Pro 16 Mb - у мя было в среднем 30 FPS.
Да кстати - спрайты все 60х75 Могу кинуть для показа дему, если надо.
Omar2002 (2004-09-22 23:53:00) [113]х3 Ну блин че за косяки. Я в своей гаме вывожу на экран примерно 1000 спрайтов, только немного не так
а вот так:
dxImageList1.Items[61].DrawRotateAlpha(DXDraw1.Surface,trunc(30*(XX-YY)+scx*60),trunc(15*(XX+YY)+scy*30),60,75,0,0 ,0,0,150+trunc(sqr(Anim1-18)/3))
Darthman (2004-09-22 23:31:00) [114]Что касается PowerDraw, то мой тебе совет использовать последнюю версию powerdraw 2 Deluxe. Она будет стабильнее и дх только 7-й требует.
breakmaster (2004-09-22 21:32:00) [115][20]
назови ее "НЕ ЛодРанер"
Nox (2004-09-22 11:26:00) [116]Не знаю, что это за игра, но как я понял, это, что-то типа аркады.
Когда я делал свою аркадку, я воспользовался таким "детским" методом:
1. В редакторе какрт создать уровень со всеми обьектами. Сохранить этот уровень как несколько массивов. Массивы 2-х мерные, х и у - координаты поля, а информация string - это какой обьект расположен в данном месте.( obj[x,y]:='stul').
2.После запуска карты, все обьекты прорисовываешь один раз, а потом по мере надобности изменяешь их местоположение и содержание по их личной бирке.
В таймере у тебя будут все механизмы перемещения обьектов, и что бы воспользоваться одним из способов перемещения какого либо обьекта ты должен будешь выполнить условия: что бы твои Х и У были равны х и у. После их выполнения идет задача параметров, типа - куда переместить, или что сделать...
Пример. если пуля летит в монстра, и когда ее Х и У(от * до *) равны х и у монстра, в таймере, так как выполнены были условия совпадения, проверяют, что это за мостр, и что он должен делать...
Я сам занимаюсь D. еще мало и может чего не понял в вопросе... но попытаться помочь - стоило...
Jus (2004-09-22 08:42:00) [117]Вот ещё такой вопрос всплыл по ходу. Где ФПС будет выше, если создать один и тот же Тобъект 5 раз, или создать 10 разных Тобъектов?(или без разницы)?
Jus (2004-09-22 07:58:00) [118]
> For i:=0 to 10 do begin
> enemy.free;
> end;
enemy [i].free;
извеняюсь,писал прям тут
Jus (2004-09-22 07:54:00) [119]Вот скажите мне пожалуйсто, правильно ли я вообще делаю?:
Type
Tenemy=class(...
procedure DoMove(...
procedure DoCollision(...
public
Constructor Create(...
end;
var
enemy:array[0..10] of TEnemy;
...
Constructor TEnemy.Create(...
begin
Inherited Create;
Image:=...
x:=..
....
end;
В Form1.OnCreate пишу создание enemy
(А можно ли создавать сдесь TEnemy? т.е. разницы нету(на скорость ФПС)? Я в одном примере увидел что объекты создаются в Form1.OnShow/!?/
var i:integer;
begin
Randomize;
For i:=0 to 10 do begin
enemy:=Tenemy.create(...);
enemy.x:=random(800);
enemy.y:=random(600);
end;
end;
В Dxtimer.onTimer всё нормально как и во всех примерах
В Form1.OnClose
For i:=0 to 10 do begin
enemy.free;
end;
Процедурыprocedure DoMove(...иprocedure DoCollision(...описывать не стану... незачем.
Если я правилно делаю, то почему же FPS падает, причём значительно? Если нет то где ошибка?
Jus (2004-09-21 10:03:00) [120]NikeOLD © (21.09.04 09:58) [19]
А это будет какбудто моя идея, похожая, а про Лоде-Рунер я не знал. и назову её "..."!(пока ещё не придумал. Блин, как назвать!
Игры нету, а название уже придумываю:))