Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.53 MB
Время: 0.017 c
3-1174906022
Павел Калугин
2007-03-26 14:47
2007.06.17
Как в MSSQL выполнисть несколько действий подряд разделенных go


1-1176984924
Диамонд
2007-04-19 16:15
2007.06.17
Передача параметров в процедуру или функцию


6-1164722681
стьюдентЪ
2006-11-28 17:04
2007.06.17
Не приходит текст посланый по сокету


9-1146012342
KiberKot
2006-04-26 04:45
2007.06.17
Книга по OGL


4-1167870999
Альберт
2007-01-04 03:36
2007.06.17
Почему кнопка не становится прозрачной?