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

Вниз

Прошу потестировать cyborgengine2d   Найти похожие ветки 

 
cyborg ©   (2004-09-11 09:35) [0]

Прошу потестировать на скорость спрайтовый движок 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-11 09:47) [1]

Танчики без исходников.

Если кого заинтересует этот движок, в дальнейшем планирую выложить на сайте, описание и пример только нужно будет нарисовать.

Умеет:
Легко программировать с его помощью.
Инициализация и закрытие одной строчкой.
Встроенный объектный менеджер на record-ах, обработка объектов самим движком или вашей программой, доступ ко всем объектам.
Автоматическое восстановление поверхностей (из BMP файла, пользовательской поверхности, шрифта).
Создание спрайтов из BMP-файлов (8,24 бит), пользовательский спрайт, спрайт шрифта (создание спрайта с текстом или создание спрайта шрифта с последующим выводом текста этим шрифтом).
Обработка мышки и клавиатуры с помощью DirectInput - нажатие, отжатие клавиши, прокрутка колёсика мышки, получение имени нажатой клавиши, получение состояния нажатых Shift, Ctrl, Alt.

Ещё может чего забыл :)


 
cyborg ©   (2004-09-11 09:51) [2]

Работало во Фрипаскале и в Дельфи.
Но, на прошлой неделе вносил дополнения, вожможны глюки с Дельфи, потом проверю как нибудь.

Приведу список функций чего есть, так сказать возможности:

//Инициализация, вызывается перед началом использования библиотеки:
//AppWndHandleRes - Возвращаемый идентификатор созданного окна
//ScreenWidth - ширина экрана
//ScreenHeight - высота экрана
//ScreenBitDepth - глубина цвета (8, 16, 24, 32)
//RefreshRate - частота обновления монитора (0 - по умолчанию, или: 60, 75, 85, 100 и т.д.)
//VSinc - Учитывать видеосинхронизацию при рендеринге
//FPS - Требуемое кол-во кадров в секунду
Procedure CyborgEngineInit (Var AppWndHandleRes : Cardinal; ScreenWidth, ScreenHeight, ScreenBitDepth, RefreshRate : Cardinal; Fullscreen : Longbool; VSinc : LongBool; FPS : Cardinal); StdCall;

//Освобождение ресурсов, вызывается после окончания работы с библиотекой:
Procedure CyborgEngineDeInit; StdCall;

//Обновить информацию о нажатых клавишах:
Procedure CyborgEngineReadDirectInputData; StdCall;

//Отобразить объекты на экране:
Procedure CyborgEngineRender; StdCall;

TYPE
 TProcessProgramFunc = function : Boolean;
//Обработка сообщений окна программы и выполнение функции ProcessProgramProc
//которая должна вернуть флаг выхода из цикла, если True, то цикл завершается
//ProcessProgramFunc - это адрес вашей главной функции программы в которой
//обрабатываются объекты всей игры в цикле. В этой функции нужно вызывать
//процедуры CyborgEngineReadDirectInputData и CyborgEngineRender:
Procedure CyborgEngineProcessWindowsMessages(ProcessProgramFunc : TProcessProgramFunc); StdCall;

TYPE
 TKeyEvent        = procedure(key : cardinal); StdCall;
 TMouseShellEvent = procedure(Val : LongInt); StdCall;
//Процедуры устанавливающие обработчики событий нажатых клавиш:
Procedure SetEventKeyDown (Proc : TKeyEvent); StdCall;
Procedure SetEventKeyUp (Proc : TKeyEvent); StdCall;
Procedure SetEventMouseDown (Proc : TKeyEvent); StdCall;
Procedure SetEventMouseUp (Proc : TKeyEvent); StdCall;
Procedure SetEventMouseShell (Proc : TMouseShellEvent); StdCall;

//Функция ыозвращает состояние нажатых кнопок мышки (от 0 до 7):
Function MousePressed (Button : Cardinal) : LongBool; StdCall;
//Функции возвращающие состояние нажатых специальных клавиш:
Function ShiftPressed : LongBool; StdCall;
Function CtrlPressed : LongBool; StdCall;
Function AltPressed : LongBool; StdCall;

//Процедура возвращает координаты мышки:
Procedure GetMouseCoord(Var X,Y : Longint); StdCall;

//Процедура возвращает название нажатой клавиши:
Procedure GetKeyName(Var KeyName : String; Key : Byte); StdCall;

//Упаковка фрагментированной видеопамяти:
Procedure CompactVidMem; StdCall;

//Процедура получения параметров движка:
Procedure GetSystemData(Var GetFPS : Extended; Var GetNumSprites, GetNumSurfaces : Longint; Var VideoMem, VideoMemFree : Cardinal; Var GetRenderAllTime, GetRenderTime : int64); StdCall;
//Вкл/выключение показа FPS (системной информации) по координатам X,Y, Enable-вкл/выкл:
Procedure CyborgEngineShowFPS(X,Y : Cardinal; Enable : LongBool); StdCall;

//Смещение координат экрана для вывода спрайтов с учётом смещения:
Procedure SetScreenOffset(OfsX,OfsY : Longint); StdCall;
//Процедура устанавливает пользователь скую вызываемую функцию при рендеринге:
TYPE
 TRendererProcProcess = Procedure;
Procedure SetRendererProc(Proc : TRendererProcProcess); StdCall;
//Процедура очищения экрана:
Procedure ClearScreen(Color : Cardinal; Surface : Pointer); StdCall;
//Процедура очищения прямоугольной области экрана:
//Rect - указатель на структуру TRect
Procedure ClearRect(Color : Cardinal; Rect : PRect; Surface : Pointer); StdCall;
//Создание данных поверхности:
Function CreateSurfaceFromBMPFile(VideoMemory : LongBool; Transparent : LongBool; ColorKey : Cardinal; BMPFileName : PChar) : Pointer; StdCall;
TYPE
 TSurfaceUserFillProc = Procedure (Var Surface : Pointer); StdCall;
Procedure CreateSurfaceUser(Var Surface : Pointer; W,H : Cardinal; VideoMemory : LongBool; Transparent : LongBool; ColorKey : Cardinal; SurfaceUserFillProc : TSurfaceUserFillProc); StdCall;
//Создание текстовой поверхности:
Procedure CreateSurfaceText(Var Surface : Pointer; VideoMemory : LongBool; Transparent : LongBool; FontSize, TextColor, BackColor : Cardinal; FontName : PChar; Text : PChar; Bold, Italic, Underline : LongBool); StdCall;
//Создание поверхности шрифта:
Procedure CreateSurfaceFont(Var Surface : Pointer; VideoMemory : LongBool; Transparent : LongBool; FontSize, TextColor, BackColor : Cardinal; FontName : PChar; Bold, Italic, Underline : LongBool); StdCall;

//Освобождает загруженную графику поверхности:
Procedure ReleaseSurface(Var Surface : Pointer); StdCall;
//Освобождает ресурсы занимаемые поверхностью:
Procedure FreeSurface(Var Surface : Pointer); StdCall;
//Установить цветовой ключ из указанной точки X,Y поверхности:
Procedure SetColorKeyXY(Var Surface : Pointer; X,Y : Longint); StdCall;
//Отобразить на экране спрайт:
Procedure ShowSprite(Var Sprite : PSprite; Surface : Pointer); StdCall;
Procedure ShowSpriteFast(Var Sprite : PSprite; Surface : Pointer); StdCall;
//Отобразить на экране цепочку со спрайтами:
Procedure ShowChain(Chain : PChainSprite; Surface : Pointer); StdCall;
Procedure ShowChainFast(Chain : PChainSprite; Surface : Pointer); StdCall;

//Показать текст заданным шрифтом:
Procedure ShowText(Var FontSprite : PSprite; Surface : Pointer; X,Y : Longint; Const Text : PChar; UseScreenOfset : LongBool); StdCall;

//МЕНЕДЖЕР СПРАЙТОВ/ОБЪЕКТОВ:
//Создание спрайта:
//Chain - Указатель на цепочку объектов/спрайтов, куда нужно добавить
//DataSize - размер дополнительных данных, если требуются или = 0, если не нужно
Function CreateSprite(Chain : PChainSprite; DataSize : Longint) : PSprite; StdCall;
//Удаление спрайта из цепочки
Procedure DelSprite(Var Sprite : PSprite); StdCall;
//Процедура освобождения объектов/спрайтов в указанной цупочке:
Procedure ClearChain(Chain : PChainSprite); StdCall;
//Функция возвращает значение счётчика кол-ва всех созданных спрайтов/объектов:
Function GetNumSprites : Longint; StdCall;


 
NikeOLD ©   (2004-09-11 10:58) [3]

Резюме можно заключить в одно слово, а именно: переделывай!
Машина Intel PIII 550/64MB/Riva TNT2 Ultra 16MB/DX 9.0b/Win98

При отключенной вертикальной синхронизации:
В меню 295 FPS
В игре 246-248 FPS, но! Все движется слишком быстро, просто летает.

Включена синхронизация:
В меню 60 FPS
В игре 33 FPS, модели двигаются с нормальной скоростью.

На 95 протестировать возможности не представилось :(. Работать будет, вопрос в скорости. У тебя многовато поверхностей для карточек с 1-4 метрами, особенно если эти поверхности большие (сравнимы с первичной по размерам, но не больше (иначе вообще не будет работать).


 
cyborg ©   (2004-09-11 14:33) [4]


> Все движется слишком быстро, просто летает.

Оно так и должно, игра на 33 кадра рассчитана.


> У тебя многовато поверхностей

Что в видео не влезает, то в оперативке создаётся.


 
Just3r   (2004-09-11 17:34) [5]

При отключенной задержке (nowait.bat) игра выдает 480fps в среднем.
AthlonXP-2500, 128mb FX5200


 
cyborg ©   (2004-09-11 17:37) [6]


> [5] Just3r   (11.09.04 17:34)

Виндовс какой забыл написать? ;)
Чего-то маловато, винамп наверное играл? :)


 
Ландграф Павел ©   (2004-09-11 18:57) [7]

Just3r>???
на моем AthlonXP-1800+, 64mb GF4MX440, 256DDR 835 fps в игре, в меню 1042


 
Sapersky   (2004-09-11 22:44) [8]

Меню - 560 FPS, игра - примерно 440 FPS.
CPU Celeron 500, 256Mb, GF2MX400(200/150) 64 Mb, DirectX8.1, Win98.

И, кстати, не надо наезжать на интегрированные карты. Если говорить об интеловских чипсетах (начиная с i810), то там стоят вполне себе ускорители, которые неплохо тянут игры уровня Quake 2, MDK 2, MechWarrior 3 - по современным меркам не ахти, но всё же гораздо круче, чем спрайтовые танчики :)


 
Magikan ©   (2004-09-12 05:05) [9]

При отключенной синхронизации:
в меню 1000 фпс, в игре 758 фпс
При включеной:
и в меню и в игре 33 фпс

Duron 1200, 256 Mb DDR, GeForce FX5200 64Mb, DirectX9.0b, WinXP


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

Ни у кого нету компьютеров со слабыми видеокартами чтоли? :)
У других игр жаловались, что у них видео плохое, поэтому не играет, а тут одни гефорсы да ривы, нашёлся бы кто с 2-4 мегабайтовой карточкой :)


 
бобомен   (2004-09-12 09:25) [11]

во лоло взял скорость к фыпсам прописал...


 
cyborg ©   (2004-09-12 09:26) [12]


> [11] бобомен   (12.09.04 09:25)

Чего?


 
бобомен   (2004-09-12 09:31) [13]

криво сделано. попробуй написать нормальное что нибудь


 
cyborg ©   (2004-09-12 09:40) [14]


> криво сделано.

В чём это заключается? Что понимается под "нормально"?


 
бобомен   (2004-09-12 09:51) [15]

может тебе "Война и Мир" пересказать?, короче купи книжку а лучше на курсы запишшись, доморощенные "специалисты" сакс...


 
NikeOLD ©   (2004-09-12 10:47) [16]

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


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

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


 
Servelat ©   (2004-09-12 12:18) [18]

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

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


 
Sapersky   (2004-09-12 12:37) [19]

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

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

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

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

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

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


 
MANGOL   (2004-09-12 12:40) [20]

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

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


 
MANGOL   (2004-09-12 12:42) [21]

а, забыл: win98


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

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


 
Mihey_temporary ©   (2004-09-12 13:40) [23]


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


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


 
cyborg ©   (2004-09-12 14:21) [24]

> [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 битовые.


 
cyborg ©   (2004-09-12 16:50) [25]

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

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

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

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

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

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


 
cyborg ©   (2004-09-12 16:52) [26]


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

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


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

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


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

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


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


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

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

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

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

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

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


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

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


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

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


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


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


 
cyborg ©   (2004-09-14 08:39) [31]


> [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), можно будет писать и читать из поверхности, а там уже сможете сами и прозрачность делать и вращать и чего угодно.


 
cyborg ©   (2004-09-14 08:56) [32]

Для работы с множеством объектов, появляющихся динамически, такие как пули, взрывы, частицы и прочее, исполььзуем "цепочки" - 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 09:02) [33]

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

Var
 Button1,Button2,Button3 : boolean;

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


 
cyborg ©   (2004-09-14 09:06) [34]

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


 
cyborg ©   (2004-09-14 09:19) [35]

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

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

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


 
cyborg ©   (2004-09-14 09:20) [36]

UseScreenOfset можно использовать для прокручиваемой карты, и соответственного рисования объектов с учётом смещения.


 
cyborg ©   (2004-09-14 09:30) [37]


> А то с установкой событий и писанием процедур их обработки,
> писать становится не удобно.

Наоборт это очень удобно ;)
Для меню ставим один обработчик, для игры другой.

Например нужно в рекордах сделать ввод имени:
1) Ставим обработик нажатий клавиш на обработчик сцены рекордов.
2) Если игрок побил рекорд, то ставим обработчик на функцию ввода имени в строку
3) Исли в обработчике ввода имени нажали Enter, то записываем введённое имя в рекорды и устанавливаем обработчик сцены рекордов.

Так же при выходи из процесса игры:
1) В игре нажали ESCAPE
2) ставим обработчик запроса на выход
3) если нажали ESCAPE - отмену, то возвращаем обработчик игры
  если нажали ENTER, то выходим из текущей сцены

Только не забывайте при изменении сцен все обработчики нажатий обнулять:
 SetEventKeyDown (@EventProcessKeyDownDummy); //Тут, например, обработчик выхода из программы по нажатию ESC
 SetEventKeyDown   (nil);
 SetEventKeyUp     (nil);
 SetEventMouseDown (nil);
 SetEventMouseUp   (nil);
 SetEventMouseShell(nil);

иначе у вас будет вызываться старые обработчики другой сцены :)


 
NikeOLD ©   (2004-09-14 09:33) [38]


> cyborg ©   (14.09.04 09:20) [36]

Я движок не смотрел, некогда, но вопрос, у тебя как, я понял, каждый спрайт на своей поверхности? Зря это, лучше бы на одной...


 
cyborg ©   (2004-09-14 09:39) [39]


>  [38] NikeOLD ©   (14.09.04 09:33)

Ты неправильно понял, мухи отдельно, котлеты отдельно.


 
Magikan ©   (2004-09-14 10:50) [40]

Что-то до боли знакомая ситуация с обработчиками событий...
Верное решение. Одобряю ;)


 
Колбасьев ©   (2004-09-14 20:41) [41]


> > [28] Servelat ©   (13.09.04 18:00)
> Почти всё, что ты написал, там есть :)
> И тайлы и анимации, только это нужно делать ВАМ!
> Если бы я сделал всё в движке, то о движке как таковом небыло
> бы и речи, я ведь не знаю какой формат хранения спрайтов
> вам понадобится и как кадры будут в нём расположены, как
> у меня - кадры горизонтально и направления вертикально (танк
> например так в игре сделан) или как-то по другому.


Хочу заметить, что DirectX например поддерживает .X файлы (думаю известный факт) - которые являются более-менее сбалансированными в плане объем-скорость_загрузки-функциональность. Для подавляющего большинства задач этого хватает. А написанные "свои" форматы часто являются дописками к .X.

Но DX - это даже не движок в данном понимании этого слова. Движки пишуться над ним.

Поэтому пару советов, уважаемый cyborg:
1. Лучше сделать какой-то универсальный формат хранения спрайтов + поставлять функции (и программу) для преобразования из BMP, например, в него. Остальные функции библиотеки будут с ним работать.

2. Добавить дополнительное "место" в спрайт для хранения разной информации - очень хорошо придумано. Но правильней этого бы не делать, так как для организации объектов игры можно использовать список(массив)-запись (создаваемую программистом игры), где один из полей - спрайт. Тогда работ по указателю будет меньше, как и приобразований типов, что возможно на Си выглядит и неплохо, но в Delphi - уродует код (с моей точки зрения - я всегда стораюсь написать элегантней и поменьше).

3. Вот все это и будет движок. А так больше похоже на оболочки для функций API DX сгруппированные по 2 по 3. Несильно помогает, так как все приходиться делать самому, даже утомительные рутинные операции.

Желаю успехов в совершенствовании. Хочется видеть в этом более "мощьный" продукт.


 
Kind   (2004-09-14 21:47) [42]

ATHLON 600; RAM 384; TNT2 16MB
На WIN98 и ХР FPS в меню 550 в игре 427
На WIN2000 FPS равен refresh rate монитора

95 недавно удалил, а в 3.11 пробовать не стал :)


 
cyborg ©   (2004-09-15 08:52) [43]


>  [41] Колбасьев ©   (14.09.04 20:41)
> 1. Лучше сделать какой-то универсальный формат хранения спрайтов

Чем BMP не универсальный формат спрайта? Лбой редактор поддерживает этот формат.

По пункту 2 не правильная у тебя мысль, массивы зачем-то прилепить, видимо у тея никогда небыло задачи работать с множеством разных объектов и обрабатывать их. Это не сишные замашки - работать с данными, это рутинная работа программиста на любом языке ;). Если ты этого никогда не использовал, то попробуй поработать так, тебе понравится :).


> 3. ... так как все приходиться делать самому, даже утомительные
> рутинные операции.


Если ты возьмёшся за игру, с движком, у которого всё фиксировано - конкретный формат не дающий тебе ничего лишнего сделать, то через месяц-другой ты начнёшь плеваться, что не можешь сделать того-то и того-то, потому, что у тебя нет возможности использовать объект так, как тебе хочется. У меня же сделано так, что с объектом ты можешь делать всё, что тебе угодно. Единственные поля, которые нельзя трогать (изменять значения) в PSprite это Pred, Next, Chain, DataSize и Data, остальное рули как хочешь. На вывод спрайта влияют поля: X,Y,W,H и SrcRect остальные поля под твоё усмотрение, как хочешь их, так и используй.


 
cyborg ©   (2004-09-15 09:02) [44]

Кстати, картинки можно растягивать, в третьем примере замените:


 //Спрайт мышиного курсора:
 SpriteMouse :=CreateSpr(0,0,100,100, SurfaceMouse , nil, 0, false, lDown, false);
 SpriteMouse^.W:=200;
 SpriteMouse^.H:=200;


и

 //Отобразить спрайт мышки:
 ShowSprite(SpriteMouse, nil);


 
cyborg ©   (2004-09-15 09:05) [45]


> [44] cyborg ©   (15.09.04 09:02)

Только пока с этим глюки имеются, если спрайт за границу экрана уходит, то размеры меняются :). На данный момент так можно фон на весь экран растягивать.


 
cyborg ©   (2004-09-15 09:12) [46]


> [43] cyborg ©   (15.09.04 08:52)
> На вывод спрайта влияют поля: X,Y,W,H и SrcRect

Забыл UseScreenOfset ещё в этот список добавить


 
Magikan ©   (2004-09-15 10:19) [47]

Даешь исходники в массы!!!


 
cyborg ©   (2004-09-15 10:21) [48]


> [47] Magikan ©   (15.09.04 10:19)

Header-ом обойдёшься :)
Нужны исходники - собирай: статьи на моём сайте+исходники RoboWarz+фантазия ;)


 
MANGOL   (2004-09-15 11:20) [49]

а шо за RoboWarz?


 
cyborg ©   (2004-09-15 11:25) [50]

http://robowarz.cyborghome.ru/


 
Darthman ©   (2004-09-15 12:21) [51]

>>Header-ом обойдёшься :)
Тоже стыдно за свои каляки-маляки? Потому и прячешь, угадал? :)))))

Если по существу:
Помимо функции заменяющей три обычные - можно же сделать дополнительно функции и классы позволяющие быстро все сделать, может быть и с большими ограничениями. Иногда это удобнее.


 
Micah'GF ©   (2004-09-16 14:33) [52]

- запускалась она у меня несколько длительно ~30сек. Думаю это не нормально.
- сделай чтобы клавиши обрабатывались исключительно. Т.е. в винде у меня назначено несколько комбинаций клавиш, связанных с Ctrl и стрелками, и при нажатии комбинации в игре все просто встает. При попытке переключиться в другую задачу или закрыть по Alt-F4 выдает "Приложение выполнило недопустимую операцию".
- поиграть так и не удалось.

WinXP, p4-2.4, 512, GF4-Ti4200


 
cyborg ©   (2004-09-16 14:37) [53]

Нарисовал полноценный пример, игра "Мухи", типа той, что на денди была, пуляешь там летающие объекты. В примере: создание и обработка сцен "Меню", "О программе" и "Игра"; анимация объектов и динамическая работа с ними - противник, пули, взрывы. Выстрелы противника делать не стал, лень, хватит выстрелов игрока, противнику также делать, как и игроку, там даже функцию создания пульки противника сделал.

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

ftp://cyborghome.ru/CyborgEngine2D/CyborgEngine2D.zip
166 килобайт

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

В архиве есть скомпилированный пример "Мухи" на Дельфи и на Фрипаскале, почувствуйте разницу ;), кроме размера ничем не отличается. Люди переходите на Фрипаскаль! :)


 
cyborg ©   (2004-09-16 14:40) [54]


> [52] Micah"GF ©   (16.09.04 14:33)

Действительно ненормально :), на такой тачке 30 секунд запускаться, подозрения у меня, что ты там чего-то намутил :).


 
NikeOLD ©   (2004-09-16 17:09) [55]

Но AV по Alt+F4 это факт.
Устраняй!


 
cyborg ©   (2004-09-16 18:50) [56]


> [55] NikeOLD ©   (16.09.04 17:09)

Непонятно вообще мне, сейчас проверил в ХР переключаю по нескольку раз и в меню и в игре, всё нормально переключается. Загрузил Вин98, то же самое, всё нормально, даже скорость на 30% возросла. Позапускал "Мухи" из примера, попереключал туда сюда в меню, в игре, тоже всё работает и в Хр и в 98-ом.
Мистика :), может всё дело в интеловском процессоре!? :)

Micah"GF и NikeOLD проверьте пожалуйста в примере с мухами ([53] cyborg ©   (16.09.04 14:37)), если будет глючить, откомпилируйте с отладочной информацией, там может покажет где спотыкается.


 
NikeOLD ©   (2004-09-16 22:23) [57]

По твовое просьбе:
В 98 все ОК. Но ты же отрубил Alt+F4 (если нет, то у меня вообще не работает комбинация в твоей программе).
Переключение между задачами стабильно и работает. Правда после нескольких запусков, в один из запусков программа выдала ошибку DirectInput и красиво вылетела, но это единичный слчай.
Очень плохо, что запретил Ctrl+Alt+Del. Верни сочетание обратно. Вдруг что сглючит хрен твою прогу прррибьешь.

В остальном впечатление благоприятное.
FPS 33, только в самом начале 50-60, а затем нормализуется.

Системные требования смотри мой первый пост


 
cyborg ©   (2004-09-17 09:26) [58]


> [57] NikeOLD ©   (16.09.04 22:23)

Сейчас в 98-ом опробовал, переключается :), ты не быстро нажимай Alt+Tab, а пол секунды подержи. Ну незнаю что такое там у вас. Джойстик есть? Может дрова видеокарты влияют на это, не знаю, компьютер у меня один, потестировать нормально не могу. Может и версия ДиректХ виновата, шут его знает. Ctrl+Alt+Del в 98 почему-то не работает, в ХР нормально с этим делом.

Товарищи у кого ещё нормально работают эти вещи и ненормально?


 
cyborg ©   (2004-09-17 09:29) [59]

Может какие нибудь клавиатурные шпионы у вас стоят, вирусы какие нибудь, трояны? Может "умный" переключатель раскладки установлен, ниндзя чтоли называется?


 
NikeOLD ©   (2004-09-17 12:54) [60]

Ничего лишнего не установлено.
Переключается по Alt-Tab нормально, просто ты не так понял, может я не так выразился.
А вот C+A+D не работает. Компилироавл твои примеры, там тоже все ОК, кроме C+A+D. Может и впрямь 9.0 Direct с 98 виндой парит (глубоко сомневаюсь), тестить надо, а не на чем? DDSCL_ALLOWREBOOT точно выставил? У меня XP нет, может там оно по умолчанию системой перехватывается.

Джойстика нету и вообще это для геймеров с компами выше :(-

На дрова видюхи не жалуюсь.


 
cyborg ©   (2004-09-17 18:13) [61]


> [60] NikeOLD ©   (17.09.04 12:54)

Про ALT+F4 это я не о том подумал, почему-то мне показалось, что вы про Alt+Tab говорите. :)


 
cyborg ©   (2004-09-18 17:01) [62]

Танчики я убрал, кто опоздал, тот не успел :), кому интересно смотрите [53] cyborg ©   (16.09.04 14:37)


 
NikeOLD ©   (2004-09-19 10:58) [63]

Если мне память не изменяет, то какое-то время назад Майкрософт настучала по головам нерадивым разработчикам, блокирующим Alt+F4 в программах, в т.ч. и в играх. Верните комбинацию назад и протестируй на предмет глюков. И Ctrl+Alt+Del тоже.


 
cyborg ©   (2004-09-19 11:06) [64]


> [63] NikeOLD ©   (19.09.04 10:58)

Видимо тебе память изменяет, это отключение предусмотрено самим Микрософт. Выключил специально, и назад не верну, нечего игры по ALt+F4 закрывать! Ctrl+Alt+Del уже включил, на винте лежит :). Если тебе захочется сделать иру чтобы закрывалась, обрабатывай эту комбинацию и закрывай свою игру корректно.


 
cyborg ©   (2004-09-19 15:13) [65]

Подправил немного.
Ctrl+Alt+Del  включил, инициализацию немного доработал - режим работы Software/Hardware, ошибку при инициализации должно корректно обрабатывать.

http://www.cyborghome.ru/index.php?&id=sources

ftp://cyborghome.ru/CyborgEngine2D/CyborgEngine2D.zip
167 килобайт.


 
NikeOLD ©   (2004-09-19 18:34) [66]

>>Видимо тебе память изменяет, это отключение предусмотрено самим Микрософт.

Не изменяет, но именно после этого она и настучала по головам за использование. Не знаю, чем они это мотивировали, но лично меня сильно раздражает, что нельзя выйти из игры быстро, а надо пройти несколько меню, отвечая на дурацкие вопросы (частень ко по многу раз: "Хотети ли выйти?". Так и хочется взять молоток и по голове разработчика постучать.). Иногда игру надо прекратить мгновенно и  Alt+F4 единственный к этому сопособ.

Дело хозяйское, конечно... Я лишь рекомендовал его, но Ctrl+Alt+Del - требование обязательное. Спасибо, что прислушался.


 
cyborg ©   (2004-09-20 08:45) [67]


> Не изменяет, но именно после этого она и настучала по головам
> за использование.

Кому, когда настучала? Не сышал такого. И счего это вдруг натучала? Обиделись чтоли, что не могли закрыть? Как-то смешно это звучит, что Микрософт ругает разработчиков игры :)
А хотите ли выйти на то и существует, чтобы случайно не выходили, иначе мат будет стоять вокруг при таком раскладе дел.


 
NikeOLD ©   (2004-09-20 09:22) [68]

Вот по Alt+F4 точно случайно из игры не выйдешь. Но если надо быстро (шеф идет!), то лучше не придумаешь. А пока из игры в главное меню, оттуда на выход, там еще один вопрос о выходе - запалят. :)


 
cyborg ©   (2004-09-20 09:31) [69]

В этом случае нужно Alt+Tab нажимать :)


 
Denis_Ac   (2004-09-20 10:48) [70]

Всё прочитать не успел... Но есть вопрос Твой движок использует какие средства (OpenGl? если да то какую версии библиотек)


 
cyborg ©   (2004-09-20 10:51) [71]


> [70] Denis_Ac   (20.09.04 10:48)

Нет. DirectX7 использует, не 3D, а 2D!


 
NikeOLD ©   (2004-09-20 16:12) [72]


> cyborg ©   (20.09.04 09:31) [69]

Если умничать, то по полной. А вдруг у меня единственное приложение - твоя игра, в этом случае Alt+Tab не прокатит. :)
Так что лично я выбираю Alt+F4 :) В смысле всегда добиваюсь, чтобы приложение вело себя как полноценное окно.


 
cyborg ©   (2004-09-20 16:55) [73]


> А вдруг у меня единственное приложение - твоя игра, в этом
> случае Alt+Tab не прокатит.

Почему не прокатит, прокатит. Что уж, твой начальник прям лезет в компьютер и смотрит чего у тебя там запущено? И вообще игры на работе не играют, поэтому твои притензии по поводу начальника не катят ;)


 
NikeOLD ©   (2004-09-20 18:12) [74]

дело хозяйское... ;)


 
Micah'GF ©   (2004-09-22 08:38) [75]

а помоему хотя бы на время разработки и тестирования Alt-F4 надо включить. А в идеале в файл настроек добавить ключ (или хотя бы ключ командной строки), который позволит разрешать эту комбинацию.



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

Форум: "Игры";
Текущий архив: 2005.01.09;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.71 MB
Время: 0.037 c
1-1103734425
SMT
2004-12-22 19:53
2005.01.09
Редактор ресурсного файла без ограничений на размер файла


6-1098204378
Pat
2004-10-19 20:46
2005.01.09
Расшаривание виртуального диска в Win2k с правами пользователя


9-1095646679
Jus
2004-09-20 06:17
2005.01.09
DelphiX и спрайты.


14-1103395533
Nic87
2004-12-18 21:45
2005.01.09
Сайт вырос


1-1103639617
Bobby Digital
2004-12-21 17:33
2005.01.09
Cursor





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