Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Прошу потестировать cyborgengine2d


Страницы:   1 2 3 4

cyborg ©   (2004-09-11 09:35:00) 

Прошу потестировать на скорость спрайтовый движок cyborgengine2d.dll.
Особенно интересует скорость на старых компьютерах и на плохих видеокарточках (встроенные или старые с 1-4 мегабайтами видеопамяти) с целью узнать минимальные системные требования.

Прошу над графикой не смеяться, она в паинте нарисована :). Игра Танчики.

http://www.cyborghome.ru/download/temp/thanchiki2.rar
230 килобайт.

Требования DirectX7 и выше, виндовс любая 32 битовая, интересно на вин 95 потестить, не знаю заработает ли.

Для максимального FPS запустите noWait.batили саму программу с любым параметром.

В меню нажать Enter для процеса игры. Escape - выход в меню или из программы.

В игре левая кнопка мышки - генерировать карту, правая - взорвать танки противника.

У меня в меню около 1000 FPS, в игре около 600 FPS.
CPU Duron 800, PC133 384Mb., GF FX5200 128 Mb. AGP4x, DirectX9, WinXP
Прошу написать подобные характеристики!


cyborg   (2004-09-14 09:19:00) [41]

Для вывода всей цепочки (списка) можно пользоваться функцией ShowChainFast(Chain : PChainSprite; Surface : Pointer);

Chain - адрес переменной цепочки(списка)
Surface - на какую поверхость выводить (nil - на экран)

Если спрайту установить флаг UseScreenOfset:=true, то спрайт будет выводиться со смещением установленным функцией SetScreenOffset(OfsX,OfsY : Longint);


cyborg   (2004-09-14 09:06:00) [42]

А функции ShiftPressed и подобные, введены для того, чтобы можно было печатать текст в разных регистрах или какие-то другие функции нажатых клавиш использовать.


cyborg   (2004-09-14 09:02:00) [43]

По поводу нажатых клавиш, создай переменные:

Var
 Button1,Button2,Button3 : boolean;

Затем в обработчиках ставь флаги, если, например, нажат пробел, то ставь Button1:=True; Если отжата, то Button1:=False; а в программе смотри if Button1 then ...


cyborg   (2004-09-14 08:56:00) [44]

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


VAR
 ChainBullets : TChainSprite;
 ChainExplosions : TChainSprite;

...

var
 Sprite : PSprite;
begin
 Sprite:=CreateSprite(@ChainBullets, 0);
 Sprite^.Surface:=BulletSurface; //Созданная поверхность, где хранится графика
 Sprite^.X:=10; //Координаты
 Sprite^.Y:=10;
 Sprite^.W:=5; //Ширина и высота объекта
 Sprite^.H:=5;
 SetRect(Sprite^.SrcRect,0,0,5,5); //Регион вывода спрайта из поверхности
end;

Далее пробегаемся по списку для обработки:

var
 Bullet : PSprite;
begin
 Bullet:=ChainBullets.Start;
 While Bullet<>nil do
 begin
   //Тут обрабатываем пулю (движение, коллизии, уничтожение);

   Bullet:=Bullet^.Next;
 end;
end;


Если спрайт в цепочке (списке), при удалении такого спрайта DelSprite(Var Sprite : PSprite); переменная Sprite будет содержать следующий за удалённым спрайт.

т.е. нам нужно проверять не помер ли объект, если помер, то удалим:

var
 Bullet : PSprite;
begin
 Bullet:=ChainBullets.Start;
 While Bullet<>nil do
 begin
   //Тут обрабатываем пулю (движение, коллизии, уничтожение);
   //Если объект помер (взорвался или улетел за экран), то ставим ему Sprite^.Dead:=True;

   //Тут удаляем умершие:
   if Bullet^.Dead then DelSprite(Bullet) else Bullet:=Bullet^.Next;
 end;
end;


cyborg   (2004-09-14 08:39:00) [45]


> [28] Servelat ©   (13.09.04 18:00)

Почти всё, что ты написал, там есть :)
И тайлы и анимации, только это нужно делать ВАМ!
Если бы я сделал всё в движке, то о движке как таковом небыло бы и речи, я ведь не знаю какой формат хранения спрайтов вам понадобится и как кадры будут в нём расположены, как у меня - кадры горизонтально и направления вертикально (танк например так в игре сделан) или как-то по другому.
Имеется флаг Animated, его устанавливаете, если есть анимация, потом про обработке своих объектов смотрите If Sprite^.Animated then выполнить функция анимации вашего объекта.

В структуре TSprite имеются основные значения, которые могут понадобиться, так сказать минимум парамтеров объекта, остальные параметры вы можете хранить по указателю DATA, там можете хранить всё что угодно, если при создании спрайта указать размер дополнительных данных, то она будет выделена, например, добавим объекту имя и координаты с плавающей точкой:


TYPE
 TMyData = Record
   Name : String[12];
   X,Y : Single;
 end;


