Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.03.2009, 22:06   #1
Алекс Ялта
Пользователь
 
Аватар для Алекс Ялта
 
Регистрация: 27.01.2009
Сообщений: 97
Лампочка Использование собственного типа для юнита

В этой теме хочу описать пример создания типов юнита. Этот процесс подробно описан в теме "Уроки по созданию игр для новичков" (пост 154), но многим новичкам усвоить его сходу сложно. Сужу по себе и коллеге, который попросил создать тему. Поэтому упрощу пример и покажу как на практике использовать созданный юнит в таймере игры.

Для начала создаем сам тип юнита
Код:
type
  TGUnit = record       // сам тип наших юнитов
  Uuses:boolean;       // флаг использования юнита
  Ugo: boolean;        // флаг перемещения юнита
  Ux,Uy:integer;       // координаты юнита
  Utexture: Tbitmap; // внешний вид юнита (текстура)
end;
Далее создаем массив юнитов. В моем примере юнитов будет 3:

Код:
 UnitsMas: array [0..2] of TGunit;
Теперь в процедуре создания формы (FormCreate) запишем ссылку на текстуры наших юнитов:

Код:
for i:=0 to 2 do
begin
with UnitsMas[i] do
 begin
  Utexture:=Tbitmap.Create;
  Utexture.LoadFromFile('pic/'+IntToStr(i)+'.bmp');
 end;
end;
Теперь запустим "сердце" нашей игре) То есть создадим таймер и в нем пропишем варианты управления юнитами:

Код:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
MapBuf.Canvas.Rectangle(0,0,400,300); // MapBuf - буфер
for i:=0 to 2 do
begin
with UnitsMas[i] do
begin
if Uuses then // если какой то юнит включен, то
begin
MapBuf.Canvas.Draw(Ux,Uy,Utexture); // нарисуем его в его позиции 
if Ugo then begin // если мы ему разрешим идти, то он будет идти
Ux:=Ux+1;
end;
end;
end;
end;
form1.Canvas.Draw(0,0,MapBuf);
end;
Теперь остается просто давать команды юнитам. В примере это происходит при нажатии кнопок. Так что поместите на форму кнопку и в процедуре её нажатия, запишите код:

Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
UnitsMas[1].Uuses:=true; // введем в игру юнит под номером 1
UnitsMas[1].Ux:=0;  // зададим ему
UnitsMas[1].Uy:=0; // координаты
end;
Теперь поместите на форму еще одну кнопку и запишите в ней такой код:
Код:
procedure TForm1.Button2Click(Sender: TObject);
begin
UnitsMas[1].Uuses:=false;
end;
В итоге первой кнопкой мы вводим юнит в игру, а второй выводим.

Последний раз редактировалось Алекс Ялта; 25.03.2009 в 22:27.
Алекс Ялта вне форума Ответить с цитированием
Старый 25.03.2009, 22:12   #2
Алекс Ялта
Пользователь
 
Аватар для Алекс Ялта
 
Регистрация: 27.01.2009
Сообщений: 97
По умолчанию

Вот весь исходный код:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TGUnit = record    // сам тип наших юнитов
  Uuses:boolean;     // флаг использования юнита
  Ugo: boolean;      // флаг перемещения юнита
  Ux,Uy:integer;     // координаты юнита
  Utexture: Tbitmap; // внешний вид юнита
end;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    Button8: TButton;
    Button9: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure Button8Click(Sender: TObject);
    procedure Button9Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  UnitsMas: array [0..2] of TGunit; // массив юнитов
  mapBuf: Tbitmap; // буфер для первичной отрисовки объектов
  i: integer;
implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
MapBuf:=Tbitmap.Create; // создадим буфер
MapBuf.Width:=400;
MapBuf.Height:=300;

for i:=0 to 2 do // создадим текстуры для юнитов
begin
with UnitsMas[i] do
 begin
  Utexture:=Tbitmap.Create;
  Utexture.LoadFromFile('pic/'+IntToStr(i)+'.bmp');
 end;
end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
MapBuf.Canvas.Rectangle(0,0,400,300); // фон буфера
for i:=0 to 2 do
begin
with UnitsMas[i] do
begin
if Uuses then
begin
MapBuf.Canvas.Draw(Ux,Uy,Utexture);
if Ugo then begin
Ux:=Ux+1;
end;
end;
end;
end;
form1.Canvas.Draw(0,0,MapBuf); // в конце выводим на форму сам буфер
end;

procedure TForm1.Button1Click(Sender: TObject); // воодим в игру юнит 1
begin
UnitsMas[1].Uuses:=true;
UnitsMas[1].Ux:=0;
UnitsMas[1].Uy:=0;
end;

procedure TForm1.Button2Click(Sender: TObject); // выводим из игры юнит 1
begin
UnitsMas[1].Uuses:=false;
end;

