Главная страница
    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]

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



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

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

Наверх





Память: 0.6 MB
Время: 0.054 c
3-1102601051
Saska
2004-12-09 17:04
2005.01.09
Список ODBC источников.


3-1102584798
Malevia
2004-12-09 12:33
2005.01.09
Перемещение по датасету в DBGridEx


1-1103614176
M@D
2004-12-21 10:29
2005.01.09
Rename


1-1103615593
race1
2004-12-21 10:53
2005.01.09
перенос


14-1103457387
dr Tr0jan
2004-12-19 14:56
2005.01.09
Пищит монитор





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