Рассылка закрыта
При закрытии подписчики были переданы в рассылку "Раскрутка сайтов и заработок в сети Интернет" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
← Октябрь 2006 → | ||||||
1
|
||||||
---|---|---|---|---|---|---|
2
|
4
|
5
|
6
|
7
|
8
|
|
10
|
11
|
12
|
13
|
14
|
15
|
|
16
|
17
|
18
|
19
|
21
|
22
|
|
23
|
24
|
25
|
26
|
27
|
28
|
29
|
31
|
Статистика
0 за неделю
От идеи до игры Выпуск 5
От идеи до игры Выпуск 5 Игровое меню Часть 2 В сегодняшнем уроке, мы доделаем наконец меню, так что бы все кнопочки работали, а
не только выход, а еще переходы по меню. Не думайте, что урок будет маленький, что
бы реализовать переход по меню, придется попотеть! Ну а теперь начнем наш
урок! Как вы помните, в прошлом уроке мы научились создавать "меню",
это не совсем меню конечно, назвать таковым его можно
с натяжкой, там было лишь три кнопки созданные типом TButton,
который там же был описан в прошлом уроке. ВНИМАНИЕ!!! Если Вы только
подписались на эту рассылку, обязательно прочитайте четвертый урок, иначе Вам
будет сложно понять материал, изложенный в этом уроке, а лучше все выпуски. Итак, сначала пару слов про структуру программы. Теперь программа имеет более
наглядный вид т.к. используется модульная структура. Если кто не понял, то
теперь код будет не в одном большом файле, а в нескольких маленьких. Так будет
нагляднее и понятнее. Вот первый модуль: program Game; uses OMEGA in
'Headers\Engine\OMEGA.pas', OMEGA_CLASSES in 'Headers\Engine\OMEGA_CLASSES.pas', MAIN in
'Headers\Main\MAIN.pas', //
Основные процедуры движка PRESENT in
'Headers\Main\PRESENT.pas', //
Показывает первые два экрана SCENES in
'Headers\Main\SCENES.pas', //
Работа с экранами MENU in
'Headers\Main\MENU.pas', //
Работа с меню GUI in
'Headers\Main\GUI.pas'; // Графические элементы var Timer: CTimer; begin Timer := CTimer.Create; // Создание класса таймера Timer.SetOnTimer( @Main_Proc ); // Установка
процедуры для таймера Timer.SetInterval( 16 ); // Интервал срабатывания Screen.SetOptions( 800, 600, 32, 0,
True, False ); Engine.RegProcedure( SYS_FASTINIT, @Main_Load ); Engine.RegProcedure( SYS_INIT, @Main_Init ); Engine.RegProcedure( SYS_DRAW, @Main_Draw ); Engine.RegProcedure( SYS_QUIT, @Main_Quit ); Engine.SetOptions(False, False); // Зпрет выхода по
Alt-F4 Window.SetToCenter; // Установка окна по
центру экрана Window.ShowCursor( False
); //Отоброжать курсор Engine.Init; // Запуск движка end. Здесь
объяснять особо нечего, из нового только добавились новые подгружаемые модули,
а вот куда же делись движковые" процедуры Init, Draw, и Quit. Они перебрались в новый модуль, который называется MAIN.pas, теперь в нем будут содержатся все "движковые" процедуры. Вот его код: unit interface uses OMEGA; procedure MAIN_Load; procedure MAIN_Init; procedure MAIN_Draw; procedure MAIN_Proc; procedure MAIN_Quit; const // Размер курсора мыши MouseCurSizeX = 60; MouseCurSizeY = 48; var //
Переменные, которые будут хранить идентификаторы текстур TexLoading, TexCopyright, TexCursor01: PTexture; implementation uses SCENES; procedure MAIN_Load; begin RANDOMIZE; // Загружаем текстуры TexLoading := Tex_LoadFromFile(
'Data\GFX\GUI\loading.jpg', $000000, TEX_DEFAULT_2D
); TexCopyright := Tex_LoadFromFile(
'Data\GFX\GUI\copyright.jpg', $000000, TEX_DEFAULT_2D
); TexCursor01 := Tex_LoadFromFile( 'Data\GFX\GUI\cursor.bmp',
$000000, TEX_DEFAULT_2D ); end; procedure MAIN_Init; Begin End; procedure MAIN_Draw; Begin Scene_Draw( Scene_Now ); // Рисуем сцену, на которую ссылается Scene_New End; procedure MAIN_Proc; Begin Scene_Proc( Scene_Now ); // Обробатываем события от сцены, на которую ссылается Scene_Now End; procedure MAIN_Quit; Begin OE_Quit; End; end. Все процедуры Вам уже
знакомы! MAIN_Load -
загружает текстуры первой необходимости, в данном случае текстуры загрузка,
логотип производителя и текстуру курсора мыши. MAIN_Draw -
выполняет процедуру Scene_Draw которая в свою очередь рисует сцену,
более подробно об этом Вы узнаете чуть позже, когда мы будем разбирать модуль SCENES.pas. MAIN_Proc -
обрабатывает события, в данном случае выполняется процедура Scene_Proc которая
обрабатывает события сцены. Все остальное уже понятно, я объяснял это не
однократно в предыдущих уроках. Теперь перейдем к
следующему модулю, он называется PRESENT.pas
и занимается он тем, что выводит первые две сцены, это текстура загрузки и
логотип производителя. Что бы всем было понятно, сцена это один игровой экран,
т.е. то что Вы видите на экране это сцена, если экран
сменился то это уже другая сцена. Вот сам модуль: unit PRESENT; interface uses OMEGA, OMEGA_CLASSES; procedure PRESENT_Draw; procedure PRESENT_Proc; var //
Переменные, которые будут хранить идентификаторы текстур TexGameLogo, TexButton01, TexButton02, TexButton03: PTexture; implementation uses SCENES, MAIN; var Stage : Byte = 0; // Переключатель, между отображением текстур загрузка и логотипа производителя Alpha : Integer = 255; // Содержит
значения альфа-канала Load : Boolean; // Проверка, загружены ли текстуры procedure PRESENT_Draw; Begin case Stage of // Вывод текстуры загрузка 0: SSprite_Draw( TexLoading,
400 - 200, 300 - 60, 400, 85, Alpha, 0 ); // Вывод лого производителя 1: SSprite_Draw( TexCopyright,
400 - 128, 300 - 128, 256, 256, Alpha, 0 ); end; End; procedure PRESENT_Proc; Begin if ( Stage = 0 ) and ( not Load ) Then // Если текстуры не загружены, загружаем их begin TexGameLogo := Tex_LoadFromFile(
'Data\GFX\GUI\logo.jpg', $000000, TEX_DEFAULT_2D ); TexButton01 := Tex_LoadFromFile( 'Data\GFX\GUI\Btn01.jpg', $000000,
TEX_DEFAULT_2D ); TexButton02 := Tex_LoadFromFile( 'Data\GFX\GUI\Btn02.jpg', $000000,
TEX_DEFAULT_2D ); TexButton03 := Tex_LoadFromFile( 'Data\GFX\GUI\Btn03.jpg', $000000,
TEX_DEFAULT_2D ); LOAD := TRUE; // Текстуры загружены Scene_Start( gsPresent ); // Выполняем сцену gsPresent exit; // Выходим из процедуры end; DEC( Alpha ); // Уменьшаем альфа-канал на 1 if Alpha <= 0 Then // Если альфа-канал меньше 0, то рисуем следующий экран begin Alpha := 255; INC( Stage ); // Увеличиваем
переключатель экранов на 1 end; // Если оба экрана уже были показаны, рисуем меню if (Stage = 2) or (Key_Down( K_Space
)) then Scene_Start(
gsMenu_Main ); End; end. Здесь две процедуры одна
рисует сцену, а другая обрабатывает ее события, из названия процедур
думаю понятно какая что делает. Попробуйте сами разобраться в этом модуле, он
довольно прост. Но если у Вас возникнут вопросы непременно пишите мне (rain.zero@main.ru) и не забывайте
заглядывать на сайт http://mgteam.fasttech.ru,
там Вы можете скачать все примеры к урокам, прочитать все мои статьи и задать
свой вопрос на форуме. Дальше у нас идет
процедура вывода кнопочки и процедура, выполняющая сцену при нажатии кнопки, я
их вставил в отдельный модуль GUI.pas,
отныне в нем будут содержаться все элементы оформления игры. Вот собственно и
сам модуль: unit GUI; // Графические
элементы interface uses SCENES, OMEGA; type TButton
= object //
объект кнопки public Button_X,
// размер кнопки по X Button_Y:
Integer; // размер кнопки
по Y ButtonEnable:
Boolean; // Состояние
кнопки (активна/не активна) TextureView,
// текстура для обычной кнопки TextureFocus,
// текстура для кнопки при наведенном курсоре мыши TextureDisable:
PTexture; // текстура для
не активно кнопки Proc: Procedure; // процедуру, которая
будет выполняться при нажатии на кнопку procedure Draw(Button: TButton); // процедура отрисовки кнопки end; procedure Btn_Scene; implementation 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 ); if Mouse_Click(M_LButton) then // если нажата левая кнопка мыши, выполняется прикрепленная
процедура begin Button.Proc; end; end //
если мышь не на кнопке выводим обычную текстуру кнопки else SSprite_Draw(
Button.TextureView, Button.Button_X,
Button.Button_Y, 220, 50 ) // если кнопка не активна... else SSprite_Draw( Button.TextureDisable, Button.Button_X,
Button.Button_Y, 220, 50 ); end; procedure Btn_Scene; // Выполняет сцену, на которую ссылается Scene begin Scene_Start( Scene ); end; end. Что здесь можно
объяснить, процедуру кнопки мы пропустим т.к. я ее объяснил в прошлом уроке, а
вот процедуру Btn_Scene
я сейчас объясню. Как Вы помните в прошлом уроке было
две кнопки, одна не активная, а при нажатии на другую происходил выход из игры.
Зачем же я создал процедуру для выполнения другой процедуры, ведь при указании
процедуры можно просто написать так MyButton.Proc := @Scene_Start( Scene ); Как оказалось нельзя, все
дело в том, что переменну-процедуру нельзя указывать
с параметром, Delphi ее не воспринимает, поэтому
нужна дополнительная процедура Btn_Scence.
Если Вы плохо поняли, что я имею ввиду то посмотрите
последний модуль SCENES.pas,
он поставит все на свои места. Вот его код: unit SCENES; interface type TGameScene = ( gsPresent, // Первоночальная загрузка и т.п. gsMenu_Main, // Основное меню gsMenu_Two, // Вотрой экран gsQuit ); procedure Scene_Start(
gs : TGameScene ); procedure Scene_Draw(
gs : TGameScene ); procedure Scene_Proc(
gs : TGameScene ); var Scene_Now : TGameScene = gsPresent; // Говорит какую сцену выполнять Scene: TGameScene; // Указывает сцену для кнопки Btn_Scene implementation uses PRESENT, var MyButton: TButton; procedure Scene_Start(
gs : TGameScene ); Begin Scene_Now := gs; end; procedure Scene_Draw(
gs : TGameScene ); Begin case Scene_Now
of // Проверка на выбранную сцену gsPresent: PRESENT_Draw; gsMenu_Main: begin SSprite_Draw( TexGameLogo, 0, 0, 800, 150,
255, 0 ); // Выводим логотип игры // устанавливаем текстуры для кнопок MyButton.TextureView := TexButton01; MyButton.TextureFocus
:= TexButton02; MyButton.TextureDisable := TexButton03; // задаем координаты для кнопки MyButton.Button_X := 290; MyButton.ButtonEnable := True; //
делаем кнопку активной Scene := gsMenu_Two; // Говорим на какую сцену мы хотим перейти MyButton.Proc := @Btn_Scene; // Переход на сцену MyButton.Button_Y := 275; MyButton.Draw( MyButton ); // Рисуем кнопку Scene := gsQuit; // Говорим на какую сцену мы хотим перейти MyButton.Proc := @Btn_Scene; // Переход на сцену MyButton.Button_Y := 350; MyButton.Draw( MyButton ); // Рисуем кнопку // Рисуем курсор SSprite_Draw( TexCursor01, Mouse_X - 18, Mouse_Y - 18, MouseCurSizeX, MouseCurSizeY, 255 ); end; // Сцена второго экрана gsMenu_Two: begin MyButton.Button_X := 570; MyButton.Button_Y := 540; Scene := gsMenu_Main; MyButton.Proc := @Btn_Scene; MyButton.ButtonEnable := True; MyButton.Draw( MyButton ); SSprite_Draw( TexCursor01, Mouse_X - 18, Mouse_Y - 18, MouseCurSizeX, MouseCurSizeY, 255 ); end; end; End; procedure Scene_Proc(
gs : TGameScene ); Begin //
Обработка событий сцен case gs
of gsPresent: PRESENT_Proc; gsQuit:
MAIN_Quit; end; End; end. Здесь создается тип TGameScene, в нем указаны
все игровые экраны. Scene_Start -
запускает сцену, в данном уроке она особо не нужна и трудно понять,
зачем она вообще нужна, зачем же она нужна я обьясню
в следующем уроке. Scene_Draw - рисует
сцены gsPresent, gsMenu_Main и gsMenu_Two, а что в этих
сценах рисуется, думаю понятно, в первой рисуются первые двсе
сцены загрузка и логотип производителя. Во второй рисуется лого игры и две кнопки по нажатию на первую Вы попадаете в сцену
gsMenu_Two, в при
нажатии на другую происходит выход из игры. В третьей рисуется одна
кнопка для возврата в предыдущее меню. Вот и все, процедура простая с
процедурой вывода спрайтов Вы знакомы, в данном случие она выводит лого игры, и с
заполнением типа TButton Вы тоже знакомы из прошлого
урока. Scene_Proc -
обработчик событий сцен, если выполняется сцена gsPresent он запускает обработчик для нее,
если gsQuit то
обработчик не запускается т.к. для это
процедуры его не, а просто производится выход из игры. Вот и все программа,
посидите над ней поэкспериментируйте над кнопками и экранами, посмотрите как
что работает, если у Вас есть вопросы непременно пишите
(rain.zero@mail.ru) и не забывайте про сайт
http://mgteam.fasttech.ru. А это все на сегодня урок для Вас подготовил
Insiderb0t 'aka' Гарунович
Евгений. До скорых встреч, друзья! |
В избранное | ||