Проблемы с реализацией проэкта на FPC

Темы, связанные с проектированием и программированием roguelike-игр

Модераторы: Sanja, Максим Кич

Аватара пользователя
Toth
Сообщения: 327
Зарегистрирован: 11 ноя 2009, 13:36
Откуда: Красноярск

Re: Проблемы с реализацией проэкта на FPC

Сообщение Toth » 03 авг 2012, 14:41

Я пробовал когда-то что-то подобное, с обёртками. Получилось громоздко и нехорошо.
Аналогично, причем именно с хге, но я еще и нуб в кодинге, так что, соснул по-полной.
А «шмапы» — это вообще кто?
http://ru.wikipedia.org/wiki/Shoot_'em_up

Аватара пользователя
Toth
Сообщения: 327
Зарегистрирован: 11 ноя 2009, 13:36
Откуда: Красноярск

Re: Проблемы с реализацией проэкта на FPC

Сообщение Toth » 03 авг 2012, 14:44

Вот эти ребята.
Успел же, хотя тут очень медленно все, молодец.

Аватара пользователя
Frolik
Сообщения: 624
Зарегистрирован: 08 мар 2011, 17:21

Re: Проблемы с реализацией проэкта на FPC

Сообщение Frolik » 03 авг 2012, 17:00

Если уж хочется какой-нибудь готовый графический движок, то можно взять первую версию DGLE. Там есть хедеры для делфи и для понимания вообще никакого навыков не нужно.
Для HGE тоже есть хедеры.

Аватара пользователя
Максим Кич
Администратор
Сообщения: 1642
Зарегистрирован: 03 дек 2006, 20:17
Откуда: Витебск, Беларусь
Контактная информация:

Re: Проблемы с реализацией проэкта на FPC

Сообщение Максим Кич » 03 авг 2012, 18:34

Frolik писал(а):Если уж хочется какой-нибудь готовый графический движок, то можно взять первую версию DGLE. Там есть хедеры для делфи и для понимания вообще никакого навыков не нужно.
Для HGE тоже есть хедеры.
Есть ещё примерно оттуда же такой движок как Omega Engine, в отличие от DGLE, полностью двухмерный. Вот тут можно скачать.
Dump the screen? [y/n]

Аватара пользователя
Максим Кич
Администратор
Сообщения: 1642
Зарегистрирован: 03 дек 2006, 20:17
Откуда: Витебск, Беларусь
Контактная информация:

Re: Проблемы с реализацией проэкта на FPC

Сообщение Максим Кич » 03 авг 2012, 19:27

