Текущий архив: 2007.06.17;
Скачать: CL | DM;
Вниз
Карточная игра Найти похожие ветки
← →
Филипок:) (2006-07-30 17:44) [0]Привет всем,я решил написать карточную игру, и у меня возникли проблемы. У меня есть 54 фотографии карт и 54 image и мне нужно что бы в них загружались картинки карт, причем при каждом запуске игры должны появляться разные карты.
P.S. Наверно вопрос дурацкий но я ещё учусь, так что не обежайтесь :)
← →
Rial © (2006-07-30 17:55) [1]Я не ошибся, именно 54 TImage ??
Const MaxCards = 54;
Type
TCardId = 0..MaxCards - 1;
TCards = Array[TCardsId] of TBitmap;
Var
Cards : TCards;
...
OnCreate:
For I:=Low(TCardId) to High(TCardId) do begin
Cards[I]:=TBitmap.Create;
Cards[I].LoadFromFile("Cards\"+IntToHex(I,2)+".bmp");
end;
...
OnDestroy:
For I:=Low(TCardId) to High(TCardId) do
Cards[I].Free;
Про Image забудь.
Испрользуй BitBlt или на крайний случай Cards[I].Draw(..);
Все это дело рисуй в OnPaint формы.
Про разные карты что то не понял.
В смысле, тебе эх перемешать надо ?
Type
TCardsRihe = Array[TCardId] of TCardId;
Здесь у нас колода, где указывается, на каком месте какая карта лежит
Var
CardRihe : TCardRihe;
...
Мешаем колоду
procedure Swap(Const A, B : TCardId);
Var Buf : TCardId;
begin
Buf:=CardTihe[A];
CardRihe[A]:=CardRihe[B];
CardRihe[B]:=Buf;
end;
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);
Тупо, но потом пооптимизируешь на досуге.
← →
Филипок:) (2006-07-30 18:10) [2]Не получается жалуется на это:
TCards = Array[TCardsId] of TBitmap;
← →
Филипок:) (2006-07-30 18:15) [3]BitBlt не получиться у меня все карты в jpeg формате.
← →
Филипок:) (2006-07-30 18:28) [4]У меня ни чего не работает, если можно то пришлите пример хотябы с петью картами а дальше я сам.
← →
Rial © (2006-07-30 18:34) [5]
> Филипок:) (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;
Тут все должно быть ясно.
Пошли дальше по теме. ))
← →
Rial © (2006-07-30 18:36) [6]
> Филипок:) (30.07.06 18:28) [4]
>
> У меня ни чего не работает, если можно то пришлите пример
> хотябы с петью картами а дальше я сам.
>
Ничего - это что ? Поконкретнее, пожалуйста.
Пример набирать мне лень.
Если ты решил делать игру, так приложи хоть немного исилий !
← →
Филипок:) (2006-07-30 18:42) [7]>>Тут все должно быть ясно.
Не совсем, у меня ни что не загружается.
← →
Филипок:) (2006-07-30 18:45) [8]У меня не загружаются картинки и я не могу понять какая часть кода отвечает за то что бы картинки загружались в Timage; Есть ли код по проще?
← →
Rial © (2006-07-30 18:56) [9]Они нигде не загружаются в 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 19:01) [10]На верно ты прав насчёт Timage но у меня код с BitBlt тоже не работает.
← →
Филипок:) (2006-07-30 19:11) [11]Код не верен выдаёт:
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) [12]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.
Остальное проверь сам как работает.
Если поймешь сам, запомнишь навсегда.
Что там у тебя не работает не скажу, отсюда твой код видно плохо, и вечер уже ))
← →
Rial © (2006-07-30 19:16) [13]
> 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 - глобальная переменная.
Это нехорошо. Объяви ее в той же процедуре, где она и используется.
Если таких процедур много - в каждой объявляй отдельно.
← →
Rial © (2006-07-30 19:21) [14]Ты не достал.
Удручает нежелание проводить эксперименты,
без которых никуда, а также цитирования ошибок.
Ведь по сути об ошибке уже все сказано.
Не знаешь английский - учи. Или пользуйся переводчиком.
Я выбрал первое, второй язык не помешает.
Если ткнуть по процедуре левой кнопкой мыши с зажатым Ctrl,
то попадешь на ее описание.
Если она описана, конечно.
Либо пиши название, ставь скобку и жди ... появится подсказка, что делать дальше.
← →
Филипок:) (2006-07-30 19:37) [15]I know english but i dont know how correct a mistake, sorry.
← →
Филипок:) (2006-07-30 19:52) [16]Теперь прга выгледит так, но ни чего не работает на верно я что то не написал посмотри.
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.
← →
Rial © (2006-07-30 20:47) [17]Ну, да ...
Ладно, давай так.
Ты видишь в описании класса формы TForm1
переменные Imgae1 .. Image52 ?
Да, это именно переменные, только вот свойства для них
инициализируются не вручную, а загрущаются из *.dfm,
а в ран - тайм - из соотв. области памяти.
Но у тебя есть уже массив, состоящий из 54 карт (исправь
на 52, извини, я не в курсе, сколько там карт).
И при создании формы загружаешь ты картинки именно в
этот массив TImage.
А на форме - совсем другие картинки, в которые ты ничего не загрузил.
Вывод: удалить с формы все картинку в дизайнере,
а отображать именно те, что находятся в массиве.
А для этого им надо после создания еще присвоить кучу свойств,
как то Left, Top, Width и п.т., все то, что ты делал в дизайнере,
все то же нужно сделать после создания каждой картинки.
Как это оптимальнее сделать - думай сам, скажу только,
что если получаем в инициализации положения и свойств картинок
более 20- 30 строк - значит, ты пошел неверным путем.
Почему нельзя использовать дизайнер ?
Причин много. Все они не очень важные, но в сумме набегает.
1. Трудно получить доступ с картинкам. Придется все равно
запизивать их в массив.
2. Кушаем размер исполняемого файла.
3. Сложно изменить количество карт - придется добавлять новые
картинки на форму, а тут - увеличил размер массива - и все тип топ.
4. Читабельность кода !
Еслии ее нет, и ты забросишь проект на месяц, потом
ты не вспомнищь о чем была речь и преидется переписывать многое заново.
Я сам порой переписывал тысячи строк, так как забывал ставить комментарии.
← →
Rial © (2006-07-30 20:50) [18]P.S. Извини, но готового кода я тебе не дам.
А ты, я так понимаю, именно его ждешь.
Только советы и ответы на конкретные вопросы.
← →
Филипок:) (2006-07-30 21:42) [19]готового кода мне не надо, но я не совсем понял что вы сказали, если код не большой то можно пример загрузки одной карты(а то понять не могу как её загружать).
← →
Филипок:) (2006-07-30 21:46) [20]я имел в виду готового кода для всёй игы
← →
Rial © (2006-07-31 02:52) [21]Одна карта.
Лежит по адресу
"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;
Страницы: 1 вся ветка
Текущий архив: 2007.06.17;
Скачать: CL | DM;
Память: 0.51 MB
Время: 0.041 c