Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2007.06.17;
Скачать: [xml.tar.bz2];

Вниз

Карточная игра   Найти похожие ветки 

 
Филипок:)   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.053 c
2-1179926857
Oleg_teacher
2007-05-23 17:27
2007.06.17
DBLookupComboBox


3-1175072882
Xmen
2007-03-28 13:08
2007.06.17
проверка базы для соединения


15-1179844620
Calibr
2007-05-22 18:37
2007.06.17
Соединение с Интернетом


15-1179836833
oldman
2007-05-22 16:27
2007.06.17
Прикольная игра... :)


2-1179816234
unnamed777
2007-05-22 10:43
2007.06.17
GetFileSize





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский