Текущий архив: 2006.12.31;
Скачать: CL | DM;
ВнизРедактор карт в DelphiX Найти похожие ветки
← →
Аццкий_рыцарь:) (2006-01-24 01:15) [0]я наверное уже задолбал вас со своими тупыми и ламерскими вопросами :)
вот вопрос :)
Расскажите мне плиз как создавать редактор карт в DelphiX. Тоесть, как делается так что потом карта сохраняется в отдельный файл, а потом загружается?
← →
Shirson © (2006-01-24 05:50) [1]Это вопрос не столько по DelphiX, сколько по программированию.
У тебя карта матричная? Всмысле может быть представлена прямоугольным массивом? Если да - задачка для начинающих "как сохранить массив в файл".
← →
Аццкий_рыцарь:) (2006-01-27 00:06) [2]Я карту создавал через semapsize(x,y)
А можно поподробней про массив?
Например как сделать чтоб когда загружаешь карту, то создавалась не просто как Bitmap карта... Например там есть объекты с которыми взаимодействует игрок. А это отдельные спрайты.
Я тут думал... А нельзя просто чтоб редактор карт сохранял координаты каждого объекта? а потом делфи читал строки и по ним создавал там что-то?
например я в редакторе карт создал камень в координатах 100, 130 и сохранил. В блокноте создается строка типа r1 100, 130. А делфи смотрит если строка начинается с r1, то надо создать камень в таких координатах.
← →
Unsigned © (2006-01-27 00:21) [3]Делай так. Игровое поле представляешь в виде прямоугольной матрицы N*M.
То есть что-то типа Map : array[0..n-1,0..m-1] of byte. Каждому коду в соответствие ставишь какой-то объект, например 0-трава, 1 - камень.
Потом можешь эту матрицу сохранять\загружать. Загружаешь и в соответствии с кодами в ячейках создаешь объекты. Их координаты можно найти так:
Х:=i*MapObject.Width,Y:=j*Object.Height, где i,j - координаты объекта в матрице.
← →
PAVIA © (2006-01-27 00:45) [4]Аццкий_рыцарь
Так и сохрони объекты.
Весч элементарная.
Все просто если объект храняться как матрицу. Так и сохрани ее.
А если хранишь как спрайты так и сохрани их.
for i:=0 to DXSpriteEngine^.Engine.Count-1 do
begin
Spr_Tmp:=DXSpriteEngine^.Engine.Items[i];
//тут уже твоя фантазия как хранить.
end;
← →
Аццкий_рыцарь:) (2006-01-27 01:39) [5]Эх! счас сяду делать редактор :)
← →
Cash © (2006-01-27 08:47) [6]А я ведь не зря про формат файла говорил!
У тебя есть HEX редактор или FAR накрайняк.
Возми игруху, любую, главное с открытыми ресурсами.
Карты там обычно под *.map/*.m* расширениями файлов валяются.
Открой карту и посмотри в HEX виде. Там текст встречается очень редко,
чаще это диалоги или скрипты или описание карты. А все остальное - в
бинарном виде. Сделай как нибудь так:
Формат файла:
- Заголовок:
Сигнатура (если надо)
(какая нибудь последовательность байтов, символизирующая, что это тот
самый формат. Обычно сюда пихают 3-4 байта, куда записывают само
расширение файла. Типа в C&C Generals карта - *.map файл, и сигнатура
у него тоже "MAPF")
Ширина карты
Высота Карты
Количество Объектов на карте
(это, чтобы дать проге понять сколько еще читать этот файл)
Описание карты (если надо)
- Тело карты
(сюда надо бы перенести масив индексов карты, они там Integer типа,
так что размер масива вроде 4*MapWidth*MapHeight)
- Тело объектов карты
Сигнатура (если надо или охота)
тело первого объекта
тело второго объекта
------
тело n-го объекта
eof.
Организовать это в файловом потоке достаточно просто.
← →
Аццкий_рыцарь:) (2006-01-27 16:21) [7]ЭЭээээ.... ГГ... Я чета седня какой-то немного с будунца :) Ты не мог бы кинуть ссылочку на статью по этому? Чтоб там все внятно написано было без всяких типа: "синхронизовать интерполяцию частиц частей карты достаточно просто" :)
← →
Кефир87 © (2006-01-27 16:42) [8]Какие статьи?! Как организовать файл своего формата? Неее... врядли такие есть. Тут подумать надо. А научиться работать с файлами нужно было раньше чем заниматься разработкой игр 8)
← →
Cash © (2006-01-27 17:20) [9]Если надо, напишу статью прямо здесь.
← →
Аццкий_рыцарь:) (2006-01-27 17:47) [10]НАПИШИ ПЛИЗ! :)
← →
Кефир87 © (2006-01-27 19:18) [11]
> Если надо, напишу статью прямо здесь.
Ты уже написал все что нужно в [6] 8)
← →
Cash © (2006-01-27 20:08) [12]Кефир87 © (27.01.06 19:18) [11]:
... Все, что нужно знающему и рулящему в файловых потоках чуваку,
а не любому другому человеку!
Для любого другого - подготовлю статейку и выложу,
через некоторое время.
← →
Кефир87 © (2006-01-27 20:53) [13]
> Все, что нужно знающему и рулящему в файловых потоках чуваку,
>
> а не любому другому человеку!
Любому другому человеку нефиг (или рано) заниматься геймдевом 8)
← →
Cash © (2006-01-28 11:04) [14]Аццкий_рыцарь:) (27.01.06 17:47) [10]:
Для начала надо научиться работать с файловыми потоками "FileSteram".
Для этого есть класс TFileStream = class(TStream);
Открыть или создать файл через поток можно так:
var
f: TStream;
begin
f := TFileSteam.Create("c:\temp\text.txt",fOpenParam);
// далее работаем с файлом через его поток
f.free;
end;
fOpenParam - это параметр, который говорит как файл открывать.
Это может быть:
fmCreate - просто создать пустой файл
fmOpenRead - открыть файл для чтения
fmOpenWrite - открыть файл для записи
fmOpenAppend - открыть файл для дозаписи
fmOpenReadWrite - открыть файл для чтения и записи
Работа с потоком идет очень просто.
Размер файла можно узнать из свойства Size.
Позицию точки чтения/записи узнают из Position.
Запись любых параметров происходит из:
Write(buffer; buffersize);
WriteBuffer(buffer; buffersize);
buffer - то, что надо записать, buffersize - сколько байт надо записать.
Читают из потока с помощью:
Read(var buffer; buffersize);
ReadBuffer(var buffer; buffersize);
Тут параметры теже самые.
Теперь смотри. К примеру нам надо записать занчение Word поля
в файл. Для этого надо сделать следующее:
var
f: TFileSteram;
b: word;
begin
b:=628;
f:=TFileStream.Create("c:\temp\data.bin",fmCreate);
f.Write(b,2); // т. к. Word занимает два байта
f.free;
edn;
Ну, хорошо, записали! А что мы записали? Хвиг его откровенно знает! :)
Можно через любой HEX редактор посмотреть то, что там записано.
А вот сказать своей проге читеть можно так:
var
f: TFileStream;
b: word;
begin
f:=TFileStream.Cerate("c:\temp\data.bin",fmOpenRead);
f.Read(b,2);
f.free;
ShowMessage(Inttostr(b));
end;
Вот, вприципе так все и работает. С записями "Record" также, только запись
для записи в файл надо сделать неразрывной, то есть тип назвать так:
"Packed Record". И можно писать и читать прямо целые блоки данных.
Теперь применительно к карте. Положи DxSpriteEngine в редактор и в него
создавай свои препятствия и всякие штуки (бонусы там или точки
респаунов у монстряков). Потом, нужен TBackgroundSprite для хранения
самой карты. Начинку редактора делай сам. Тут я из вредности не помогу ;).
А вот для сохранения карты (и для загрузки тоже) надо еще один класс
сделать. Создай класс наследник от TComponent. и у него впиши два
поля: Sprites: TDxSpriteEngine; и Map: TBackgoundSprite;.
Теперь сама процедура сохранения:
<coe>
Type
TSaveContainer = class(TComponent)
Public
Sprites: TDxSpriteEngine;
Map: TBackgroundSprite;
end;
Procedure SaveToStream(var Stream: TStream);
var
Cont: TSaveContainer;
begin
Cont:=TSaveContainer.Create(nil);
Cont.Sprites:=DxSpriteEngine1;
Cont.Map:=GlobalEditedMap;
Stream.WriteComponentRes("MyMapAndObjects");
Cont.free;
end;
Теперь сам подумай, как сохранить не в поток, а в файл, да при этом время
кодерское экономить!
А вся загрузка делается так:
var
Cont: TSaveContainer;
begin
Cont:=TSaveContainer.Create(nil);
Cont.Sprites:=DxSpriteEngine;
Cont.Map:=GlobalEditedMap;
Stream.ReadComponentRes(Cont);
Cont.free;
end;
вот в общем и все!
Это без формата. так вроде быстрее и проще, формат уже за тебя сделан.
:))) Когда подростешь, научу форматы делать! :)))
На заметку: Учи англиский по справке Delphi :)))
← →
Аццкий_рыцарь:) (2006-01-29 00:18) [15]Сча попытаюсь понемногу разобраться...
вот смотри, например, я хочу по клику мыши создать файл data1.bin в директории D:\ и записать туда число 655...:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DXClass, DXSprite, DXInput, DXDraws, StdCtrls, DIB, ExtCtrls,
ImgList;
type
TForm1 = class(TDXForm)
DXDraw1: TDXDraw;
DXImageList1: TDXImageList;
DXInput1: TDXInput;
DXSpriteEngine1: TDXSpriteEngine;
DXTimer1: TDXTimer;
Button1: TButton;
procedure DXTimer1Timer(Sender: TObject; LagCount: Integer);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TFileStream = class(TStream);
var
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
f: TFileStream;
b: word;
begin
b:=655;
f:=TFileStream.Create("D:\data1.bin",fmCreate);
f.Write(b,2);
f.free;
end;
end.
и делфи ругается на строку f:=TFileStream.Create("D:\data1.bin",fmCreate);
и говорит что too many actual parameters
← →
Аццкий_рыцарь:) (2006-01-29 00:18) [16]Сча попытаюсь понемногу разобраться...
вот смотри, например, я хочу по клику мыши создать файл data1.bin в директории D:\ и записать туда число 655...:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DXClass, DXSprite, DXInput, DXDraws, StdCtrls, DIB, ExtCtrls,
ImgList;
type
TForm1 = class(TDXForm)
DXDraw1: TDXDraw;
DXImageList1: TDXImageList;
DXInput1: TDXInput;
DXSpriteEngine1: TDXSpriteEngine;
DXTimer1: TDXTimer;
Button1: TButton;
procedure DXTimer1Timer(Sender: TObject; LagCount: Integer);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TFileStream = class(TStream);
var
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
f: TFileStream;
b: word;
begin
b:=655;
f:=TFileStream.Create("D:\data1.bin",fmCreate);
f.Write(b,2);
f.free;
end;
end.
и делфи ругается на строку f:=TFileStream.Create("D:\data1.bin",fmCreate);
и говорит что too many actual parameters
← →
Аццкий_рыцарь:) (2006-01-29 00:19) [17]ой, у мну тут проблемы с инетом, извеняюсь за 2 одинаковых топа
← →
Аццкий_рыцарь:) (2006-01-29 02:00) [18]Эээ.... я, конечно извеняюсь за оффтоп, но я в шоке! Делфи не запускается! я уже его и переустанавливал 10 раз и НИФИГА! А ПАНИКА!
выскакивает окно с названием Registry Delphi и в нем пишется:
borland license information was found, but it is not valid for Delphi.
You can not run delphi without this information
Click the Exit button to exit Delphi
exit
и все! никаких кнопок типа enter new registration code ! ЧЕ ДЕЛАТЬ!?
← →
Аццкий_рыцарь:) (2006-01-29 02:07) [19]Ой виноват! :) только что разобрался. С такой пираткой я еще не сталкивался! :) столько примочек всяких! но, СЛАВА БОГУ ВСЕ НОРМАЛЬНО!
еще раз извеняюсь за оффтоп, прошу модера удалить лишние посты, а мастеров не смотреть на них :)
← →
Unsigned © (2006-01-29 04:24) [20]
> public
> { Public declarations }
> end;
>
> TFileStream = class(TStream);
>
> var
>
Тебе не нужно объявлять этот класс. Это стандартный класс и он описан в модуле classes.pas.
← →
Unsigned © (2006-01-29 04:26) [21]Убери эту строку и все должно заработать.
← →
Аццкий_рыцарь:) (2006-01-29 05:41) [22]Получилось число записать :) сенк, Unsigned!
тэкс! я тут пытался записать спрайты в файл и угадайте вышло это у меня или нет :)
вот мой неработающий код
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DXClass, DXSprite, DXInput, DXDraws, StdCtrls, DIB, ExtCtrls,
ImgList;
type
TForm1 = class(TDXForm)
DXDraw1: TDXDraw;
DXImageList1: TDXImageList;
DXInput1: TDXInput;
DXSpriteEngine1: TDXSpriteEngine;
DXTimer1: TDXTimer;
Button1: TButton;
procedure DXTimer1Timer(Sender: TObject; LagCount: Integer);
procedure FormCreate(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
Type
TSaveContainer = class(TComponent)
Public
Sprites: TDxSpriteEngine;
Map: TBackgroundsprite;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
Cont: TSaveContainer;
f: TFileStream;
begin
Cont:=TSaveContainer.Create(nil);
Cont.Sprites:=DxSpriteEngine1;
Cont.Map:=grass;
f:=TFileStream.Create("d:\data12321.bin",fmCreate);
f.Write(cont.Sprites,7836);
f.free;
Cont.free;
end;
файл-то создается, но его размер = 0 байт :( я ж написал сколько должно быть, а почему создался пустой файл? кстати как мне узнать размер буфера? а то 7836 - я приплюсовал вес картинок спрайтов, и мне кажется, это неправильно :(
← →
Cash © (2006-01-29 09:21) [23]Аццкий_рыцарь:):
Ты сколько программированием занимаешься???
Уж больно ошибки глуповатые! :(((
Это чесно говоря не радует! :(((
[22]:
Потаму, что ты пытаешся адрес записать, точнее даже не адрес,
чтото среднее между указателем и объектом этого указателя.
Я же написал:
f.WriteComponentRes("Чё_Нибудь_Там",Cont);
Там ошибочка была, вот здесь правильно.
← →
Аццкий_рыцарь:) (2006-01-29 12:03) [24]Лана, записал :) А когда считываю вылазит вообще левая ошибка! :
procedure TForm1.Button3Click(Sender: TObject);
var
Cont: TSaveContainer;
f: TFileStream;
begin
Cont:=TSaveContainer.Create(nil);
Cont.Sprites:=DxSpriteEngine1;
f:=TFileStream.Create("d:\data12321.bin",fmOpenRead);
f.ReadComponentRes(cont);
f.free;
Cont.free;
end;
ошибка Project Project1.exe raised exception class EReadError with message "Property DXDraw does not exist" . И че ему в этом DXDraw не понравилось !?
← →
Домовенок © (2006-01-29 12:52) [25]>> Это без формата. так вроде быстрее и проще, формат уже за тебя сделан.
>> :))) Когда подростешь, научу форматы делать! :)))
А можно ссылку, где можно про форматы почитать? А то давно мечтаю с этим разобраться, но никак не могу найти нормальную информацию по этому поводу. Может, конечно, плохо искал...
← →
Cash © (2006-01-29 13:26) [26]Домовенок © (29.01.06 12:52) [25]:
http://www.extractor.ru :)))
Аццкий_рыцарь:) (29.01.06 12:03) [24]:
А вот это уже хреново! :(
Я впринципе на этот результат рассчитывал, но не надеялся.
Придется всетаки формат делать. Лады, чуть погодя прдумаю,
как осуществить формат, но мне надо знать: что за препятсятвия
ты запихать в файл хочешь? И еще: если там несколько классов
этих препятсятвий - какие между ними различия, и не лучше ли
их в один объединить?
← →
Аццкий_рыцарь:) (2006-01-29 14:23) [27]Cash у меня только один клас для препятствий. Этот клас - TObjectdo:=class(TImagesprite). В нем изменяются только картинка (ну, типа камень или домик), координаты, и пару переменных класса integer.
← →
Cash © (2006-01-29 14:28) [28]Как это где то написанно было, перефразирую под ситуяцию:
"Вечером перечитывал орешник...., мното думал!" :D :D :D
Вот, нашел, на мой взгляд ничего:
http://www.delphimaster.ru/cgi-bin/nuts.pl?&showpage=12 // 3-я снизу запись
http://www.delphimaster.ru/cgi-bin/nuts.pl?&showpage=13 // 1-я и 2-я тоже снизу
Аццкий_рыцарь:) (29.01.06 12:03) [24]:
А когда exception вылезает именно?
И где дебаггер ставит останов, внутри кода загрузки или где нибудь еще?
← →
Аццкий_рыцарь:) (2006-01-29 14:38) [29]Cash, а не легче будет просто в редакторе и в игре создать массив, объявить в нем несколько переменных. Например я создаю в редакторе домик в координатах 100, 100, с картинкой domik1 он непроходимый, и при столкновении с ним не происходит никаких событий в 1 ячейку массива пишу xobj:=100, yobj:=100, blockobj:=true, eventsobj:=false, imageobj:=1;Потом этот массив записать в файл. В игре его загрузить. допустим j - это номер ячейки массива, а их там например 100 :
for j:=1 to 100 do begin
with tobject.create(dxspriteengine1.engine) do begin
x:=xobj;
y:=yobj;
block:=blockobj;
events:=eventsobj;
if image=1 then image:=form1.dximagelist1.items.find("domik1");
end;
end;
ты не подскажешь как такой массив записать в файл, а потом загрузить?
← →
Cash © (2006-01-29 14:41) [30]Аццкий_рыцарь:) (29.01.06 14:23) [27]:
Это хорошо. Ничего усложнять не надо, но для начала
просмотри под дебагом всю процедуру загрузки карты
и удели внимание свойству DxDraw у DxSpriteEngine1.
Нужны ответы на вопросы из [28]:
P. S.: Во нашел самый крутой орех! Самая последняя запись.
http://www.delphimaster.ru/cgi-bin/nuts.pl?&showpage=2
← →
Аццкий_рыцарь:) (2006-01-29 14:41) [31]Cash, это тонкий намек на мое ламерство? :) но кликать мышью я умею :)
← →
Cash © (2006-01-29 14:44) [32]Аццкий_рыцарь:) (29.01.06 14:38) [29]:
Ты же на модеме! Только отпишу, смотрую твой пост вперед встал! :)))
В общем именно так для данного случая и длается.
Так действительно проще будет.
← →
Cash © (2006-01-29 14:45) [33]Аццкий_рыцарь:) (29.01.06 14:41) [31]:
Не, это просто для разрядки обстановки,
нашел прикольные штуки и решил поделиться!
← →
Аццкий_рыцарь:) (2006-01-29 14:47) [34]Ответы на 28
exception вылазит когда кликаю на кнопки, но что обидно,что дебаггер не показывает на конкретную строку в коде, а останавливается на application.run
← →
Аццкий_рыцарь:) (2006-01-29 14:52) [35]Cash, я-то на модеме, но родителей же нету дома, так что вишу сколько влезет :)
Насчет массива, ты бы не мог показать как массив этот в файл записать а потом считать?
← →
Cash © (2006-01-29 14:53) [36]Аццкий_рыцарь:) (29.01.06 14:38) [29]:
На счет сохранения:
Возьми запись, примерно такую:
TObjRec = packed record
.... // сюда впиши нужные поля
end;
Потом сделай масив из этих эаписей.
Размер масива будет <к-во элементов>*Sizeof(TObjRec)
и потом используй цыкл с такой конструкцией:
f.write(ObjArray[i],SizeOf(TObjRec));
Для того, чтобы эти записи удачно считать надо сперва записать
сколько всего этих записей.
← →
Аццкий_рыцарь:) (2006-01-29 14:56) [37]тэкс, сча попытаю счастья :) авось заработает :)
← →
Cash © (2006-01-29 15:00) [38]Аццкий_рыцарь:) (29.01.06 14:47) [34]:
А ты поставь BreakePoint (F5) на самой первой строчке процедуры загрузки и
потом проследи (с помощью F8) вся ли она без эксепов (exception) проходит.
А еще возми и через Ctrl+F5 добавь в просмотр свойство DxDraw у
DxSpriteEngine. У меня закралось сомнение, что надо в самом конце просо
сделать DxSpriteEngine1.DxDraw:=DxDraw1;
← →
Cash © (2006-01-29 18:57) [39]Видать предки пришли! :)))))))
← →
Кефир87 © (2006-01-29 20:55) [40]
> Cash © (29.01.06 14:28) [28]
>
> Как это где то написанно было, перефразирую под ситуяцию:
>
> "Вечером перечитывал орешник...., мното думал!" :D :D :D
> Вот, нашел, на мой взгляд ничего:
> http://www.delphimaster.ru/cgi-bin/nuts.pl?&showpage=12
> // 3-я снизу запись
> http://www.delphimaster.ru/cgi-bin/nuts.pl?&showpage=13
> // 1-я и 2-я тоже снизу
>
> Аццкий_рыцарь:) (29.01.06 12:03) [24]:
> А когда exception вылезает именно?
> И где дебаггер ставит останов, внутри кода загрузки или
> где нибудь еще?
Пора признать, что одна из этих записей пренадлежит мне, только 3 или 4 года назад 8)) Хотя и нифига не стыдно!
Страницы: 1 2 3 вся ветка
Текущий архив: 2006.12.31;
Скачать: CL | DM;
Память: 0.58 MB
Время: 0.059 c