Чтобы выделить память под эти данные при содании спрайта указываем размер дополнительных данных:


 Sprite:=CreateSprite(nil, SizeIOf(TMyData));


Для обращения к этим данным:


 TMyData(Sprite^.Data^).Name:='Buratino';
 TMyData(Sprite^.Data^).X:=5.8;
 TMyData(Sprite^.Data^).Y:=0.5;

или

 With TMyData(Sprite^.Data^) do
 begin
   Name:='Buratino';
   X:=5.8;
   Y:=0.5;
 end;

Затем в обработке, устанавливаем координаты спрайта на экране:

 Sprite^.X:=Trunc(TMyData(Sprite^.Data^).X);
 Sprite^.Y:=Trunc(TMyData(Sprite^.Data^).Y);


Для опознования вашего объекта используйте Sprite^.ObjType, специально для этих целей сделал.

Анимацию делайте с помощью изменения Sprite^.SrcRect, это и есть прямоугольный участок, который выводится на экран из поверхности.

Спрайты можно выводить не только на экран, но и на другие поверхности:
Procedure ShowSpriteFast(Var Sprite : PSprite; Surface : Pointer);
Если Surface=nil, то спрайт выводится на экран, если указать поверхность, созданную функциями CreateSurfaceХХХ(), то спрайт выведится на эту поверхность.

Для загрузки своей графики сделаю потом функцию Lock(Surface), можно будет писать и читать из поверхности, а там уже сможете сами и прозрачность делать и вращать и чего угодно.


Колбасьев   (2004-09-13 22:02:00) [46]

У меня таких "движков" 3-и штуки: DirectDraw - 2D, Direct3D - 3D, Direct3D - 2D. Но не в виде DLL, а как модуль: чтобы лишнего не таскать; и функции примерно те же.


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


Вот это точно надо, очень полезная функция.


Ландграф Павел   (2004-09-13 19:19:00) [47]

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


Servelat   (2004-09-13 18:00:00) [48]

Приготовьтесь, мой пост будет долгим :) .


>  //===============================//
>  //  Cyborg Graph Engine Library  //
>  //   autor: Osipov Eugene         //
>  //   http://www.cyborghome.ru/   //
>  //  Free for non commerce use!   //
>  //  v. 1.0.0.0 (17.04.2004)      //
>  //===============================//


Правильно писать "aut hor", хотя я бы сказал скорее "creator", "programmer", "made by" etc.

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

Во-первых, больше возможностей. Понятно, что здесь борьба идет с излишним весом dll'ки, однако она воплощает слишком мало того, чего хочется поиспользовать, как минимум надо: разбиение на тайлы (на кадры, если так лучше звучит), указал ширину/высоту тайла для поверхности и потом по номеру тайла чтобы можно было отрисовать нужный кусок картинки. А то там, если я правильно понял, там в TSprite введены флаг для анимации и т.п., и при этом написано, что координаты копирования картинки из Surface (Инициализировать при создании и изменять при анимации!), то есть вручную все делать надо. Тогда смысл пропадает создания библиотеки, если все на таком низком уровне. Кстати, доступа к более низкому уровню (то есть к объектам DirectDraw) я не обнаружил, не порядок! Дать все возможности DirectDraw народу, чтобы те экслюзивные действия, которые нужны именно моей программе можно было сделать ручками. Кстати, поворот и прозрачность (хоть и тормозная) тоже нужны, а то как без них?

Во-вторых, заменить кучи параметров некоторых процедур одним указателем на запись. Особенно тут отличилась GetSystemData. А если я тока количество свободной видеопамяти поглядеть хочу, так это мне придется кучу переменных заводить, значения которых мне не нужны? Нет уж, давай я тебе передаю указатель на какую-то структуру TCbrgSystemInfo, а ты её заполняешь значениями. А уж потом я проверю только то, что мне надо. Это же касается обработки клавы: Верни мне указатель на массив нажатых клавишь, и я посмотрю, что мне надо. А то с установкой событий и писанием процедур их обработки, писать становится не удобно. Либо просто позволить проверять, нажата ли клавиша (как в процедуре ShiftPressed, тока чтобы в качестве параметра - код клавиши).

В-третьих, хочу иметь возможность блитить поверхности друг на друга, а не только на экран. Доказывать, что это надо не буду, но уверен, что пригодится.

Это вроде все, что стоило бы воплотить в первую очередь, а потом уже дорабатывать по мелочам. Удачи!


Ландграф Павел   (2004-09-12 19:01:00) [49]

Сделал бы поддержку картинок с прозрачность (4 бита), хотя для 16 бит это не к чему=)


cyborg   (2004-09-12 16:52:00) [50]


> [25] cyborg ©   (12.09.04 16:50)

Забыл дописать: примеры тестировал во FreePascal 1.10 и Delphi 6, везде работает :)


cyborg   (2004-09-12 16:50:00) [51]