procedure TForm1.Button3Click(Sender: TObject);// вводим 2 юнит
begin
UnitsMas[2].Uuses:=true;
UnitsMas[2].Ux:=100;
UnitsMas[2].Uy:=0;
end;

procedure TForm1.Button4Click(Sender: TObject);// выводим 2 юнит
begin
UnitsMas[2].Uuses:=false;
end;

// разрешим движение юниту 1
procedure TForm1.Button5Click(Sender: TObject);
begin
UnitsMas[1].Ugo:=true;
end;
// запретим  движение юниту 1
procedure TForm1.Button6Click(Sender: TObject);
begin
UnitsMas[1].Ugo:=false;
end;

procedure TForm1.Button7Click(Sender: TObject);
begin
UnitsMas[2].Ugo:=true;
end;

procedure TForm1.Button8Click(Sender: TObject);
begin
UnitsMas[2].Ugo:=false;
end;

procedure TForm1.Button9Click(Sender: TObject);
begin
UnitsMas[2].Ux:=100;
UnitsMas[2].Uy:=0;
end;

// в процедуре закрытия окна очистим память
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
MapBuf.Free;
for i:=0 to 2 do
UnitsMas[i].Utexture.Free;
end;

end.

Последний раз редактировалось Алекс Ялта; 25.03.2009 в 22:17.
Алекс Ялта вне форума Ответить с цитированием
Старый 25.03.2009, 22:23   #3
Алекс Ялта
Пользователь
 
Аватар для Алекс Ялта
 
Регистрация: 27.01.2009
Сообщений: 97
По умолчанию

Здесь исходник с картинками для наглядности
Вложения
Тип файла: zip type Unit.zip (198.7 Кб, 20 просмотров)
Алекс Ялта вне форума Ответить с цитированием
Старый 25.03.2009, 22:43   #4
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

Алекс Ялта спс за урок. Познавательно.
Будь проще и люди к тебе потянутся
spamer вне форума Ответить с цитированием
Старый 25.03.2009, 22:43   #5
Levsha100
Заблокирован
Старожил
 
Регистрация: 20.07.2008
Сообщений: 4,032
По умолчанию

Можно вопросик А что если картинки вынести в отдельный массив а не хранить в записи?
Мне кажется будет рациональнее
Levsha100 вне форума Ответить с цитированием
Старый 25.03.2009, 22:55   #6
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

Цитата:
Сообщение от Levsha100 Посмотреть сообщение
Можно вопросик А что если картинки вынести в отдельный массив а не хранить в записи?
Мне кажется будет рациональнее
А смысл заводить еще массив? Какая из этого будет рациональность, в данном случае? Как по мне, то дополнительный массив тут ни к чему.
Будь проще и люди к тебе потянутся
spamer вне форума Ответить с цитированием
Старый 25.03.2009, 23:04   #7
Levsha100
Заблокирован
Старожил
 
Регистрация: 20.07.2008
Сообщений: 4,032
По умолчанию

Я имею ввиду случай когда будет много одинаковых юнитов
Levsha100 вне форума Ответить с цитированием
Старый 26.03.2009, 07:49   #8
Shadow_1329
Форумчанин
 
Аватар для Shadow_1329
 
Регистрация: 23.02.2009
Сообщений: 237
По умолчанию

Спасибо тебе, коллега за урок. Мне оч нужна была эта информация.
Shadow_1329 вне форума Ответить с цитированием
Старый 26.03.2009, 11:15   #9
Алекс Ялта
Пользователь
 
Аватар для Алекс Ялта
 
Регистрация: 27.01.2009
Сообщений: 97
По умолчанию

Цитата:
Сообщение от Levsha100 Посмотреть сообщение
Можно вопросик А что если картинки вынести в отдельный массив а не хранить в записи?
Мне кажется будет рациональнее
Вы правы. Если по задумке должно быть много юнитов с одинаковой текстурой, нужно создать массив картинок. И под любого юнита просто делать ссылку на тип текстуры. Но это отдельный пример, в своем я не реализовал эту идею. Вы можете выложить модернизированный свой пример в этой теме
Алекс Ялта вне форума Ответить с цитированием
Старый 26.03.2009, 11:16   #10
Алекс Ялта
Пользователь
 
Аватар для Алекс Ялта
 
Регистрация: 27.01.2009
Сообщений: 97
По умолчанию

Цитата:
Сообщение от Shadow_1329 Посмотреть сообщение
Спасибо тебе, коллега за урок. Мне оч нужна была эта информация.
Пожалуйста. Будем учится дальше и делиться опытом)
Алекс Ялта вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Использование функции MID для диапазона данных NikolayGVB Microsoft Office Excel 2 14.01.2009 13:01
Использование проц. KeyDown для DBGrid Максим_Леонидович Общие вопросы Delphi 3 22.07.2008 03:31
использование процедур и функций для работы с массивами.....Паскаль.... КиношкА Помощь студентам 6 13.01.2008 14:23