![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Карточная игра [Delphi, Windows]
Филипок:) © (2006-07-30 17:44:00)Привет всем,я решил написать карточную игру, и у меня возникли проблемы. У меня есть 54 фотографии карт и 54 image и мне нужно что бы в них загружались картинки карт, причем при каждом запуске игры должны появляться разные карты.
P.S. Наверно вопрос дурацкий но я ещё учусь, так что не обежайтесь :)
Rial (2006-07-31 02:52:00) [1]Одна карта.
Лежит по адресу
"Cards\00.jpg"
Загрузка:
For I:=0 to 0 do begin
Cards[I]:=TImage.Create(Nil);
Cards[I].Left:=10;
Cards[I].Top:=10; //и т.п., прочие настройки
Cards[I].Picture.LoadFromFile('Cards\00.jpg');
end;
Филипок:) (2006-07-30 21:46:00) [2]я имел в виду готового кода для всёй игы
Филипок:) (2006-07-30 21:42:00) [3]готового кода мне не надо, но я не совсем понял что вы сказали, если код не большой то можно пример загрузки одной карты(а то понять не могу как её загружать).
Rial (2006-07-30 20:50:00) [4]P.S. Извини, но готового кода я тебе не дам.
А ты, я так понимаю, именно его ждешь.
Только советы и ответы на конкретные вопросы.
Rial (2006-07-30 20:47:00) [5]Ну, да ...
Ладно, давай так.
Ты видишь в описании класса формы TForm1
переменные Imgae1 .. Image52 ?
Да, это именно переменные, только вот свойства для них
инициализируются не вручную, а загрущаются из *.dfm,
а в ран - тайм - из соотв. области памяти.
Но у тебя есть уже массив, состоящий из 54 карт (исправь
на 52, извини, я не в курсе, сколько там карт).
И при создании формы загружаешь ты картинки именно в
этот массив TImage.
А на форме - совсем другие картинки, в которые ты ничего не загрузил.
Вывод: удалить с формы все картинку в дизайнере,
а отображать именно те, что находятся в массиве.
А для этого им надо после создания еще присвоить кучу свойств,
как то Left, Top, Width и п.т., все то, что ты делал в дизайнере,
все то же нужно сделать после создания каждой картинки.
Как это оптимальнее сделать - думай сам, скажу только,
что если получаем в инициализации положения и свойств картинок
более 20- 30 строк - значит, ты пошел неверным путем.
Почему нельзя использовать дизайнер ?
Причин много. Все они не очень важные, но в сумме набегает.
1. Трудно получить доступ с картинкам. Придется все равно
запизивать их в массив.
2. Кушаем размер исполняемого файла.
3. Сложно изменить количество карт - придется добавлять новые
картинки на форму, а тут - увеличил размер массива - и все тип топ.
4. Читабельность кода !
Еслии ее нет, и ты забросишь проект на месяц, потом
ты не вспомнищь о чем была речь и преидется переписывать многое заново.
Я сам порой переписывал тысячи строк, так как забывал ставить комментарии.
Филипок:) (2006-07-30 19:52:00) [6]Теперь прга выгледит так, но ни чего не работает на верно я что то не написал посмотри.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, jpeg, ExtCtrls, StdCtrls, Buttons;
Const MaxCards = 4;
Type
TCardId = 0..MaxCards - 1;
TCards = Array[TCardId] of TImage;
Type
TCardRihe = Array[TCardId] of TCardId;
type
TForm1 = class(TForm)
Image1: TImage;
Image2: TImage;
Image3: TImage;
Image4: TImage;
Image5: TImage;
Image6: TImage;
Image7: TImage;
Image8: TImage;
Image9: TImage;
Image10: TImage;
Image11: TImage;
Image12: TImage;
Image13: TImage;
Image14: TImage;
Image15: TImage;
Image16: TImage;
Image17: TImage;
Image18: TImage;
Image19: TImage;
Image20: TImage;
Image21: TImage;
Image22: TImage;
Image23: TImage;
Image24: TImage;
Image25: TImage;
Image26: TImage;
Image27: TImage;
Image28: TImage;
Image29: TImage;
Image30: TImage;
Image31: TImage;
Image32: TImage;
Image33: TImage;
Image34: TImage;
Image35: TImage;
Image36: TImage;
Image37: TImage;
Image38: TImage;
Image39: TImage;
Image40: TImage;
Image41: TImage;
Image42: TImage;
Image43: TImage;
Image44: TImage;
Image45: TImage;
Image46: TImage;
Image47: TImage;
Image48: TImage;
Image49: TImage;
Image50: TImage;
Image51: TImage;
Image52: TImage;
Label1: TLabel;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Cards : TCards;
CardRihe : TCardRihe;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
i:integer;
begin
For I:=Low(TCardId) to High(TCardId) do begin
Cards[I]:=TImage.Create(Owner);
Cards[I].Picture.LoadFromFile('Cards\'+IntToHex(I,2)+'.jpg');
end;
end;
procedure Swap(Const A, B : TCardId);
Var Buf : TCardId;
i,j:integer;
begin
Buf:=CardRihe[A];
CardRihe[A]:=CardRihe[B];
CardRihe[B]:=Buf;
For I:=Low(TCardId) to High(TCardId) do
CardRihe[I]:=I;
For I:=Low(TCardId) to High(TCardId) do
For J:=I+1 to High(TCardId) do
If (Random(2) = 0)then Swap(I, J);
end;
procedure TForm1.FormDestroy(Sender: TObject);
var
i:integer;
begin
For I:=Low(TCardId) to High(TCardId) do
Cards[I].Free;
end;
end.
Филипок:) (2006-07-30 19:37:00) [7]I know english but i dont know how correct a mistake, sorry.
Rial (2006-07-30 19:21:00) [8]Ты не достал.
Удручает нежелание проводить эксперименты,
без которых никуда, а также цитирования ошибок.
Ведь по сути об ошибке уже все сказано.
Не знаешь английский - учи. Или пользуйся переводчиком.
Я выбрал первое, второй язык не помешает.
Если ткнуть по процедуре левой кнопкой мыши с зажатым Ctrl,
то попадешь на ее описание.
Если она описана, конечно.
Либо пиши название, ставь скобку и жди ... появится подсказка, что делать дальше.
Rial (2006-07-30 19:16:00) [9]
> Cards[I]:=TImage.Create;(Not enough actual parameters)
Извиняюсь, сам я год TImage не юзал.
Cards[I]:=TImage.Create(Owner);
Здесь Owner - это Nil, если затем в OnDestroy идет
For I:=Low(TCardId) to High(TCardId) do
Cards[I].Free;
Либо Application, тогда самому можно не удалять картинки.
For I:=Low(TCardId) to High(TCardId) do begin(For loop control variable must be simple local variable).
Рискну предположить, что у тебя I - глобальная переменная.
Это нехорошо. Объяви ее в той же процедуре, где она и используется.
Если таких процедур много - в каждой объявляй отдельно.
Филипок:) (2006-07-30 19:11:00) [10]Код не верен выдаёт:
For I:=Low(TCardId) to High(TCardId) do begin(For loop control variable must be simple local variable)
Cards[I]:=TImage.Create;(Not enough actual parameters)
Прости я наверно достал, но я хочу напсать игру под названием "Карты" я её придумал пьяным прогуливая физ-культуру
Rial (2006-07-30 19:11:00) [11]function BitBlt(DestDC: HDC; X, Y, Width, Height: Integer; SrcDC: HDC;
XSrc, YSrc: Integer; Rop: DWORD): BOOL; stdcall;
Назначение можно увидеть из описания.
DestDC - контекст, на который ты выводишь растр.
В твоем случае это form.Handle.
X, Y, Width, Height - результирующий прямоугольник.
SrcDC - Bitmap.Handle.
Остальное проверь сам как работает.
Если поймешь сам, запомнишь навсегда.
Что там у тебя не работает не скажу, отсюда твой код видно плохо, и вечер уже ))
Филипок:) (2006-07-30 19:01:00) [12]На верно ты прав насчёт Timage но у меня код с BitBlt тоже не работает.
Rial (2006-07-30 18:56:00) [13]Они нигде не загружаются в TImage.
Забудь ты про эти TImage.
Рисуй изображения из растров прямо на форму в событии OnPaint.
Если уж так приспичило с TImage, то :
TCards = Array[TCardId] of TImage;
...
For I:=Low(TCardId) to High(TCardId) do begin
Cards[I]:=TImage.Create;
Cards[I].Picture.LoadFromFile('Cards\'+IntToHex(I,2)+'.jpg');
end;
Не забудь потом удалить это все.
Возможно, свойство и не Picture, не помню.
Ты имена файлов то согласуй !
Но с TImage твоя карточная игра будет тормозить
как хороший шутер. А думать надо и о бедных юзерах со слабыми компами.
У меня вот не пашут 54 Image. Форма висит капитально при перерисовке.
Проще кода не бывает.
Если тебе этот код не понятен, советую потитать книги о Delphi, VCL, программировании.
Филипок:) (2006-07-30 18:45:00) [14]У меня не загружаются картинки и я не могу понять какая часть кода отвечает за то что бы картинки загружались в Timage; Есть ли код по проще?
Филипок:) (2006-07-30 18:42:00) [15]>>Тут все должно быть ясно.
Не совсем, у меня ни что не загружается.
Rial (2006-07-30 18:36:00) [16]
> Филипок:) (30.07.06 18:28) [4]
>
> У меня ни чего не работает, если можно то пришлите пример
> хотябы с петью картами а дальше я сам.
>
Ничего - это что ? Поконкретнее, пожалуйста.
Пример набирать мне лень.
Если ты решил делать игру, так приложи хоть немного исилий !
Rial (2006-07-30 18:34:00) [17]
> Филипок:) (30.07.06 18:10) [2]
>
> Не получается жалуется на это:
> TCards = Array[TCardsId] of TBitmap;
>
Впредь проверяй чежой код, а не копируй бездумно.
Ну, опечатался, не подсвечивает форум, извини.
TCards = Array[TCardId] of TBitmap;
Я не понимаю, причем тут Jpeg формат.
TImage слишком тяжеловесный компонент, чтобы его использовать в игре.
А уж если их 54 штуки, то это вообще кошмар будет.
Uses Jpeg;
...
procedure TGameEngine.Loading;
Var J : TJpegImage;
begin
...
J:=TJpegImage.Cretae;
Try
For I:=Low(TCardId) to High(TCardId) do begin
Cards[I]:=TBitmap.Create;
J.LoadFromFile('Cards\'+IntToHex(I,2)+'.jpg');
Cards[I].Assign(J);
end;
Finally
J.Free;
end;
...
end;
Тут все должно быть ясно.
Пошли дальше по теме. ))
Филипок:) (2006-07-30 18:28:00) [18]У меня ни чего не работает, если можно то пришлите пример хотябы с петью картами а дальше я сам.
Филипок:) (2006-07-30 18:15:00) [19]BitBlt не получиться у меня все карты в jpeg формате.
Филипок:) (2006-07-30 18:10:00) [20]Не получается жалуется на это:
TCards = Array[TCardsId] of TBitmap;