Нарисовал примеры.
Архив вместе с библиотекой:
ftp://cyborghome.ru/CyborgEngine2D/CyborgEngine2D.zip
56 килобайт

Там три примера:
1) Инициализация и очищение экрана/прямоугольной области
2) Вывод текста
3) Вывод спрайта

Это малая часть возможностей, для всех нужно целую справку писать :)

Если не понятны функции, в заголовочном файле написаны формат данных, и параметры функции, там комментарии расписывают. Если чего непонятно, то пишите ко мне - на форум моего сайта, или в эту ветку.

Библиотеку я постоянно дописываю, уже нехватает несколько возможностей, да и пара функций там уже лишняя.

Для компиляции вашего проекта нужно поместить в папку проекта файлы CyborgEngineHeader.pas и cyborgengine2d.dll


cyborg   (2004-09-12 14:21:00) [52]

> [23] Mihey_temporary ©   (12.09.04 13:40)
800x600x16 bit

> [22] бобомен   (12.09.04 12:56)
Тебя спросили какая скорость, а не нужна ли тебе игра и что ты о ней думаешь, оставь эти мнения при себе.

> [20] MANGOL   (12.09.04 12:40)
Можно хоть сейчас выложить, только примеров нет и он ещё не до конца сформирован, вношу функции по мере требования.

Ограничение:
Работает только с 16 битовыми режимами, отсюда не поддерживается оконный режим работы, так, как там различный разряд цвета может быть, только полноэкранные 16 битовые.


Mihey_temporary   (2004-09-12 13:40:00) [53]


> Особенно интересует скорость на старых компьютерах и на
> плохих видеокарточках (встроенные или старые с 1-4 мегабайтами
> видеопамяти) с целью узнать минимальные системные требования.


PII 450 Mhz, 64 Mb RAM, ATI Rage IIC AGP, Win 98 - 74 fps.
Вопрос: а какое разрешение экрана в игре?


бобомен   (2004-09-12 12:56:00) [54]

все схвачено, все оплачено. кому тока танчики левый нужны эти...


MANGOL   (2004-09-12 12:42:00) [55]

а, забыл: win98


MANGOL   (2004-09-12 12:40:00) [56]

FPS в игре 110 в меню 140
ПЭ-3 550 160 опэ, картачка интегрированная i810

ПЭЭС: када движок скачивать? :)


Sapersky   (2004-09-12 12:37:00) [57]

Мистер бобомен, вероятно, хотел сказать то же, что и я по поводу привязки скорости не к таймеру, а к FPS. Нмчего хорошего из этого не получилось.

Дык есть же режим с привязкой к таймеру. Привязка к FPS - это только для тестирования, неужто не понятно?
Хотя можно было привязывать к таймеру и измерять только время рендеринга (засекать время перед началом и в конце), а не время между кадрами.

Ни у кого нету компьютеров со слабыми видеокартами чтоли? :)

Где-то через месяц смогу протестировать на встроенной в i815 - но она не такая уж и слабая, как я писал. Хотя будет, конечно, медленнее, чем на GeForce, т.к. встроенные все поверхности создают в системной (не знаю точно, есть ли у них какая-то своя память... на некоторых пишут - 4 мб, но вроде только для буферов - первичной, бэкбуфера, Z-буфера).

У других игр жаловались, что у них видео плохое, поэтому не играет

Надо же. Что это за видео такое, что на нём DirectDraw не работает? Подумать страшно :)
Может, нужного DX не было (и/или драйверов), или ОС совсем старая (WinNT, Win95)?


Servelat   (2004-09-12 12:18:00) [58]

Комп:
AMD Athlon 1700+, 256 Mb, ATI Radeon 9600 SE, DirectX 9, WinXP.
FPS: меню - 720, игра - 570. При включенной синхронизации везде 33 (видимо, так и было задумано). К сожалению, слабый комп в данный момент тоже отсутствует :) .

2 bobomen & NikeOLD
Чей вы сразу лечить начинаете про привязки скорости к таймеру или еще к чему? Если вам надо намек на играбельность - врубайте с синхронизацией, а второй режим - чтобы засечь FPS в условиях, приближенных к реальным. Это же пример, чего же замечания у вас, как к игре? Простили тестить на скорость.


бобомен   (2004-09-12 10:58:00) [59]

Вы правы сэр, ну нельзя так делать и все тут...


NikeOLD   (2004-09-12 10:47:00) [60]

Мистер бобомен, вероятно, хотел сказать то же, что и я по поводу привязки скорости не к таймеру, а к FPS. Нмчего хорошего из этого не получилось.
На сайте Alawara есть игра FatMan. Так вот эта игра на моей машине (см.выше) работала нормально, а на ноутбуке Cel 2GGz и 16 метрами и видео (не помню в/карточку) игра летала так же, как твои Танчики. От крошечного нажатия кнопки курсора герой перемещался из одного конца экрана в другой. Ни о каких подъемах на лестницу и речи быть не могло.


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо