Отправляет email-рассылки с помощью сервиса Sendsay

Как заработать в интернет

  Все выпуски  

От идеи до игры Выпуск 4


От идеи до игры

Выпуск 4

 

Скачать  готовый пример

 

В первом уроке, я описал структуру уроков. Будем считать, что первая часть на этом закончена, точнее она закончилась наверное еще в первом уроке, т.к. он и был вводным, а затем мы сразу взялись за работу с текстурами. Раз уж я немного поспешил, значит можно еще немного увеличить темп! Запускать движок мы умеем, с текстурами работать мы тоже можем, по этому можно заняться созданием игрового интерфейса. Но сначала нужно определится, что же за игру мы будем делать. Что же решать вам! Ваши предложения присылайте мне на rain.zero@mail.ru. Грандиозные проекты не предлагайте, будем писать, что ни будь типа тетриса, крокоида или другой популярной мини-игры.

Какую игру делать мы будем еще неизвестно, но урок писать нужно. Раз так займемся все-таки интерфейсом будущей игры!

При создании игры существует масса мелочей, которые нужно учитывать. Будет ли игра в оконном или полноэкранном режиме, возможна ли смена разрешения экрана или количества цветов. Если да, то в некоторых случаях придется подгонять текстуры под каждое разрешение экрана, т.к. например, если маленькую текстуру растянуть слишком сильно она будет казаться размытой. Так же если Вам нужно вывести текст на экран, то для каждого разрешения экрана его размер нужно задавать отдельно, т.к. если при разрешении 640x480 он выглядит нормально, то при 1024x768 он будет слишком маленьким. С этими и другими тонкостями Вам придется столкнутся не один раз.

Подумав немного, я решил, что без ООП жить я не могу. Я старался писать обычно линейно, что бы всем было понятно, но у меня не получилось. Сегодня мы немного коснемся ООП, но модуль OMEGA_CLASSES.pas мы использовать не будем.

Думаю нужно дать немного вводного материала по ООП. Начнем с того, что ООП расшифровывается как Объектно-Ориентированное Программирование. Это значит, что структура программы строится из готовых объектов. На пример, думаю все знают язык программирования QBasic, он является линейным языком программирования, хотя не совсем в нем можно использовать процедуры. Но дело не в этом, в QBasic программист мог использовать только процедуры, для создания подпрограмм и когда их набиралось слишком много, в них можно было просто «заблудится», даже если программист использовал несколько подключаемых хедеров. А чем же хорош ООП, спросите Вы. ООП хорош тем, что все эти горы процедур можно упорядочить более удобным образом. Допустим, если мы создаем кнопку, то у нас должно быть три процедуры Init – для установки параметров кнопки. Draw – для отрисовки кнопки и Proc – для обработки нажатия на кнопку. А если у Вас много подобных процедур, например для создания других элементов управления, таких как чек-бокс нужны те же процедуры и во всем этом можно запутаться. В ООП все проще, Вы можете создать объект, для Вашей кнопки, допустим TButton и все процедуры для него будут вызываться следующим образом Button.Init, Button.Draw, Button.Proc, согласитесь нагляднее. В последствии объект можно наследовать, изменяя необходимые параметры. Другими словами объект можно модифицировать, превратив кнопку в чек-бокс. Как раз в Delphi используется ООП и все его VCL-компоненты используют ООП. Надеюсь все поняли, но если нет, пишите мне на мыло rain.zero@mail.ru.

Теперь мы можем перейти к уроку. Сегодня Вы сможете лучше понять работу таких процедур движка, как Load, Init, Draw, Quit и работу таймера.

Создаем титульный экран игр и меню!

 

program Game;

 uses

OMEGA in 'OMEGA.pas'; // подключаем хедер движка

 

type TButton = object // объект кнопки

public

Button_X, // размер кнопки по X

Button_Y: Integer; // размер кнопки по Y

ButtonEnable: Boolean; // Состояние кнопки (активна/не активна)

TextureView, // текстура для обычной кнопки

TextureFocus, // текстура для кнопки при наведенном курсоре мыши

TextureDisable: PTexture; // текстура для не активно кнопки

Proc: Procedure; // процедуру которая будет выполнятся при нажатии на кнопку

 

procedure Draw(Button: TButton); // процедура отрисовки кнопки

end;

 

var

MyTimer : PTimer;

 

// Переменные, которые будут хранить идентификаторы текстур

Tex_Title,

Tex_Btn01,

Tex_Btn02,

Tex_Btn03 : PTexture;

MyButton: TButton; // переменная-наследник объекта

 

procedure Load;

Begin

End;

 

procedure Quit;

Begin

OE_quit; // выходим из игры

End;

 

procedure Init;

Begin

// Загружаем текстуры

Tex_Title := Tex_LoadFromFile( 'title.bmp', // Где файл текстуры

$000000, // Цвет прозрачности - черный

TEX_DEFAULT_2D ); // Загрузка со стандартными

// параметрами для OpenGL

Tex_Btn01 := Tex_LoadFromFile( 'Btn01.bmp', $FFFFFF, TEX_DEFAULT_2D );

Tex_Btn02 := Tex_LoadFromFile( 'Btn02.bmp', $FFFFFF, TEX_DEFAULT_2D );

Tex_Btn03 := Tex_LoadFromFile( 'Btn03.bmp', $FFFFFF, TEX_DEFAULT_2D );

End;

  

procedure TButton.Draw(Button: TButton);

// процедура отрисовки кнопки

begin

if ButtonEnable = True then // проверка состояния кнопки

// проверка, находтся ли курсор мыши на кнопке

if (Mouse_X >= Button.Button_X) and (Mouse_X <= Button.Button_X + 220) and (Mouse_Y >= Button.Button_Y) and (Mouse_Y <= Button.Button_Y + 50) then

begin // если да, то рисуем соответствующую текстуру

SSprite_Draw( Button.TextureFocus, Button.Button_X, Button.Button_Y, 220, 50, 255, 0, FX_DEFAULT );

if Mouse_Click(M_LButton) then // если нажата левая кнопка мыши, выполняется прикрепленная процедура

begin

Button.Proc;

end;

end

// если мышь не на кнопке выводим обычную текстуру кнопки

else SSprite_Draw( Button.TextureView, Button.Button_X, Button.Button_Y, 220, 50, 255, 0, FX_DEFAULT )

// если кнопка не активна...

else SSprite_Draw( Button.TextureDisable, Button.Button_X, Button.Button_Y, 220, 50, 255, 0, FX_DEFAULT );

end;

 

procedure Draw;

Begin

// рисуем текстуру с названием игры

SSprite_Draw( Tex_Title, 0, 0, 800, 150, 255, 0, FX_DEFAULT );

 

// устанавливаем текстуры для кнопок

MyButton.TextureView := Tex_Btn01;

MyButton.TextureFocus := Tex_Btn02;

MyButton.TextureDisable := Tex_Btn03;

 

// задаем координаты для кнопки

MyButton.Button_X := 290;

MyButton.Button_Y := 275;

 

MyButton.ButtonEnable := True; // делаем кнопку активной

MyButton.Proc := @Quit; // при нажатии выполнится процедура выхода

MyButton.Draw( MyButton ); // рисуем кнопку

 

// сами догадайтесь, что здесь происходит!

MyButton.Button_Y := 350;

MyButton.ButtonEnable := False;

MyButton.Proc := @Quit;

MyButton.Draw( MyButton );

End;

 

procedure Timer1;

Begin

// По нажатию Escape завершаем работу

if Key_Down( K_ESCAPE ) Then OE_Quit;

End;

 

begin

 // Создаем таймер

MyTimer := Timer_Create( @Timer1, 10, 0 );

 

// Назначаем "системные" процедуры

OE_RegProcedure( SYS_FASTINIT, @Load );

OE_RegProcedure( SYS_INIT, @Init );

OE_RegPRocedure( SYS_DRAW, @Draw );

OE_RegPRocedure( SYS_QUIT, @Quit );

 

OE_SetScreenOptions( 800, 600, 32, 0, TRUE, FALSE );

OE_ShowCursor( True ); //Отоброжать курсор

 

//Запускаем движок

OE_Init;

end.

 

Я решил написать весь код целиком, т.к. это довольно сложный урок для новичков.

Теперь перейдем к описанию кода.

 

type TButton = object // объект кнопки

public

Button_X, // размер кнопки по X

Button_Y: Integer; // размер кнопки по Y

ButtonEnable: Boolean; // Состояние кнопки (активна/не активна)

TextureView, // текстура для обычной кнопки

TextureFocus, // текстура для кнопки при наведенном курсоре мыши

TextureDisable: PTexture; // текстура для не активно кнопки

Proc: Procedure; // процедуру которая будет выполнятся при нажатии на кнопку

 

procedure Draw(Button: TButton); // процедура отрисовки кнопки

end;

 

Здесь мы создаем объект для кнопки, это похоже на объявление переменных и процедур. На самом деле так и есть, только они принадлежат к объекту TButton и для обращения к ним нужно создать переменную типа TButton. Например, Button: TButton. Обращаются к переменным или процедурам объекта нужно следующим образом, пишем Button. после точки автоматически откроется список всех переменных и процедур, содержащихся в объекте.

В процедуре TButton.Draw все должно быть понятно. Остается только объяснить значение некоторых переменных и процедур.

Mouse_X и Mouse_Y - содержат в себе координаты курсора мыши!

Mouse_Click – возвращает True если кнопка мыши нажата или False если не нажата. Возможные параметры для процедуры M_RBUTTON – правая кнопка мыши, M_LBUTTON – левая кнопка мыши, M_MBUTTON – средняя кнопка мыши.

 

Вот и все на сегодня. Думаю, этот урок Вам понравится, т.к. он не такой скучный как три предыдущих! Пишите rain.zero@mail.ru. Не забывайте заходить на сайт, там вы сможете скачать рабочие примеры для уроков (http://megames.hut2.ru).

До следующей недели!

Рассылки Subscribe.Ru
От идеи до игры

В избранное