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

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

Редактор карт в DelphiX [Delphi, DelphiX, Windows]


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

Аццкий_рыцарь:) ©   (2006-01-24 01:15:00) 

я наверное уже задолбал вас со своими тупыми и ламерскими вопросами :)

вот вопрос :)

Расскажите мне плиз как создавать редактор карт в DelphiX. Тоесть, как делается так что потом карта сохраняется в отдельный файл, а потом загружается?


Cash   (2006-01-29 14:41:00) [81]

Аццкий_рыцарь:)   (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:00) [82]

Cash, это тонкий намек на мое ламерство? :) но кликать мышью я умею :)


Аццкий_рыцарь:)   (2006-01-29 14:38:00) [83]

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:28:00) [84]

Как это где то написанно было, перефразирую под ситуяцию:
"Вечером перечитывал орешник...., мното думал!" :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:23:00) [85]

Cash у меня только один клас для препятствий. Этот клас - TObjectdo:=class(TImagesprite). В нем изменяются только картинка (ну, типа камень или домик),  координаты, и пару переменных класса integer.


Cash   (2006-01-29 13:26:00) [86]

Домовенок ©   (29.01.06 12:52) [25]:
http://www.extractor.ru:)))

Аццкий_рыцарь:)   (29.01.06 12:03) [24]:
А вот это уже хреново! :(
Я впринципе на этот результат рассчитывал, но не надеялся.
Придется всетаки формат делать. Лады, чуть погодя прдумаю,
как осуществить формат, но мне надо знать: что за препятсятвия
ты запихать в файл хочешь? И еще: если там несколько классов
этих препятсятвий - какие между ними различия, и не лучше ли
их в один объединить?


Домовенок   (2006-01-29 12:52:00) [87]

>> Это без формата. так вроде быстрее и проще, формат уже за тебя сделан.
>> :))) Когда подростешь, научу форматы делать! :)))


А можно ссылку, где можно про форматы почитать? А то давно мечтаю с этим разобраться, но никак не могу найти нормальную информацию по этому поводу. Может, конечно, плохо искал...


Аццкий_рыцарь:)   (2006-01-29 12:03:00) [88]

Лана, записал :) А когда считываю вылазит вообще левая ошибка! :



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 не понравилось !?


Cash   (2006-01-29 09:21:00) [89]

Аццкий_рыцарь:):
Ты сколько программированием занимаешься???
Уж больно ошибки глуповатые! :(((
Это чесно говоря не радует! :(((

[22]:
Потаму, что ты пытаешся адрес записать, точнее даже не адрес,
чтото среднее между указателем и объектом этого указателя.

Я же написал:
f.WriteComponentRes('Чё_Нибудь_Там',Cont);

Там ошибочка была, вот здесь правильно.


Аццкий_рыцарь:)   (2006-01-29 05:41:00) [90]

Получилось число записать :) сенк, 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 - я приплюсовал вес картинок спрайтов, и мне кажется, это неправильно :(


Unsigned   (2006-01-29 04:26:00) [91]

Убери эту строку и все должно заработать.


Unsigned   (2006-01-29 04:24:00) [92]


>  public
>    { Public declarations }
>  end;
>
>   TFileStream = class(TStream);
>
> var
>        

Тебе не нужно объявлять этот класс. Это стандартный класс и он описан в модуле classes.pas.


Аццкий_рыцарь:)   (2006-01-29 02:07:00) [93]

Ой виноват! :) только что разобрался. С такой пираткой я еще не сталкивался! :) столько примочек всяких! но, СЛАВА БОГУ ВСЕ НОРМАЛЬНО!

еще раз извеняюсь за оффтоп, прошу модера удалить лишние посты, а мастеров не смотреть на них :)


Аццкий_рыцарь:)   (2006-01-29 02:00:00) [94]

Эээ.... я, конечно извеняюсь за оффтоп, но я в шоке! Делфи не запускается! я уже его и переустанавливал 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 00:19:00) [95]

ой, у мну тут проблемы с инетом, извеняюсь за 2 одинаковых топа


Аццкий_рыцарь:)   (2006-01-29 00:18:00) [96]

Сча попытаюсь понемногу разобраться...

вот смотри, например, я хочу по клику мыши создать файл 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:00) [97]

Сча попытаюсь понемногу разобраться...

вот смотри, например, я хочу по клику мыши создать файл 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


Cash   (2006-01-28 11:04:00) [98]

Аццкий_рыцарь:)   (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:)))


Кефир87   (2006-01-27 20:53:00) [99]


> Все, что нужно знающему и рулящему в файловых потоках чуваку,
>
> а не любому другому человеку!

Любому другому человеку нефиг (или рано) заниматься геймдевом 8)


Cash   (2006-01-27 20:08:00) [100]

Кефир87 ©   (27.01.06 19:18) [11]:
... Все, что нужно знающему и рулящему в файловых потоках чуваку,
а не любому другому человеку!
Для любого другого - подготовлю статейку и выложу,
через некоторое время.


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

Наверх

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