А вот тут есть пример его применения… печальный :( Кстати, код можно взять. «Консоль» там уже реализована.
Dump the screen? [y/n]

Аватара пользователя
kipar
Сообщения: 2120
Зарегистрирован: 10 мар 2010, 13:16
Откуда: Москва

Re: Проблемы с реализацией проэкта на FPC

Сообщение kipar » 03 авг 2012, 22:51

Максим Кич писал(а):Есть ещё примерно оттуда же такой движок как Omega Engine, в отличие от DGLE, полностью двухмерный. Вот тут можно скачать.
Автор теперь делает ZenGL.
И ZenGL, кстати, очень рекомендую - настоящий кроссплатформенный движок для паскаля, поддерживает даже айфоны с андроидами. Да и с выводом текста там проблем нет (в комплекте есть утилита для генерации текстуры из произвольного шрифта).

Но я все-таки продолжаю считать это для чисто текстовой игры оверкиллом. У меня в RFRL вывод с помощью GDI (ну, TCanvas) занимает не больше 30мс, зато этот метод явно проще любого подключаемого движка.

Аватара пользователя
Максим Кич
Администратор
Сообщения: 1642
Зарегистрирован: 03 дек 2006, 20:17
Откуда: Витебск, Беларусь
Контактная информация:

Re: Проблемы с реализацией проэкта на FPC

Сообщение Максим Кич » 04 авг 2012, 12:46

kipar писал(а):
Максим Кич писал(а):Есть ещё примерно оттуда же такой движок как Omega Engine, в отличие от DGLE, полностью двухмерный. Вот тут можно скачать.
Автор теперь делает ZenGL.
И ZenGL, кстати, очень рекомендую - настоящий кроссплатформенный движок для паскаля, поддерживает даже айфоны с андроидами. Да и с выводом текста там проблем нет (в комплекте есть утилита для генерации текстуры из произвольного шрифта).
Спасибо! Интересная штука, надо будет посмотреть.
Dump the screen? [y/n]

Goofs
Сообщения: 9
Зарегистрирован: 13 мар 2012, 14:19
Откуда: Петрозаводск

Re: Проблемы с реализацией проэкта на FPC

Сообщение Goofs » 27 ноя 2012, 12:42

Очень жаль, что я немог сюда зайти по причине завала в процессе обучения :?

Тут вот какое дело: я столкнулся с проблемой в преобразовании моего генерируемого числового массива в объекты. Я решил не переписывать генератор поновой(3ий раз был бы лишним), а просто запихал его в модуль, и в интерфейсной части обявил тот самый массив. Проблема состояла в том, что объект занимает куда больше места в стеке, и массив этих объектов банально неумещялся в стек. Мне подсказали, что при таких громоздких размерах необходимо использовать указатели. С этим я вполне разобрался, но когда я начал расширять возможности своих объектов, то столкнулся с одной проблемой...

я объявил объекты вот так:

Код: Выделить всё

type Tchaotic:object //подобие абстрактного типа(на type abstract у меня почему то возникали ошибки).
icon:char;  //собственно символ
sign:string;//наименование объекта
end;

Type Tsolid:object(Tchaotic) //непроходимые тайлы
durablity,fertility:byte;  //прочность и плодородие тайла
dropitem:string;  //то, что выпадает после разрушения. пока не опишу item будет стрингом.
procedure init...;
end;
собственно, если обявить массив указателей на объекты типа Tchaotic то я немогу:
1)прочесть из полей типа Tsolid.
2)изменять один объект. меняются все разом(одного типа).

Вопросы:
1)стоит ли мне использовать наследование как таковое?
2)как я могу уменьшить размещяемый в стеке объём,и одновременно использовать возможность инициирования обектов при их записи в массив?
(если я использую указатели, то немогу инициировать объекты поновой, и изменять отдельный объект тоже, так как в сущности указатель хранит в себе только один объект, и если я его изменяю, то изменяются те, которые я нехотел менять)
3)Есть ли ещё какие нибудь способы уменьшения размеров памяти в стеке(или увеличение стека как таковое(хотя наврятли)).

Чую, что решение гдето рядом... но найти немогу :(
под спойлером весь код.
Скрытый текст: ПОКАЗАТЬ

Код: Выделить всё

Program GeoObjTest;
uses crt,keyboard,video,vidutil,GeomantUNI;

//GeomantUNI-выхлопом является массив b[1000,1000,100]of byte.
//процедура generate собственно создаёт массив b. 

type Pchaotic=^Tchaotic;
     Tchaotic=object
     icon:char;
     sign:string;
     Color,Bcolor:byte;
end;

type
    Psolid=^Tsolid;
    Tsolid=object (Tchaotic)
    durablity,fertility:byte;
    dropitem:string;
    procedure init(c,bc,dur,fert:byte; sig,dri:string;ico:char);
end;
type
    Pplane=^Tplane;
    Tplane=object (Tsolid)
    function Grassy(fert:byte):boolean;
    end;
procedure Tsolid.init(c,bc,dur,fert:byte;sig,dri:string;ico:char);
begin
     sign:=sig;
durablity:=dur;
 dropitem:=dri;
     icon:=ico;
    color:=c;
   Bcolor:=bc;
fertility:=fert;
end;

function Tplane.Grassy(fert:byte):boolean;
Begin
if fert>=5 then grassy:=true else grassy:=false;
End;

var map:array[0..1000,0..1000,0..100]of Pchaotic;
Tstone_granite,Tstone_hematite,Tstone_sandstone:Tsolid;
Tsoil_soil,Tsoil_clay,Tsoil_sand:Tsolid;
Pst_gr,Pst_he,Pst_ss:Psolid;
Pso_so,Pso_cl,Pso_sa:Psolid;
Tether:Tsolid;Pether:Psolid;
Tpl_gr,Tpl_ss:Tplane;
Ppl_gr,Ppl_ss:Pplane;
x,y,z,xi,yi,zi,k:integer;
BEGIN
//инициирование
Tstone_granite.init(8,7,10,0,'гранит','булыжник','#');
Tstone_hematite.init(4,7,15,0,'железо','руда','&');
Tstone_sandstone.init(6,8,7,1,'песчаник','песок','±');
new(Pst_gr);
new(Pst_he);
new(Pst_ss);
Pst_gr:=@Tstone_granite;
Pst_he:=@Tstone_hematite;
Pst_ss:=@Tstone_sandstone;

Tpl_gr.init(8,0,10,0,'Гранитный щебень','булыжник',',');
Tpl_ss.init(6,0,7,1,'Измельчённый песчаник','песок','~');
new(Ppl_gr);
new(Ppl_ss);
Ppl_gr:=@Tpl_gr;
Ppl_ss:=@Tpl_ss;

Tether.init(5,0,0,0,'эфир','---',' ');
new(Pether);
Pether:=@Tether;
//ввод
for z:=0 to maxh do
for y:=0 to 1000 do
for x:=0 to 1000 do begin
if random(1)=1 then Pether^.icon:='.' else Pether^.icon:=' ';
map[x,y,z]:=Pether; end;

generate;
  //преобразование в объекты
for z:=1 to maxh do
for y:=1 to 1000 do
for x:=1 to 1000 do
if b[x,y,z]=10 then map[x,y,z]:=Pst_ss;
  //размещение проходимых участков.
for z:=1 to maxh do
for y:=1 to 1000 do
for x:=1 to 1000 do
if (b[x,y,z+1]=10)and(b[x,y,z]=0) then map[x,y,z]:=Ppl_ss;
//вывод
clrscr;
xi:=200;
yi:=200;
zi:=50;
initvideo;
initkeyboard;
repeat
K:=translatekeyevent(getkeyevent);
case K of
4471 :dec(yi);
8051 :inc(yi);
7777 :dec(xi);
8292 :inc(xi);
8550:inc(zi);
4978:dec(zi);
end;

if yi<=0     then yi:=yi+1;
if xi<=0     then xi:=xi+1;
if yi>1000-30 then yi:=yi-1;
if xi>1000-70 then xi:=xi-1;
if zi>=100  then zi:=zi-1;
if zi<=0     then zi:=zi+1;

updatescreen(false);

for y:=1 to 20 do
for x:=1 to 40 do begin
textout(x,y,map[x+xi,y+yi,zi]^.icon,map[x+xi,y+yi,zi]^.color,map[x+xi,y+yi,zi]^.bcolor);
end;

delay(2);
updatescreen(true);
gotoxy(70,10);write(xi,' ',yi,' ',zi);
gotoxy(19,9);write('X');
gotoxy(42,12);write('имя ',map[x+xi-21,y+yi-11,zi]^.sign);
//gotoxy(42,13);write('прочность ',map[x+xi-21,y+yi-11,zi]^.durablity);
//gotoxy(42,14);write('выпадает ',map[x+xi-21,y+yi-11,zi]^.dropitem);
until k=4209;
END.

Аватара пользователя
Uvadzucumi
Сообщения: 365
Зарегистрирован: 29 ноя 2011, 07:13
Откуда: Дубай, ОАЭ (Минск, Беларусь)
Контактная информация:

Re: Проблемы с реализацией проэкта на FPC

Сообщение Uvadzucumi » 27 ноя 2012, 13:41

ты оператором new(указатель)
выделяешь под объект память. адрес выделенной памяти, записывается в "указатель"
после того как снова new(тотже указатель), выделяется снова - предыдущая не освобождается и ты потерял этот адрес вообще. в резульате нехватка оперативки у тебя проиходит.

вообще делать нужно как то так:
Скрытый текст: ПОКАЗАТЬ
вот демка работы с классами

Код: Выделить всё

{$mode objfpc}
program ObjDemo;

uses Crt, SysUtils {IntToStr};

Type
  TMapTileType = (
    ttNone,
    ttWall,
    ttDoor
);

type TMapObj = class(TObject)
  public
      m_type: TMapTileType;
      m_char: char;
      m_color:  integer; // или что там...
end;

// ttWall obj
type TMapWall = class (TMapObj)
  public
    wall_type: integer;
    // доп методы и данные
end;

// другой объект
type TMapDoor = class(TMapObj)
  public
    open: boolean;
    locked: boolean;
    // другие доп методы и данные
end;

const map_x=100;
      map_y=100;
      map_h=100;


var
   map: array[0..999,0..999,0..99] of TMapObj; // это уже будет массив ссылок, а не объектов
   TileType: TMapTileType;
   x,y,h: integer;
begin
TileType:=ttWall;
// создаем обхекты карты
for x:=0 to map_x do begin
  for y:=0 to map_y do begin
    for h:=0 to map_h do begin

	    map[x][y][h]:=TMapObj(TMapWall.Create);
            map[x][y][h].m_type:=TileType;
            map[x][y][h].m_color:=10;
            map[x][y][h].m_char:='#';

{
        case TileType of // тут тип тайла который будем добавлять в ячейку карты
       // далее в зависимости от тайла, создаем объект карты
          ttWall: // empty field
// для стандартного
              map[x][y][h]:=TMapWall.Create;
              map[x][y][h].m_type:=ttWall;
              map[x][y][h].m_color:=10;
              map[x][y][h].m_char:='#';
// специфические
              map[x][y][h].wall_type:=10; // к примеру
            break;
          ttDoor:
// для стандартного
              map[x][y][h]:=TMapDoor.Create;
              map[x][y][h].m_type:=ttDoor;
              map[x][y][h].m_color:=10;
              map[x][y][h].m_char:='/';
// специфические
              map[x][y][h].open:=false; // закрыта
	      map[x][y][h].locked:=false; // не заперта
...
          else
            write('фигня');
            exit;
        end;
    end;
}
  end;
 end;
end;

for x:=0 to 9 do begin
 writeln('x='+IntToStr(x)+' char='+map[x][0][0].m_char+' wall type='+IntToStr(TMapWall(map[x][0][0]).wall_type));
end;

end.
обращаться к этим выяснив их тип. и приведя указатель с типа предка на тип обхекта.
теперь точно должно работать
Последний раз редактировалось Uvadzucumi 27 ноя 2012, 14:58, всего редактировалось 2 раза.
Меня окружали милые, добрые люди... медленно сжимая кольцо

Аватара пользователя
Jolly Roger
Сообщения: 2973
Зарегистрирован: 27 ноя 2009, 09:10
Откуда: Minsk, Belarus

Re: Проблемы с реализацией проэкта на FPC

Сообщение Jolly Roger » 27 ноя 2012, 13:45

Логично, зачем в рогалике указатели?
Писать диздок спустя несколько лет разработки и множества изменений концепции - исконная русская девелоперская традиция.

Аватара пользователя
Uvadzucumi
Сообщения: 365
Зарегистрирован: 29 ноя 2011, 07:13
Откуда: Дубай, ОАЭ (Минск, Беларусь)
Контактная информация:

Re: Проблемы с реализацией проэкта на FPC

Сообщение Uvadzucumi » 27 ноя 2012, 14:52

набросал работающую демку для FPC. теперь уже рабочий код в предыдущем моем посте.

вообще я увидев этот пост в самом начале, сделал демку генерации уровня подземелья на FPC, но так и не запостил. если интересоно - прикрепляю.
Вложения
FPC.zip
(5 КБ) 92 скачивания
Меня окружали милые, добрые люди... медленно сжимая кольцо

Аватара пользователя
Apromix
Мастер
Сообщения: 1236
Зарегистрирован: 04 июл 2011, 10:44
Откуда: Украина, Черновцы
Контактная информация:

Re: Проблемы с реализацией проэкта на FPC

Сообщение Apromix » 28 ноя 2012, 07:26

kipar писал(а):У меня в RFRL вывод с помощью GDI (ну, TCanvas) занимает не больше 30мс, зато этот метод явно проще любого подключаемого движка.
Этот вопрос меня заинтересовал. Как на GDI узнать FPS ну или мс?

Аватара пользователя
Jesus05
Сообщения: 1840
Зарегистрирован: 02 дек 2009, 07:50
Откуда: Норильск, сейчас Санкт-петербург.
Контактная информация:

Re: Проблемы с реализацией проэкта на FPC

Сообщение Jesus05 » 28 ноя 2012, 07:45

Apromix писал(а):
kipar писал(а):У меня в RFRL вывод с помощью GDI (ну, TCanvas) занимает не больше 30мс, зато этот метод явно проще любого подключаемого движка.
Этот вопрос меня заинтересовал. Как на GDI узнать FPS ну или мс?
так-же как и при любом другом методе.
запоминаешь время начала отрисовки, и по окончанию отрисовки сравниваешь с началом получаешь время отрисовки.
я обычно считаю ФПС между 2-мя началами отрисовки, почитай про вианпи функции QueryPerformanceFrequency, QueryPerformanceCounter, ну или самый простой но не очень точный вариант GetTickCount точность около 10мс.

я тонкостей уже не помню счас с Qt работаю там есть реализация высокоточного таймера ей и пользуюсь.

Аватара пользователя
Uvadzucumi
Сообщения: 365
Зарегистрирован: 29 ноя 2011, 07:13
Откуда: Дубай, ОАЭ (Минск, Беларусь)
Контактная информация:

Re: Проблемы с реализацией проэкта на FPC

Сообщение Uvadzucumi » 28 ноя 2012, 15:22

@Goofs
как и обещал - подправленная версия примера генерации карты под винду. теперь должно компилиться без проблем.
Скрытый текст: ПОКАЗАТЬ

Код: Выделить всё

Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

c:\my\Projects\FPC>make
fpc myrl.pas
Free Pascal Compiler version 2.6.0 [2011/12/25] for i386
Copyright (c) 1993-2011 by Florian Klaempfl and others
Target OS: Win32 for i386
Compiling myrl.pas
Compiling mytimer_win.pas
Compiling mapgen.pas
Compiling map_tiles.pas
Linking myrl.exe
596 lines compiled, 0.2 sec , 72432 bytes code, 13900 bytes data
Вложения
fpc-mapgen-winfixed.ZIP
(5.87 КБ) 79 скачиваний
Меня окружали милые, добрые люди... медленно сжимая кольцо

Goofs
Сообщения: 9
Зарегистрирован: 13 мар 2012, 14:19
Откуда: Петрозаводск

Re: Проблемы с реализацией проэкта на FPC

Сообщение Goofs » 29 ноя 2012, 12:06

Uvadzucumi, благодарю за пример. Начинаю вникать в него. Для ускорения прецесса вникания немогли бы вы мне обьяснить, каким собственно макаром у вас потребляется так мало памяти? И применим ли данный метод к 3-х мерным массивам?
И сразу, можно ли как либо "разгрузить" оперативку от здоровенных массивов, таких как моя карта?
(размер 1000х1000х100)

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 37 гостей