Мои вопросы по обучению на Delphi XE и помощь к созданию игр
| |
TimKruz | Дата: Вторник, 05 Февраля 2013, 21:44 | Сообщение # 21 |
старожил
Сейчас нет на сайте
| Цитата (Александр5) все будет храниться в одном файле Хранить картинки в файле карты чаще всего неэффективно и глупо, потому что одна картинка может использоваться в разных картах (например, изображение земли, дерева). Поэтому лучше всего хранить картинки либо по-отдельности в папке, либо в одном файле (лучше - в архиве, типа zip). А остальные данные карты (размещение картинок на карте и всякие там параметры объектов) - в другом файле.
|
|
| |
Александр5 | Дата: Четверг, 14 Февраля 2013, 08:17 | Сообщение # 22 |
частый гость
Сейчас нет на сайте
| Помогите мне разобраться с классом как сделать класс также конструктор и деструктор класса а главное запись рекорда из класса чтобы при открытие рекорда в текстовом формате примерно это высвечивалось и еще просьба написть создание класса масивов изображения с определенными координатами х и у каждое Добавлено (14.02.2013, 08:17) --------------------------------------------- Помогите разобраться с класом чтобы использовать его для игры в нем должен быть рекорд а также файл с текстами игры запись должна записывать рекорд через класс в итоге в рекорде должны быть символы на подобие таких
TSK§ ќз /ц Gс cе {Щ ’ џ ЕЩ ’е {с cц Gз /П ѕ · к ?WЩ ’е {с c h(h №q`qzҐ‚ ЊҐ#З%д-лQуpШ \Ј^Йdдzт-ъ ` [‰ s© vЗ tй s)ЋH› Ќ А › л ¦ љ #Њ <Ѓ V 3#(э щ т Ю н ї к Ё Ъ ~mQ# Ю!Б! %';кQуoЧ аьС¶-qPu&_6C;)1%щE 626ъ5 6° (М Х сШ Шв Кы є Ў‡'h/ »’ Т® дВ сШ Х (М S) tN †d ’~ СN П= ±9 ”; v: 61 ,K E цU
|
|
| |
TimKruz | Дата: Четверг, 14 Февраля 2013, 17:27 | Сообщение # 23 |
старожил
Сейчас нет на сайте
| Александр5, ты можешь выражаться яснее, что тебе нужно? Цитата (Александр5) как сделать класс В самом общем виде простой класс выглядит так: Код type TSomeClass=class({родитель класса, по умолчанию - }TObject) //описание переменных класса //описание процедур и функций класса, конструктор и деструктор constructor Create; destructor Destroy; //Тут ещё могут быть группы public/private и т.п., но тебе это не нужно end; //Когда напишешь названия процедур и функций в описании класса, //нажми ctrl+shift+c и Delphi сама напишет шаблоны тел ниже, удобно
var SomeClass:TSomeClass; //экземпляр класса //Экземпляр инициализируется командой ИмяЭкземпляра:=КлассЭкземпляра.Create; //а удаляется либо через ИмяЭкземпляра.Destroy;, либо ИмяЭкземпляра.Free; //(через Free безопаснее, т.к. Free проверяет существование экземпляра и //вызывает Destroy только если удаление возможно)
{Тела процедур и функций класса в форме типа: procedure TSomeClass.ИмяПроцедуры; - аргументы можно не переписывать begin
end;}
constructor TSomeClass.Create; begin //Твой код, выполняется один раз при создании экземпляра класса end;
destructor TSomeClass.Destroy; begin //Твой код, выполняется один раз при удалении экземпляра класса end; Как делать записи record сам знаешь. Цитата (Александр5) Помогите разобраться с класом чтобы использовать его для игры в нем должен быть рекорд а также файл с текстами игры запись должна записывать рекорд через класс Ну ты просто хочешь, чтобы за тебя написали этот класс вместе с записью... Но при этом непонятно, что конкретно он должен записывать, а основные принципы я тебе раньше написал. Короче, изучай учебники по программированию, читай самоучители и руководства - там всё это есть, и очень подробно, так что, если будешь стараться понять и разобраться - обязательно во всём разберёшься и всё сам сможешь сделать. Поверь, тебе будет полезнее разобраться самому, чем просить других написать тебе готовый код.
Цитата (Александр5) в итоге в рекорде должны быть символы на подобие таких Такие символы в блокноте отображаются тогда, когда в файле записаны какая-либо информация бинарном виде (например, числа integer в файле file of integer), т.е. там могут быть какие угодно байты, а не только те, которые соответствуют определённым символам-буквам. Если же ты хочешь записывать текстовую информацию, которую нельзя прочитать обычным блокнотом (т.е. зашифровать текст) - ищи информацию о шифровании текста (можно взять для начала какой-нибудь простой тип шифра), ну или вообще статьи по криптографии...
Сообщение отредактировал TimKruz - Четверг, 14 Февраля 2013, 17:29 |
|
| |
Александр5 | Дата: Пятница, 15 Февраля 2013, 08:30 | Сообщение # 24 |
частый гость
Сейчас нет на сайте
| constructor TSomeClass.Create; begin //Твой код, выполняется один раз при создании экземпляра класса end;
destructor TSomeClass.Destroy; begin //Твой код, выполняется один раз при удалении экземпляра класса end; А что именно должно тут происходить
Ну ты просто хочешь, чтобы за тебя написали этот класс вместе с записью... Но при этом непонятно, что конкретно он должен записывать, а основные принципы я тебе раньше написал. Короче, изучай учебники по программированию, читай самоучители и руководства - там всё это есть, и очень подробно, так что, если будешь стараться понять и разобраться - обязательно во всём разберёшься и всё сам сможешь сделать. Поверь, тебе будет полезнее разобраться самому, чем просить других написать тебе готовый код.
Спасибо ты мне очень помог и писать код я буду сам только что именно должно быть в конструкторах и в деструкторах
Такие символы в блокноте отображаются тогда, когда в файле записаны какая-либо информация бинарном виде (например, числа integer в файле file of integer), т.е. там могут быть какие угодно байты, а не только те, которые соответствуют определённым символам-буквам. Если же ты хочешь записывать текстовую информацию, которую нельзя прочитать обычным блокнотом (т.е. зашифровать текст) - ищи информацию о шифровании текста (можно взять для начала какой-нибудь простой тип шифра), ну или вообще статьи по криптографии...
странно я рекорд записываю таким способом assignfile(fil,extractfilepath(application.ExeName)+'papka\filename'); rewrite(fil); write(fil,g); closefile(fil); а рекорд сделан так type TPers=record name:string[10]; //Volodorn jizn:word; //Жизни 1000 oruj:boolean; //оружие доступно patron:integer; //патроны ... end; но он все равно не такой результат выходит
|
|
| |
TimKruz | Дата: Пятница, 15 Февраля 2013, 13:53 | Сообщение # 25 |
старожил
Сейчас нет на сайте
| Цитата (Александр5) А что именно должно тут происходить Цитата (Александр5) что именно должно быть в конструкторах и в деструкторах В самом простом случае (когда предок класса - TObject) - что угодно (а может не быть ничего вовсе). Обычно в конструкторе задают начальные значения переменным, выделяют память под динамические переменные (например, задают размеры динамических массивов), а в деструкторе, соответственно, освобождают память, которая занята динамическими переменными. Вот, например, класс TPolygon - он описывает многоугольник, позволяет с ним работать: Код TModel:array of TPoint; //TModel - массив записей TPoint, которые обозначают точки (поля x,y:integer) TPolygon=class polygon:TModel; //Собственно, массив вершин многоугольника S:^longword; //Для примера: указатель (pointer) на переменную constructor Create(n:word); //n - число вершин destructor Destroy; end; <...> constructor TPolygon.Create; begin SetLength(polygon,n); //Задаём размер массива new(s); //Выделяем память для переменной end;
destructor TPolygon.Destroy; begin //Удаляем массив polygon:=nil; //или SetLength(polygon,0) - не знаю, что правильнее dispose(s); //Высвобождаем память от переменной end; Здесь переменные и задание их размеров, выделение памяти чисто для примера - в конструкторе и деструкторе может вообще не быть никакого кода, тогда Create/Destroy наследуются от TObject, но ничего не делают (хотя вызывать их, естественно, обязательно - без них нельзя создать или уничтожить экземпляр класса). А вот если наш класс - потомок какого-то особого класса (=class(чего-то там)), то мы можем либо полностью наследовать конструктор/деструктор, либо частично, либо полностью перезаписать его: Код TNewObject=class(TParentObject) //TNewObject - потомок TParentObject constructor Create; end; <...> constructor TNewObject.Create; begin <тут может быть наш код>
inherited; //Эта команда вызывает код TParentObject.Create, если он на нужен //Её может и не быть - тогда код TParentObject.Create перезаписывается нашим
<тут может быть наш код> end; //Точно так же можно сделать с Destroy В принципе, эта команда используется как inherited ИмяМетодаПредка(аргументы);, а просто inherited; вызывает одноимённый метод класса-предка.
Цитата (Александр5) странно я рекорд записываю таким способом но он все равно не такой результат выходит Ну у тебя там строка string, которая будет выглядеть в файле как простой текст, а вот параметры jizn, oruj и patron уже будут выглядеть как непонятные крякозябры. Правда, если, например, jizn=0, то в файле окажется два нулевых символа (которые, вроде бы, никак не отображаются блокнотом). То есть, попробуй забивать различные числа - получишь непонятные символы... А чтобы строку string привести в нечитабельный вид - нужно её шифровать. Правда, тогда тебе придётся перед записью строку шифровать, а после чтения - расшифровывать, а если будешь шифровать весь файл целиком - придётся писать свои методы чтения/записи (т.к. read(fil,g) считает зашифрованные данные) или мудрить с алгоритмами дешифровки (т.е. расшифровывать записи уже после чтения через read(fil,g))...
|
|
| |
Александр5 | Дата: Пятница, 15 Февраля 2013, 14:01 | Сообщение # 26 |
частый гость
Сейчас нет на сайте
| А чтобы строку string привести в нечитабельный вид - нужно её шифровать. Правда, тогда тебе придётся перед записью строку шифровать, а после чтения - расшифровывать, а если будешь шифровать весь файл целиком - придётся писать свои методы чтения/записи (т.к. read(fil,g) считает зашифрованные данные) или мудрить с алгоритмами дешифровки (т.е. расшифровывать записи уже после чтения через read(fil,g))... Лучше строку шифровать и расшифровку слушай напиши мне шифровку и расшифровку или ссылку где про это пишут кстати непонемаю почему в делфи 5 не работает этот код Код type TObect_obj=class(TObject) type RObject_obj=record Kartinka:tbitmap; Names:string[20]; typesPO:BOOLEAN; tormoz_procent:integer; BOOLEAN_OBJECT:boolean; TYPE_OBJECT:BYTE; STOP_PERSONAZ:BOOLEAN; end; var Object_obj1:RObject_obj; end; const OBR_YES:STRING='(Да)'; OBR_NO:STRING='(Нет)'; var Form1: TForm1;
implementation а в раде все работает вот весь код модуля
Код unit UN_OBject;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, Buttons, ComCtrls;
type TForm1 = class(TForm) BitBtn1: TBitBtn; Panel1: TPanel; Image1: TImage; Panel2: TPanel; RadioGroup2: TRadioGroup; RadioGroup1: TRadioGroup; Timer1: TTimer; CheckBox1: TCheckBox; Label1: TLabel; TrackBar1: TTrackBar; Label2: TLabel; OBR: TEdit; Label3: TLabel; procedure TrackBar1Change(Sender: TObject); procedure Timer1Timer(Sender: TObject); private { Private declarations } public { Public declarations } end; type TObect_obj=class(TObject) type RObject_obj=record Kartinka:tbitmap; Names:string[20]; typesPO:BOOLEAN; tormoz_procent:integer; BOOLEAN_OBJECT:boolean; TYPE_OBJECT:BYTE; STOP_PERSONAZ:BOOLEAN; end; var Object_obj1:RObject_obj; end; const OBR_YES:STRING='(Да)'; OBR_NO:STRING='(Нет)'; var Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.TrackBar1Change(Sender: TObject); begin Label1.Caption:=inttostr(TrackBar1.Position)+' %'; end;
procedure TForm1.Timer1Timer(Sender: TObject); begin If RadioGroup1.ItemIndex=0then begin panel2.Enabled:=false; end; If RadioGroup1.ItemIndex=1then begin Panel2.Enabled:=true; end; If CheckBox1.Checked=true then begin Label2.Caption:=OBR_YES;end else begin Label2.Caption:=OBR_NO;end; end;
end. вот собственно ошибки Код [Error] UN_OBject.pas(32): 'END' expected but 'TYPE' found [Error] UN_OBject.pas(42): 'IMPLEMENTATION' expected but ';' found [Error] UN_OBject.pas(48): '.' expected but 'IMPLEMENTATION' found [Error] UN_OBject.pas(24): Unsatisfied forward or external declaration: 'TForm1.TrackBar1Change' [Error] UN_OBject.pas(25): Unsatisfied forward or external declaration: 'TForm1.Timer1Timer' [Fatal Error] Object_Edit.dpr(5): Could not compile used unit 'UN_OBject.pas'
|
|
| |
TimKruz | Дата: Пятница, 15 Февраля 2013, 23:12 | Сообщение # 27 |
старожил
Сейчас нет на сайте
| Цитата (Александр5) Лучше строку шифровать и расшифровку слушай напиши мне шифровку и расшифровку или ссылку где про это пишут Поищи сам в Яндексе, например. Типа "delphi шифрование текста". Цитата (Александр5) кстати непонемаю почему в делфи 5 не работает этот код Хм... Сначала думал, что ты хочешь объявить запись без объявления типа (такое тоже возможно, только type не нужно писать), потом понял: Код type RObject_obj=record Kartinka:tbitmap; Names:string[20]; typesPO:BOOLEAN; tormoz_procent:integer; BOOLEAN_OBJECT:boolean; TYPE_OBJECT:BYTE; STOP_PERSONAZ:BOOLEAN; end; TObect_obj=class(TObject) Object_obj1:RObject_obj; end; Теоретически, можно вместо объявления RObject_obj сразу описание записи сделать, т.е. не описывать тип RObject_obj, но лучше всё-таки описывать так...
|
|
| |
Александр5 | Дата: Пятница, 15 Февраля 2013, 23:26 | Сообщение # 28 |
частый гость
Сейчас нет на сайте
| Спасибо тут с игрой в делфи 5 возникла сможешь разобраться Код unit UN4_GAMES;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls,Dialogs, StdCtrls, ExtCtrls; TYPE TGameRead=class(TThread) // класс для таймера игры private protected procedure Execute;override; // Запуск procedure Tic; // Один тик программы end; Type TCreate_Graphic=class(TObject) OBJ_Stena:array[0..1] of TBitmap; end; Procedure TCreate_new; var i:integer; Graphics1:TCreate_Graphic; L1:TGameRead; implementation uses UN3_GAMES; procedure TGameRead.execute; begin repeat synchronize(Tic); until Terminated end; procedure TGameRead.Tic; begin // Тут пишем все как в TTimer OnTime end; Procedure TCreate_new; begin For i := 0 to 1 do begin Graphics1.OBJ_Stena[i]:=Tbitmap.Create; end; Graphics1.OBJ_Stena[0].LoadFromFile(ProgDir+'\Lefels1\Stena_1.bmp'); Graphics1.OBJ_Stena[1].LoadFromFile(ProgDir+'Stena_2.bmp'); L1:=TGameRead.Create(false); // Создаем поток L1.Priority:=TpHighest; // Ставим приоритет end; end. Ошибка системная вот тут Код For i := 0 to 1 do begin Graphics1.OBJ_Stena[i]:=Tbitmap.Create; end;
|
|
| |
TimKruz | Дата: Суббота, 16 Февраля 2013, 12:06 | Сообщение # 29 |
старожил
Сейчас нет на сайте
| Цитата (Александр5) Ошибка системная вот тут Ты, похоже, забыл инициализировать экземпляр класса, надо конструктор класса вызвать: Код Graphics1:=TCreate_Graphic.Create; For i := 0 to 1 do begin Graphics1.OBJ_Stena[i]:=Tbitmap.Create; end; Дело в том, что конструктор класса, даже если он пустой, выполняет важную роль: выделяет память для статичных переменных экземпляра и возвращает указатель на выделенную память для экземпляра; значение этого указателя мы сохраняем в специальной переменной-указателе (собственно Graphics1), чтобы потом была возможность им пользоваться (если просто вызвать TCreate_Graphic.Create - то память выделится, т.е. будет создан экземпляр класса, но управлять мы им просто не сможем)... А деструктор высвобождает занятую память (после чего указатель становится недействительным). Подробнее - изучай работу с указателями (Pointer), это довольно сложная, но интересная тема.
|
|
| |
Александр5 | Дата: Четверг, 21 Февраля 2013, 15:30 | Сообщение # 30 |
частый гость
Сейчас нет на сайте
| Надешь тему и что в конструкторе и деконструторе писать Добавлено (20.02.2013, 13:15) --------------------------------------------- Как сделать запись класса вот код Код unit UN_OBject;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, Buttons, ComCtrls, ExtDlgs, UN1_Object;
type TForm1 = class(TForm) BitBtn1: TBitBtn; Panel1: TPanel; Image1: TImage; Panel2: TPanel; RadioGroup2: TRadioGroup; RadioGroup1: TRadioGroup; Timer1: TTimer; CheckBox1: TCheckBox; Label1: TLabel; TrackBar1: TTrackBar; Label2: TLabel; OBR: TEdit; Label3: TLabel; Label4: TLabel; OpenPictureDialog1: TOpenPictureDialog; Button1: TButton; CheckBox2: TCheckBox; Label5: TLabel; procedure TrackBar1Change(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure BitBtn1Click(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; type RObject_obj=record Kartinka:tbitmap; Names:string[20]; typesPO:BOOLEAN; tormoz_procent:integer; BOOLEAN_OBJECT:boolean; TYPE_OBJECT:BYTE; STOP_PERSONAZ:BOOLEAN; end; type TObject_obj=class(TObject) Object_obj1:RObject_obj; end; const OBR_YES:STRING='(Да)'; OBR_NO:STRING='(Нет)'; var Form1: TForm1; Object1:TObject_obj; implementation
{$R *.DFM}
procedure TForm1.TrackBar1Change(Sender: TObject); begin Label1.Caption:=inttostr(TrackBar1.Position)+' %'; end;
procedure TForm1.Timer1Timer(Sender: TObject); begin If RadioGroup1.ItemIndex=0then begin panel2.Enabled:=false; end; If RadioGroup1.ItemIndex=1then begin Panel2.Enabled:=true; end; If CheckBox1.Checked=true then begin Label2.Caption:=OBR_YES;end else begin Label2.Caption:=OBR_NO;end; If CheckBox2.Checked=true then begin Label5.Caption:=OBR_YES;end else begin Label5.Caption:=OBR_NO;end; end;
procedure TForm1.BitBtn1Click(Sender: TObject); begin If openpicturedialog1.Execute then begin image1.Picture.LoadFromFile(openpicturedialog1.FileName); end; end;
procedure TForm1.Button1Click(Sender: TObject); begin Object1.Object_obj1.Kartinka:=Tbitmap.Create; Object1.Object_obj1.Kartinka:=image1.Picture.Bitmap; Object1.Object_obj1.Names:=OBR.Text; case Radiogroup1.ItemIndex of 0:begin Object1.Object_obj1.typesPO:=false; end; 1:begin Object1.Object_obj1.typesPO:=true; end; end; if Object1.Object_obj1.typesPO=true then begin object1.Object_obj1.tormoz_procent:=0; object1.Object_obj1.BOOLEAN_OBJECT:=false; object1.Object_obj1.TYPE_OBJECT:=0; object1.Object_obj1.STOP_PERSONAZ:=false; end else begin object1.Object_obj1.tormoz_procent:=trackbar1.Position; object1.Object_obj1.BOOLEAN_OBJECT:=checkbox1.Checked; Object1.Object_obj1.TYPE_OBJECT:=Radiogroup2.ItemIndex+1; object1.Object_obj1.STOP_PERSONAZ:=checkbox2.Checked; end; //Remained to do record
//Destroy picture object1.Object_obj1.Kartinka.FreeImage; end;
end. Добавлено (21.02.2013, 15:30) --------------------------------------------- Как можно проверить существует ли папка в определенной директории или нет если нет то создать ее функция function DirectoryExists ( const DirectoryName : string ) : Boolean; не работвает в Delphi 5 помоему ее там вобще нет а вот эта CreateDir(dirName); работет
|
|
| |
TimKruz | Дата: Четверг, 21 Февраля 2013, 18:46 | Сообщение # 31 |
старожил
Сейчас нет на сайте
| Цитата (Александр5) функция function DirectoryExists ( const DirectoryName : string ) : Boolean; не работвает в Delphi 5 помоему ее там вобще нет а вот эта CreateDir(dirName); работет Вот ответ: одна из первых ссылок в Яндексе. В Delphi 5 функция DirectoryExists находится в модуле FileCtrl, а не в SysUtils, куда она потом переехала. Вообще, советую использовать Delphi 7 (как достаточно популярную до сих пор) или одну из RAD-студий, например, 2007 (последняя не юникодовская).
|
|
| |
Александр5 | Дата: Четверг, 21 Февраля 2013, 19:37 | Сообщение # 32 |
частый гость
Сейчас нет на сайте
| Вообще, советую использовать Delphi 7 (как достаточно популярную до сих пор) или одну из RAD-студий, например, 2007 (последняя не юникодовская).
пасибо но делфи 7 у меня вирусная диск купил 150 нелицензионный падла мало того не совместима с виндой 7 так еще после установки 3 недели и винда литит. также код от 5 и 7 несовпадает а вобще желательно 7 но не нужна образ диска маленьким весом под виндовс 7 х64 и 86 и 32 короче на все и еще я тут запись класса сделал так мне не верится что данные будут весить 1 кб вот код
Код unit UN2_Object;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, Buttons, ComCtrls, ExtDlgs; type TObject_obj=class(TObject) Kartinka:tbitmap; Names:string[20]; typesPO:BOOLEAN; tormoz_procent:integer; BOOLEAN_OBJECT:boolean; TYPE_OBJECT:BYTE; STOP_PERSONAZ:BOOLEAN; end; implementation
end.
unit UN_OBject;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, Buttons, ComCtrls, ExtDlgs,UN2_Object;
type TForm1 = class(TForm) BitBtn1: TBitBtn; Panel1: TPanel; Image1: TImage; Panel2: TPanel; RadioGroup2: TRadioGroup; RadioGroup1: TRadioGroup; Timer1: TTimer; CheckBox1: TCheckBox; Label1: TLabel; TrackBar1: TTrackBar; Label2: TLabel; OBR: TEdit; Label3: TLabel; Label4: TLabel; OpenPictureDialog1: TOpenPictureDialog; Button1: TButton; CheckBox2: TCheckBox; Label5: TLabel; procedure TrackBar1Change(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure BitBtn1Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; const OBR_YES:STRING='(Да)'; OBR_NO:STRING='(Нет)'; var Form1: TForm1; Object1:TObject_obj; FILE_Object:file of TObject_obj; il:integer; fs: TSearchRec; implementation
{$R *.DFM}
procedure TForm1.TrackBar1Change(Sender: TObject); begin Label1.Caption:=inttostr(TrackBar1.Position)+' %'; end;
procedure TForm1.Timer1Timer(Sender: TObject); begin If RadioGroup1.ItemIndex=0then begin panel2.Enabled:=false; end; If RadioGroup1.ItemIndex=1then begin Panel2.Enabled:=true; end; If CheckBox1.Checked=true then begin Label2.Caption:=OBR_YES;end else begin Label2.Caption:=OBR_NO;end; If CheckBox2.Checked=true then begin Label5.Caption:=OBR_YES;end else begin Label5.Caption:=OBR_NO;end; end;
procedure TForm1.BitBtn1Click(Sender: TObject); begin If openpicturedialog1.Execute then begin image1.Picture.LoadFromFile(openpicturedialog1.FileName); end; end;
procedure TForm1.Button1Click(Sender: TObject); begin Object1:=TObject_obj.Create; Object1.Kartinka:=tbitmap.Create; Object1.Kartinka:=image1.Picture.Bitmap; Object1.Names:=OBR.Text; case Radiogroup1.ItemIndex of 0:begin Object1.typesPO:=false; end; 1:begin Object1.typesPO:=true; end; end; if Object1.typesPO=true then begin object1.tormoz_procent:=0; object1.BOOLEAN_OBJECT:=false; object1.TYPE_OBJECT:=0; object1.STOP_PERSONAZ:=false; end else begin object1.tormoz_procent:=trackbar1.Position; object1.BOOLEAN_OBJECT:=checkbox1.Checked; Object1.TYPE_OBJECT:=Radiogroup2.ItemIndex+1; object1.STOP_PERSONAZ:=checkbox2.Checked; end; //Remained to do record assignfile(FILE_Object,extractfilepath(application.ExeName)+'\TObject_A\TObject_'+OBR.Text+'_'+inttostr(il+1)+'.TOBJ'); rewrite(FILE_Object); write(FILE_Object,Object1); closefile(FILE_Object); //Destroy picture object1.Kartinka.FreeImage; Object1.Free; end;
procedure TForm1.FormCreate(Sender: TObject); begin if FindFirst(extractfilepath(application.ExeName)+'\TObject_A\'+'*.TOBJ',faAnyFile - faDirectory - faVolumeID, fs) = 0 then begin repeat inc(il); until FindNext(fs) <> 0; findclose(fs); end; end;
end.
Поможешь чтото тут не так.
Кстати если код в делфи 5 и 7 индетичный и совпадает то дай ылку на 7 но маленький файл и совместимую с виндой 7 также как 5 рад у меня есть но на нем игру будет сложнее разрабатывать 1 код сильно отличается 2 стилей на много больше прийдется делать если учесть что на многие компоненты нельзя цвет поставить рад у меня XE3 и delphi 5
|
|
| |
TimKruz | Дата: Пятница, 22 Февраля 2013, 00:27 | Сообщение # 33 |
старожил
Сейчас нет на сайте
| Делфи 7 полностью совместима с семёркой, виндоус предупреждение первый раз выводит, но Делфи работает отлично. Правда, ей нужны права администратора для работы с файлами в её папке. Диск ты зря покупал, уж лучше оригинальный образ скачать. Данные у тебя килобайт весят, потому что ты используешь tbitmap, а там много информации хранится, да и сами битмапы много места занимают. Вообще, я уже говорил, что стандартными средствами не всегда удобно в файл писать, т.к., например, пустые строки и массивы будут забивать пространство в файле нулями.
|
|
| |
Александр5 | Дата: Пятница, 01 Марта 2013, 15:26 | Сообщение # 34 |
частый гость
Сейчас нет на сайте
| Цитата (TimKruz ) Диск ты зря покупал, уж лучше оригинальный образ скачать
Почему зря вобщета я за него 300 рублей платил и там за исключением этого 10 языков я его из за бейсика брал както интерисовался но это интерприатор и игру нормальную там не написать
Цитата (TimKruz ) Данные у тебя килобайт весят, потому что ты используешь tbitmap, а там много информации хранится, да и сами битмапы много места занимают. Вообще, я уже говорил, что стандартными средствами не всегда удобно в файл писать, т.к., например, пустые строки и массивы будут забивать пространство в файле нулями.
А как делать но игру я даже незнаю пока я решил сделать объекты для редактора карт редактор объектов но как сделать запись чтобы был бинарный файл мне честно говоря хочется поскорее закончить с редактором объектов и перейти редактору карт а ушь потом начать писать игровой движок 1 версия расчитываю сделать простую без стилей только компоненты и код.
Цитата (TimKruz ) Делфи 7 полностью совместима с семёркой, виндоус предупреждение первый раз выводит, но Делфи работает отлично. Правда, ей нужны права администратора для работы с файлами в её папке.
А есть маленький образ и без вирусов ну скажем весом 100 мб но не достигающие 200 вобще 5 весит 64 мб образ диска
Добавлено (22.02.2013, 08:57) ---------------------------------------------
Добавлено (22.02.2013, 16:55) --------------------------------------------- Короче исправил код но даже рекорд по человечески не может записываться что еще можно использовать для бинарного файла чтобы сделать объекты для карты Код unit UN_OBject;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, Buttons, ComCtrls, ExtDlgs,UN2_Object,FileCtrl;
type TForm1 = class(TForm) BitBtn1: TBitBtn; Panel1: TPanel; Image1: TImage; Panel2: TPanel; RadioGroup2: TRadioGroup; RadioGroup1: TRadioGroup; Timer1: TTimer; CheckBox1: TCheckBox; Label1: TLabel; TrackBar1: TTrackBar; Label2: TLabel; OBR: TEdit; Label3: TLabel; Label4: TLabel; OpenPictureDialog1: TOpenPictureDialog; Button1: TButton; CheckBox2: TCheckBox; Label5: TLabel; procedure TrackBar1Change(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure BitBtn1Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; const OBR_YES:STRING='(Да)'; OBR_NO:STRING='(Нет)'; var Form1: TForm1; Object1:TObject_obj; FILE_Object:file of TObject_obj; il:integer; fs: TSearchRec; implementation
{$R *.DFM}
procedure TForm1.TrackBar1Change(Sender: TObject); begin Label1.Caption:=inttostr(TrackBar1.Position)+' %'; end;
procedure TForm1.Timer1Timer(Sender: TObject); begin If RadioGroup1.ItemIndex=0then begin panel2.Enabled:=false; end; If RadioGroup1.ItemIndex=1then begin Panel2.Enabled:=true; end; If CheckBox1.Checked=true then begin Label2.Caption:=OBR_YES;end else begin Label2.Caption:=OBR_NO;end; If CheckBox2.Checked=true then begin Label5.Caption:=OBR_YES;end else begin Label5.Caption:=OBR_NO;end; end;
procedure TForm1.BitBtn1Click(Sender: TObject); begin If openpicturedialog1.Execute then begin image1.Picture.LoadFromFile(openpicturedialog1.FileName); end; end;
procedure TForm1.Button1Click(Sender: TObject); var r:word; begin Object1.Kartinka:=tbitmap.Create; Object1.Kartinka:=image1.Picture.Bitmap; Object1.Names:=OBR.Text; case Radiogroup1.ItemIndex of 0:begin Object1.typesPO:=false; end; 1:begin Object1.typesPO:=true; end; end; if Object1.typesPO=true then begin object1.tormoz_procent:=0; object1.BOOLEAN_OBJECT:=false; object1.TYPE_OBJECT:=0; object1.STOP_PERSONAZ:=false; end else begin object1.tormoz_procent:=trackbar1.Position; object1.BOOLEAN_OBJECT:=checkbox1.Checked; Object1.TYPE_OBJECT:=Radiogroup2.ItemIndex+1; object1.STOP_PERSONAZ:=checkbox2.Checked; end; assignfile(FILE_Object,extractfilepath(application.ExeName)+'TObject_A\TObject_'+OBR.Text+'_'+inttostr(il)+'.TOBJ'); rewrite(FILE_Object); write(FILE_Object,Object1); closefile(FILE_Object); end;
procedure TForm1.FormCreate(Sender: TObject); begin if FindFirst(extractfilepath(application.ExeName)+'\TObject_A\'+'*.TOBJ',faAnyFile - faDirectory - faVolumeID, fs) = 0 then begin repeat inc(il); until FindNext(fs) <> 0; findclose(fs); end; end;
end.
unit UN2_Object;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, Buttons, ComCtrls, ExtDlgs; Type TObject_obj=record Kartinka:tbitmap; Names:string[20]; typesPO:BOOLEAN; tormoz_procent:integer; BOOLEAN_OBJECT:boolean; TYPE_OBJECT:BYTE; STOP_PERSONAZ:BOOLEAN; end; implementation
end.
Добавлено (22.02.2013, 17:30) --------------------------------------------- Я нашел как решиить проблему нашел пример и теперь я буду записывать класс
Добавлено (22.02.2013, 18:03) --------------------------------------------- Слушайти тут проблемка вот код записи строки мне нужно сделать запись не только строки Код procedure TMaterials.WriteString(Stream: TStream; Str: string); var I : Integer; begin I := Length(Str); Stream.Write(I, SizeOf(I)); Stream.Write(Str[1], I); end;
Как можно сделать еще на такие данные Integer,Byte,boolean,Word и т.п поможете
тоже самое и для чтения надо вот код чтения строки Код function TMaterials.ReadString(Stream: TStream): string; var I : Integer; begin Stream.Read(I, SizeOf(I)); SetLength(Result, I); Stream.Read(Result[1], I); end; Добавлено (25.02.2013, 10:59) --------------------------------------------- Как можно сделать мигание Модальной формы при попытки перейти на другие формы когда открыта модальная форма То есть как можно отловить это а с миганием формя я сам разберусь а вот как отловить переход на другие формы в модальной форме с помощью таймера Добавлено (01.03.2013, 15:26) --------------------------------------------- Скажите мне как можно в текстовике сделать поиск слова и как определить на какой строке это слово находится.
И еще как считывать определенную строчку а не подряд
Сообщение отредактировал Александр5 - Пятница, 22 Февраля 2013, 18:07 |
|
| |
TimKruz | Дата: Пятница, 01 Марта 2013, 23:31 | Сообщение # 35 |
старожил
Сейчас нет на сайте
| Цитата (Александр5) Скажите мне как можно в текстовике сделать поиск слова и как определить на какой строке это слово находится. И еще как считывать определенную строчку а не подряд Поиск подстроки в строке - pos(), возвращает номер символа. Если используешь TMemo или ему подобный компонент - у него есть Lines, это массив строк string. Номер строки соответствует номеру в массиве. То есть ищешь слово, проходя в цикле с помощью pos по всем строкам lines.
|
|
| |
Александр5 | Дата: Пятница, 01 Марта 2013, 23:37 | Сообщение # 36 |
частый гость
Сейчас нет на сайте
| Нет я в текстовике это значит в текстовом файле но я тут подумал что лучше сделать рекордом рекорд будет содержать весь текст игры но сейчас занят редактором карт и никак не могу найти формулу для того чтобы узнать в какую ячейку засовывать картинку
Масив ячеек будет выглядить так
Maps_Games : array of Bitmap;
Или может предложете как лучше сделать массив карты с ячейками
1 файл = 1 карта
И еще мне нужно узнать что использовать для записи картинок
решил для записи переменных Integer, boolean, string, byte использовать рекорд но для картинок не подойдет нужен спицальная запись с памятью например TMemoryStream
|
|
| |
TimKruz | Дата: Суббота, 02 Марта 2013, 14:59 | Сообщение # 37 |
старожил
Сейчас нет на сайте
| Цитата (Александр5) Нет я в текстовике это значит в текстовом файле Ну строчки в текстовом файле разделяются специальной парой символов, проверить конец строки можно командой eoln(файловаяпеременная), которая вернёт true, если достигнут конец строки и false в противном случае (кстати, eof(файловаяпеременная) работает так же, как eoln, только проверяет конец файла и работает с любыми типами файлов). Тогда для поиска по файлу можно либо читать по строкам (readln(str)) и искать в каждой строке через pos() необходимый текст, или перебирать все символы по одиночке и вручную сравнивать, а конец строки регистрировать через eoln. Цитата (Александр5) лучше сделать рекордом рекорд будет содержать весь текст игры Как ты себе это представляешь? Цитата (Александр5) Масив ячеек будет выглядить так Maps_Games : array of Bitmap; Или может предложете как лучше сделать массив карты с ячейками Вот представь себе: ты хочешь сделать поле 10x10 клеток, на котором растёт трава. Трава представляет собой одну картинку, которая всегда одинаковая. Если использовать твой способ, то получится 10x10=100 экземпляров TBitmap, т.е. 100 копий одной и той же картинки, и если картинка весит 100 КБ, то поле 10x10 будет весить чуть меньше 10 МБ. Поэтому этот способ крайне нерационален и вообще не имеет смысла. Правильнее делать массив типа map:array of word (лучше двумерный, если карта двумерная (типа с видом сверху), то есть нужно map:array of array of word, а длина такого динамического массива задаётся как length(map,a,b), где a и b - размеры получаемой матрицы). Именно word нужен если типов клеток будет больше 256, если меньше - хватит и byte. В итоге получаем массив чисел. Но что эти числа обозначают и как ими пользоваться? Всё просто. Числа обозначают тип клетки и/или соответствующую ей картинку, например, если map[2,4]=0, то клетка с координатами (2,4) имеет тип "простая трава" и при прорисовке карты нужно будет рисовать в месте этой клетки картинку травы. Но где хранятся картинки? А они хранятся в "банке картинок", например, таком: Image:array of TBitmap, в котором индекс картинки обозначает её тип, т.е. в ячейке Image[0] хранится изображение травы, которое должно быть нарисовано в клетке (2,4). В итоге получаем 10x10x1=100 Б (это если byte, а если word - то 200 Б) плюс 100 КБ сама картинка. Цитата (Александр5) И еще мне нужно узнать что использовать для записи картинок Слушай, ты слишком слабо разбираешься в программировании, так что используй TBitmap.LoadFromFile('имяфайлакартинки.bmp') для загрузки картинок (и, соответственно TBitmap.SaveToFile('имяфайлакартинки.bmp') для сохранения, если очень надо) и не парься с тем, что картинки всем будут видны. Ты ведь редактор делаешь к своему движку, значит, любой должен мочь редактировать карты и картинки, поэтому будет логично хранить их открыто (например, в папке images). Цитата (Александр5) нужен спицальная запись с памятью например TMemoryStream Ну вот сам найди и прочитай статьи по TMemoryStream и разберёшься с ним сам. А если не разберёшься - сделай как-нибудь по-проще...
Сообщение отредактировал TimKruz - Суббота, 02 Марта 2013, 15:02 |
|
| |
Александр5 | Дата: Суббота, 02 Марта 2013, 15:17 | Сообщение # 38 |
частый гость
Сейчас нет на сайте
| TimKruz, Спасибо но Word не хранит картинок или ты предлагаешь чтобы ворд хранил код картинки например трава или еще что либо а Image:array of TBitmap хранил картики 1 тип = 1 картинка
правдо эфективно но тут вопрос зайдет о количестве картинок
map:array of array of word это массив который будет хранить тип картинки с заданными координатами
Image:array of TBitmap это сами картинки
Вопрос пойдет о том как на имадже показывать эти картики если учесть что не будет известно в каких координатах какая картинка
это прийдется делать определенный информационный масив и его запись для этого
Запись как ты говоришь сделать я не могу так как это карта а не набор картинок если карта будет состоятьиз усков картинок то сами карты будут состоять из файлов и их будет более 1000.
Как ты себе это представляешь?
Ну сделать редктор текст едит он будетпризводить загрузку и сохранения рекорда. В рекорде будут несколько 10 масивов string для текста.
несколько 10 потомучто хочу чтобы все по полочкам лежало
|
|
| |
TimKruz | Дата: Суббота, 02 Марта 2013, 21:57 | Сообщение # 39 |
старожил
Сейчас нет на сайте
| Цитата (Александр5) Вопрос пойдет о том как на имадже показывать эти картики если учесть что не будет известно в каких координатах какая картинка Можно, например, так: Код const mapw=100; maph=200; //ширина и высота карты imgw=40; imgh=40; //ширина и высота картинок карты <---> for x:=0 to mapw do for y:=0 to maph do Display.Canvas.Draw(x*imgw,y*imgh,image[map[x,y]]); Image[map[x,y]] выдаёт битмап, соответствующий конкретной клетке поля, а Canvas.Draw(x,y,tgraphic) рисует его на компоненте Display (TImage).
|
|
| |
Александр5 | Дата: Среда, 06 Марта 2013, 19:23 | Сообщение # 40 |
частый гость
Сейчас нет на сайте
| Ответ те на это пожалуйста
1)
Код unit Unit1;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, Menus, AppEvnts, TeeProcs, TeEngine, Chart,UN_Type,UN_DrawGrid;
type TForm1 = class(TForm) Create_Maps_btn: TButton; Mini_Map_scrl1: TScrollBox; Maps1: TImage; MX_lbl: TLabel; MY_lbl: TLabel; MX1Y1X2Y2_lbl: TLabel; Memo1: TMemo; PopupMenu1: TPopupMenu; N1: TMenuItem; PopupMenu2: TPopupMenu; N2: TMenuItem; N3: TMenuItem; Button1: TButton; Image1: TImage; Edit1: TEdit; Edit2: TEdit; Button2: TButton; procedure Create_Maps_btnClick(Sender: TObject); procedure Maps1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure N1Click(Sender: TObject); procedure Maps1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure Button2Click(Sender: TObject); procedure Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
private { Private declarations } procedure MouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
// îáðàáîòêà ïðîêðóòêè êîëåñà âíèç procedure MouseWheelDown(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
// îáðàáîòêà ïðîêðóòêè êîëåñà ââåðõ procedure MouseWheelUp(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean); public { Public declarations } end; var Form1: TForm1; DStream:TDStream; i,o,p:Integer; IM1:Integer; IM2:Integer; cs,str1,lki:string; KX,KY,JX,JY:Integer; lk:Word;{Ïåðåìåííàÿ êîòîðàÿ áóäåò õðàíèòü êîä êàðòèíêè} files:TextFile; krt,krg:integer; Bmp_Image:array of string; fs:TSearchRec; list:TStringList; implementation
{$R *.DFM} procedure TForm1.Create_Maps_btnClick(Sender: TObject); begin i := StrToInt(InputBox('Ââåäèòå ÷èñëî ÿ÷ååê','Ââîä ÷èñëà ÿ÷ååê','32')); if i >= 20 then begin DStream.InputStream:=TMemoryStream.Create; AssignFile(files,ExtractFilePath(Application.ExeName)+'Maps_Bin.bin'); ReWrite(files); CloseFile(files); o:=i*50; Form1.Maps1.Height:=o; Form1.Maps1.Width:=o; Form1.Mini_Map_scrl1.Visible:=True; SetLength(DStream.Maps_Cells,i,i); DStream.InputStream.Free; end else begin AllocConsole; cs:='\\Èçâèíèòå ÷èñëî äîëæíî áûòü áîëüøå 20. Ââåäèòå ÷èñëî ÿ÷ååê'; CharToOEM (PChar(cs), PChar(cs)); Writeln(cs); readln; repeat lki:='Èçâèíèòå. Íî äëÿ çàêðûòèÿ êîíñîëüíîãî ïðèëîæåíèÿ íóæíî ââåñòè Close'; CharToOEM (PChar(lki), PChar(lki)); Writeln(lki); readln(str1); until AnsiUpperCase(str1) = 'CLOSE'; FreeConsole; end; end;
procedure TForm1.Maps1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin Form1.MX_lbl.Caption:=IntToStr(X); Form1.MY_lbl.Caption:=IntToStr(Y); end;
procedure TForm1.N1Click(Sender: TObject); begin Memo1.Lines.SaveToFile(ExtractFilePath(Application.ExeName)+'Èíôîðìàöèÿ.txt'); end;
procedure TForm1.Maps1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin KX:= X div 50; KY:= Y div 50; Form1.MX1Y1X2Y2_lbl.Caption:='X = '+inttostr(KX)+':'+ 'Y = ' + inttostr(KY); end;
procedure TForm1.FormCreate(Sender: TObject); begin list:=TStringList.Create; if FindFirst(ExtractFilePath(Application.ExeName)+'Bitmaps_Png\'+'*.bmp',faAnyFile-faDirectory-faVolumeID, fs)=0 then begin repeat inc(krg); list.Add(fs.Name); until FindNext(fs)<>0; findclose(fs); end; Form1.OnMouseWheel:=MouseWheel; Form1.OnMouseWheelDown:=MouseWheelDown; Form1.OnMouseWheelUp:=MouseWheelUp; Form1.AutoSize:=True; end;
procedure TForm1.MouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean); begin Form1.Image1.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'Bitmaps_Png\'+list.Strings[krt]); Form1.Edit2.Text:=list.Strings[krt]+' : '+inttostr(krt); end;
procedure TForm1.MouseWheelDown(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean); begin If krt > 0 then begin krt := krt - 1; end; Form1.Edit1.Text:='Ââíèç'; end;
procedure TForm1.MouseWheelUp(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean); begin if krt < krg -1 then begin krt := krt + 1; end; Form1.Edit1.Text:='Ââåðõ'; end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin Form1.OnMouseWheel:=nil; Form1.OnMouseWheelDown:=nil; Form1.OnMouseWheelUp:=nil; Application.Terminate; end;
procedure TForm1.Button2Click(Sender: TObject); begin Form1.OnMouseWheel:=nil; Form1.OnMouseWheelDown:=nil; Form1.OnMouseWheelUp:=nil; Application.Terminate; end;
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Create_Draw_Grid_Modal('Âûáåðèòå êàðòèíêó'); end;
end. procedure TForm1.MouseWheelUp(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean); begin if krt < krg -1 then begin krt := krt + 1; end; Form1.Edit1.Text:='Ââåðõ'; end;
procedure TForm1.MouseWheelDown(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean); begin If krt > 0 then begin krt := krt - 1; end; Form1.Edit1.Text:='Ââíèç'; end; Он почемута прибавляет 2 а не 1
2)
Как можно сделаить загрузку всех картинок в Draw grid используя Find first
функции FindFirst,FindNext,FindClose я знаю но незнаю как организовать загрузку картинок в DrawGrid
Сообщение отредактировал Александр5 - Среда, 06 Марта 2013, 19:24 |
|
| |
|