Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > BlitzMax > FAQ и уроки

Ответ
 
Опции темы
Старый 16.10.2007, 18:04   #1
Данил
Модератор
 
Аватар для Данил
 
Регистрация: 11.07.2007
Сообщений: 2,910
Написано 686 полезных сообщений
(для 1,694 пользователей)
Создаём свой Crimsonland.

Привет! Вот помню я , много людей просили у меня исходник arrow – master 2… и некоторые, поиграв, хотели создать нечто подобное. И у многих не получалось…

Вот решил написать туториал, как создать «Crimsonland за час». Конечно, не совсем за час, но можно)))

На данный момент готов сама игра. Далее я буду писать подробно, что в каждой строчке делается. Пока даю саму игру:
туториал.rar

Задавайте вопросы.
(Offline)
 
Ответить с цитированием
Эти 3 пользователя(ей) сказали Спасибо Данил за это полезное сообщение:
G.A.D (06.04.2009), Nex (07.05.2009), Yalenz (08.05.2009)
Старый 16.10.2007, 18:42   #2
dimanche13
Мастер
 
Регистрация: 19.03.2007
Сообщений: 1,039
Написано 153 полезных сообщений
(для 252 пользователей)
Re: Создаём свой Crimsonland.

	Player.x = width*0.5 'Делаем, чтобы положение игрока было точно в центре.
	Player.y = width*0.5
эммм... опечатка
__________________
(Offline)
 
Ответить с цитированием
Старый 16.10.2007, 18:47   #3
IGR
Blitz's Shame !!
 
Регистрация: 31.03.2007
Сообщений: 3,639
Написано 832 полезных сообщений
(для 2,013 пользователей)
Re: Создаём свой Crimsonland.

Прощу в теме до окончания создания туториала особо не флудить.
извени, но Залей НЕ на рапиду !!
оттуда немогу скачать/посмотреть !!
(Offline)
 
Ответить с цитированием
Старый 16.10.2007, 18:54   #4
Данил
Модератор
 
Аватар для Данил
 
Регистрация: 11.07.2007
Сообщений: 2,910
Написано 686 полезных сообщений
(для 1,694 пользователей)
Re: Создаём свой Crimsonland.

Ок.
http://meg.ifolder.ru/3758488
(Offline)
 
Ответить с цитированием
Старый 16.10.2007, 18:58   #5
dimanche13
Мастер
 
Регистрация: 19.03.2007
Сообщений: 1,039
Написано 153 полезных сообщений
(для 252 пользователей)
Re: Создаём свой Crimsonland.

IGR, это другая рапида все норм качается. Данил, я бы сделал по-другому. Приду домой напишу.
__________________
(Offline)
 
Ответить с цитированием
Старый 16.10.2007, 18:58   #6
IGR
Blitz's Shame !!
 
Регистрация: 31.03.2007
Сообщений: 3,639
Написано 832 полезных сообщений
(для 2,013 пользователей)
Re: Создаём свой Crimsonland.

ОК !! совсем другое дело !!
начинаю качать !!
со своей скоростю завтра докачаю, отпишусь !!
(Offline)
 
Ответить с цитированием
Старый 16.10.2007, 21:31   #7
Данил
Модератор
 
Аватар для Данил
 
Регистрация: 11.07.2007
Сообщений: 2,910
Написано 686 полезных сообщений
(для 1,694 пользователей)
Восклицание Re: Создаём свой Crimsonland.

Приступаем. Туториал будет разделен на 7 частей.

ЧАСТЬ 1. Инициализация мира.
ЧАСТЬ 2. Загрузка медиа.
ЧАСТЬ 3. Создания типов, переменных, функций, необходимых для работы игры.
ЧАСТЬ 4. Создания типов для игры
ЧАСТЬ 5. Создание обновления для объектов.
ЧАСТЬ 6. Создание меню.
ЧАСТЬ 7.Цикл для игры.

Первые части и последнии будут легкие. Самая сложная - 5. Так.
Приступаем...



ЧАСТЬ 1. Инициализация мира.

Вначале давайте подумаем, о чем будет наша игра.
Сделаем давайте мы безумную экшн-мясо-кровища-шутер.
По экрану будет бегать чел. Чел этот будет из автомата или из дробовика крошить монстров. Будут декалитры крови. Круто? ;)

Ну. начнеим писать код. Создадим новый файл - file => new. Создали? сохраним его в папку Crimsonland2 (предварительо создав ее ;) ).

Для начала нужно задать расширение экрана. Хранить значения мы будет в константах height , width. Для теста возьмем 1024х768. Пишем:

[blitz]
'ЧАСТЬ 1. Инициализация мира.

'======== КОНСТАНТЫ
Const width=1024 , height=768 'Константы расширения
'======== УСТАНОВКА ИГРЫ
Graphics width,height,32 'Ставим настройки.
[/blitz]

Все. Теперь игра уже представляет собой что-то. Круто? думаю ,пока нет. ;)


ЧАСТЬ 2. Загрузка медиа.


Так. для начала сохраните у себя на компе эти картинки:

Под названием 1.jpg и переместим в папку игры : CrimsonLand2/media/1.jpg . Это у нас будет текстура земли в игре.

Под названием 1.png и переместим в папку игры : CrimsonLand2/media/1.png . Главный герой.

Под названием blood.png и переместим в папку игры : CrimsonLand2/media/blood.png . Кровища для игры.

Под названием bulletPistol.png и переместим в папку игры : CrimsonLand2/media/bulletPistol.png. Пуля.

Под названием button.png и переместим в папку игры : CrimsonLand2/media/Button/button.png. Кнопка.

Под названием buttondown.png и переместим в папку игры : CrimsonLand2/media/Button/buttondown.png. Когда наводим указатель на кнопку.

Под названием buttonexit.png и переместим в папку игры : CrimsonLand2/media/Button/buttonexit.png.

Под названием buttonexitdown.png и переместим в папку игры : CrimsonLand2/media/Button/buttonexitdown.png. Когда наводим указатель на кнопку.

Под названием monster.png и переместим в папку игры : CrimsonLand2/media/monster/monster.png .

Так. все медиа мы вроде загрузили. Сейчас напишем код ,который бы все это загружал...

[blitz]
Global Fonimage = LoadImage ("Media/1.jpg") 'Загружаем текстуру для игры.

Global BulletImage = LoadImage ("Media/bulletPistol.png") 'Загружаем картинку пули.
MidHandleImage BulletImage 'Координаты картинки монстра по центру.

Global PlayerImage = LoadAnimImage ("Media/1.png",68,40,0,8) 'Загружаем картинку для главного игрока.
MidHandleImage PlayerImage 'Делаем координаты картинки по центру.

Global MonsterImage = LoadAnimImage ("Media/Monster/1.png",100,50,0,20) 'Загрузка картинки монстра.
MidHandleImage MonsterImage 'Координаты картинки монстра по центру.

Global BloodImage = LoadImage ("Media/Blood.png")
MidHandleImage BloodImage

Global Button = LoadImage ("Media/Button/button.png") 'Кнопка для начала новый игры.
Global ButtonDown = LoadImage ("Media/Button/buttondown.png")
MidHandleImage Button
MidHandleImage ButtonDown


Global ButtonExit = LoadImage ("Media/Button/buttonexit.png") 'Кнопка для начала новый игры.
Global ButtonExitDown = LoadImage ("Media/Button/buttonexitdown.png")
MidHandleImage ButtonExit
MidHandleImage ButtonExitDown


Global SMonster:TList=New TList
Global SPlayer:TList=New TList 'Листы для объектов.
Global SBullet:TList=New TList
Global SBlood:TList=New TList

[/blitz]

Global - объявляет новую переменную.
LoadImage - загружает картинку.
MidHandleImage - координаты картинки по центру.
TList - листы, списки, в которых будут содержатся данные об наших объектах.

Загрузили в нашу игру мы медиа. Что дальше?

ЧАСТЬ 3. Создания типов, переменных, функций, необходимых для работы игры.


А дальше у нас идет создание необходимого.

[blitz]
Global TipGame 'Для того, чтобы можно было понять, что сейчас происходит. 0- меню. 1- игра.
Global Level = 1000 'Уровень
Global time
Global a
[/blitz]

Объявляем переменные.

[blitz]
'======== ДЛЯ УПРАВЛЕНИЯ СПИСКАМИ
Function UpdateEntities( list:TList )
For Local entity:TEntity=EachIn list
entity.Update
Next
End Function

'======== ТИП ДЛЯ РАБОТЫ С ДРУГИМИ ТИПАМИ
'Чтобы можно было работать с другими типами, необходим этот...
Type TEntity
Field link:TLink
Method Remove()
link.Remove
Sila:-1
End Method
Method AddLast( list:TList )
link=list.AddLast( Self )
End Method
Method Update() Abstract
End Type
[/blitz]

Можно сказать, функция для обновления объектов в списке, а тип для работы функции... вроде...



[blitz]
Function Dn_DrawImage (image, x#, y#, rotat#,level# ) 'Рисуем картинку через функцию.
SetBlend Alphablend
SetRotation rotat
SetAlpha level
DrawImage image, x, y
End Function

Function Dn_DrawAnimImage (image, x#, y#, rotat#,level#, f ) 'Рисуем картинку через функцию.
SetBlend Alphablend
SetRotation rotat
SetAlpha level
DrawImage image, x, y, f
End Function
[/blitz]

Две функции для отрисовки изображений.
Dn_DrawImage - для обычных картинок.
image
x - положение
y - положение
rotat - поворот картинки
level - прозрачность.

Dn_DrawAnimImage - для анимационных картинок.
f - номер кадра.


[blitz]
'======== ОПРЕДЕЛИТЬ УГОЛ МЕЖДУ ТОЧКАМИ
Function Angle!(x0!,y0!,x1!,y1!)
Return ATan2(y1-y0,x1-x0)
End Function
[/blitz]

Функция для определения угла между двумя точками.


Так. завтра у нас будет две части. Самых сложных....
(Offline)
 
Ответить с цитированием
Старый 16.10.2007, 22:06   #8
Данил
Модератор
 
Аватар для Данил
 
Регистрация: 11.07.2007
Сообщений: 2,910
Написано 686 полезных сообщений
(для 1,694 пользователей)
Re: Создаём свой Crimsonland.

ЧАСТЬ 4. Создания типов для игры.


Так. завтрашнего дня я не дождался. Решил сделать 4 часть сегодня. )))

В этой части мы сделаем все необходимые типы для игры:
  1. Герой
  2. Монстр
  3. Пуля
  4. Кровь

Так. Приступим сразу к коду:

[blitz]
Type TPlayer Extends TEntity 'Объявляем тип.
Field X#,Y# 'Положение игрока.
Field Life 'Жизнь.
Field Ang 'Поворот.
Field frame , animnext 'Для анимации.
Field Weapon 'Какое оружие. 0 - автомат. 1 - дробовик
Field Shot 'Когда был произведен предыдузий выстрел.

Method Update() 'Цикл, где будут проходить все действия для
пока здесь ничего не пишем, но сделаем метку.
End Method



Function CreatePlayer:TPlayer( ) 'Функция для создания игрока.
Local Player:TPlayer=New TPlayer 'Создаем игрока.
Player.x = width*0.5 'Делаем, чтобы положение игрока было точно в центре.
Player.y = height*0.5
Player.life = 100 '100 жизней для начала.
Player.AddLast SPlayer 'Добавляем объект в список.
Return Player 'Возвращаем объект.
End Function

End Type
[/blitz]

Type - объявляет тип.
Extends - "привязка". В нашем случае к типу TEntity. Помните, мы такой создали?
Field - знаения для типа.
Function CreatePlayer:TPlayer( ) - Функция для создания объекта - игрока. TPlayer означает, к какому типу относится функция.

Так же у нас для монстра, пули и крови. Только поля аля значения другие и названия. )

Для того, чтобы создать игрока, достаточно ввести TPlayer.CreatePlayer (), но мы это напишем потом.

[blitz]
Type TMonster Extends TEntity 'Объявляем тип.
Field X#,Y# 'Положение объекта.
Field Life 'Жизнь.
Field Ang 'Поворот.
Field frame , animnext 'Для анимации.

Method Update() 'Цикл, где будут проходить все действия для монстра.
пока здесь ничего не пишем, но сделаем метку.
End Method

Function CreateMonster:Tmonster(x#,y#) 'Функция для создания монстра.
Local monster:TMonster=New TMonster 'Создаем игрока.
Monster.x = x
Monster.y = y
Monster.life = 100 '100 жизней для начала.
Monster.AddLast SMonster 'Добавляем объект в список
Return Monster 'Возвращаем объект.
End Function

End Type



[/blitz]

Чтобы создать монстра, надо написать:
TMonster.CreateMonster(х, у)
Х, У - положение монстра. Если мы хотим, чтобы у монстров разные жихни были, или еще что-нибудь, то нужно заместо:
Function CreateMonster:Tmonster(x#,y#)
Monster.life = 100

писать
Function CreateMonster:Tmonster(x#,y#, life)
Monster.life = life


То есть при создании нового монтсра мы будем указывать еще и его количество жизней, но в моем туториаре мы не будем делать этого. )))

[blitz]
Type TBullet Extends TEntity 'Объявляем тип.
Field X#,Y# 'Положение пули.
Field Ang 'Поворот.
Field speed

Method Update() 'Цикл, где будут проходить все действия для пули.
пока здесь ничего не пишем, но сделаем метку.
End Method

Function CreateBullet:TBullet(x#,y#,ang#, speed) 'Функция для создания пули.
Local Bullet:TBullet=New TBullet 'Создаем игрока.
Bullet.x# = x#
Bullet.y# = y#
Bullet.ang = ang
Bullet.speed = speed
Bullet.AddLast SBullet 'Добавляем объект в список
Return Bullet 'Возвращаем объект.
End Function

End Type
[/blitz]

Создаем пулю. Чтобы создать, нужно написать:
TBullet.CreateBullet (x,y,поворот пули, скорость в px)
Правда, делать мы это будем в методе обновлении игрока.

[blitz]
Type TBlood Extends TEntity 'Объявляем тип.
Field X#,Y# 'Положение пули.
Field Ang 'Поворот.
Field Alpha# 'Прозрачность крови.
Field AlphaM# 'Как быстро будет кровь становится прозрачнее

Method Update() 'Цикл, где будут проходить все действия для крови.
пока здесь ничего не пишем, но сделаем метку.
Function CreateBlood:TBlood(x#,y#,m#) 'Функция для создания крови.
Local Blood:TBlood=New TBlood 'Создаем игрока.
Blood.x = x
Blood.y = y
Blood.alpham = m
Blood.alpha = 1
Blood.ang = Rand (360)
Blood.AddLast SBlood 'Добавляем объект в список
Return Blood 'Возвращаем объект.
End Function

End Type
[/blitz]

Типы все похожи ,не правда ли? То же самое и с кровью. Только мы добавили несколько новых значений. Значение alpham, alpha.
Ang у нас будет каждый раз разное. Чтобы кровь была не похоже друг на друга, каждый раз рисуем ее в случайном повороте.

Alpha - при зарисовке будет указыватся, на сколько прозрачной будет кровь. Так же будет как "счетчик". Постепенно это значение будет уменьшатся на alpham, и когда alpha будет меньше или равна 0 ,то удаляем кровь.

Хе. Вы почти создали основу , "каркас" вашей игры. Осталось не так уж и много...

Правда посмотреть пока не на что...
(Offline)
 
Ответить с цитированием
Старый 16.10.2007, 22:54   #9
Данил
Модератор
 
Аватар для Данил
 
Регистрация: 11.07.2007
Сообщений: 2,910
Написано 686 полезных сообщений
(для 1,694 пользователей)
Смущение Re: Создаём свой Crimsonland.

ЧАСТЬ 5. Создание обновления для объектов.


Без обновления объектов у нас игра просто не будет работать. Так давай те же напишем его!

[blitz]
'Движение игрока.
If KeyDown(Key_W) Then Y = Y - 3 ; If animnext < MilliSecs () Then animnext=MilliSecs()+50 ; frame:+1
If KeyDown(Key_S) Then Y = Y + 3 ; If animnext < MilliSecs () Then animnext=MilliSecs()+50 ; frame:+1
If KeyDown(Key_A) Then X = X - 3 ; If animnext < MilliSecs () Then animnext=MilliSecs()+50 ; frame:+1
If KeyDown(Key_D) Then X = X + 3 ; If animnext < MilliSecs () Then animnext=MilliSecs()+50 ; frame:+1

Ang = Angle(x,y,MouseX(),MouseY())'Определяем поворот игрока.

If frame=8 Then frame=0
Dn_DrawAnimImage (playerImage, x, y, ang,1,frame )

If shot < MilliSecs () And MouseDown (1) Then

If weapon = 0 Then shot = MilliSecs () + 50 ; TBullet.CreateBullet (x,y,ang+Rand(-6,6),30)
If weapon = 1 Then shot = MilliSecs () + 500 ; For i = 0 To 10 ; TBullet.CreateBullet (x,y,ang+Rand(-40,40),15) ; Next
End If

If KeyHit (key_f1) Then weapon=0
If KeyHit (key_f2) Then weapon=1

SetRotation 0
DrawText life ,0 , 0
[/blitz]

Так. найдите в коде обновление игрока / type TPlayer => Method Update ()

Там мы оставляли метку. Убираем ее и пишем вышенаписанное .)))
[blitz]
If KeyDown(Key_W) Then Y = Y - 3 ; If animnext < MilliSecs () Then animnext=MilliSecs()+50 ; frame:+1
If KeyDown(Key_S) Then Y = Y + 3 ; If animnext < MilliSecs () Then animnext=MilliSecs()+50 ; frame:+1
If KeyDown(Key_A) Then X = X - 3 ; If animnext < MilliSecs () Then animnext=MilliSecs()+50 ; frame:+1
If KeyDown(Key_D) Then X = X + 3 ; If animnext < MilliSecs () Then animnext=MilliSecs()+50 ; frame:+1
[/blitz]
Перемещение главного игрока. То есть при нажатие на клавишу (W,A,S,D) , у нас изменяются координаты. И так же при нажатие на клавигу у нас происходит смена кадров.

X=X+3 , где 3 - скорость. Изменить, если надо)

If animnext < MilliSecs () Then animnext=MilliSecs()+50 ; frame:+1
Если animnext < с.времени , то animnext = с.время+50мс , кадр = +1

Каждые 50 мс увеличиваем кадр на 1. А всего у нас кадров 8. => если покажется 9 кадр, несуществующий, будет ошибка. Ставим ограничение:
[blitz]
If frame=8 Then frame=0
[/blitz]
(если кадр = 8 , то кадр = 0)

Примечание: отсчет кадров начинается с нуля => 8 кадр - несуществующий.

[blitz]
Dn_DrawAnimImage (playerImage, x, y, ang,1,frame )
[/blitz]

Рисуем анимационную картинку - playerImage . В положении х игрока, у игрока, с поворотом ang. С прозрачностью 1 (непрозрачный) и кадром frame.

[blitz]
Ang = Angle(x,y,MouseX(),MouseY())'Определяем поворот игрока.
[/blitz]

Определяем через нашу функцию поворот между точкой один (главный герой) и точкой два (курсор)

[blitz]
If shot < MilliSecs () And MouseDown (1) Then

If weapon = 0 Then shot = MilliSecs () + 50 ; TBullet.CreateBullet (x,y,ang+Rand(-6,6),30)
If weapon = 1 Then shot = MilliSecs () + 500 ; For i = 0 To 10 ; TBullet.CreateBullet (x,y,ang+Rand(-40,40),15) ; Next
End If
[/blitz]

Если shot меньше с.времени и нажата левая кнопка мыш, то:

если оружие 0 (автомат), то увеличиваем shot, и создаем пулю.
если оружие 1 (дробовик), то увеличиваем shot, и много (11) пуль создаем пулю.

11 потому-что начинается счет с 0 и идет до 10 - 11.

счетчик:
наша переменная содержит число. (системное время)
если системное время больше начего числа, то выполняем действие какое-нибудь, и увеличиваем число на с.время+мс.

[blitz]
If KeyHit (key_f1) Then weapon=0
If KeyHit (key_f2) Then weapon=1
[/blitz]
Если нажимаем клавишу F1, то достаем автомат, или переменная weapon = 0
Если нажимаем клавишу F2, то достаем дробовик, или переменная weapon = 1
[blitz]
SetRotation 0
DrawText life ,0 , 0
[/blitz]

Рисуем жизни. )




Так. Главного героя сделали. Все. перерыв. Идите выпейте чего-нибудь, отдохните)))

Отдохнули? приступаем к монстрам.

[blitz]
Method Update() 'Цикл, где будут проходить все действия для монстра.
If life < 0 Then remove ; Return; If Level>300 Then Level:-5

For Player:TPlayer = EachIn SPlayer
If x > player.x - 30 And x < player.x + 30 And y > player.y - 30 And y < player.y + 30 Then

player.life:-1
TBlood.CreateBlood (player.x,player.y,0.01)
End If
Ang = Angle(x,y,player.x,player.y)'Определяем поворот монстра
Next

x=x+(3.5*Cos(ang))
y=y+(3.5*Sin(ang))


If animnext < MilliSecs () Then animnext=MilliSecs()+50 ; frame:+1
If frame=20 Then frame=0
Dn_DrawAnimImage (monsterimage, x, y, ang,1,frame )

End Method

[/blitz]

Весь код на монстров.
[blitz]
If life < 0 Then If Level>300 Then Level:-5; remove ; Return
[/blitz]
Если жизни меньше 0 ,то :

если у нас скорость появления монстров (Level) больше 300, о умеьшаем ее. (на деле же чем меньше скорость, тем чаще они появляются.)
Удалям объект (через TEntity, по этому не подствечивается)
Возвращаем все.

[blitz]
For Player:TPlayer = EachIn SPlayer
If x > player.x - 30 And x < player.x + 30 And y > player.y - 30 And y < player.y + 30 Then

player.life:-1
TBlood.CreateBlood (player.x,player.y,0.01)
End If
[/blitz]

Смотрим на всех героев главных (а их он у нас один, но можно сделать и больше, только как быть с управлением?)

Если нащ монстр близко к герою :
[blitz]
If x > player.x - 30 And x < player.x + 30 And y > player.y - 30 And y < player.y + 30 Then
[/blitz]
То :
[blitz]
player.life:-1
TBlood.CreateBlood (player.x,player.y,0.01)
[/blitz]
Уменьшаем жизни героя и создаем кровь в позиции героя.

сейчас немного объясню, почему так пишем...

Смотрите, мы в методе игрока писали просто x , а здесь player.x, так?
а х у нас это координата монстра. Дело в том, что если если мы используем значения объекта прямо в его типе, то писать player. и тому подобное не надо. А если мы вызываем значения объекта из другого типа (из монстра вызываем героя), то надо писать player. и тому подобное...

[blitz]
x=x+(3.5*Cos(ang))
y=y+(3.5*Sin(ang))
[/blitz]

Перемещаем монстра относительно его поворота. 3.5 - скорость его. Если надо , можно увеличить или умеьшить...

[blitz]
If animnext < MilliSecs () Then animnext=MilliSecs()+50 ; frame:+1
If frame=20 Then frame=0
Dn_DrawAnimImage (monsterimage, x, y, ang,1,frame )
[/blitz]

Для анимации... думаю, уже не надо расписывать)


ПУЛИ
[blitz]
Method Update() 'Цикл, где будут проходить все действия для пули.
'Если пуля вылетает за пределы карты - удаляем.
If x<-100 Or x>=width+100 Or y>=height Or y<=-100 Then
remove
Return
EndIf

For Monster:TMonster = EachIn SMonster
If x > monster.x - 25 And x < monster.x + 25 And y > monster.y - 25 And y < monster.y + 25 Then
monster.life:-20
TBlood.CreateBlood (x,y,0.001)
remove
Return
End If
Next


x=x+(speed*Cos(ang))
y=y+(speed*Sin(ang))



Dn_DrawImage bulletImage, x, y, ang,1
End Method
[/blitz]
[blitz]
If x<-100 Or x>=width+100 Or y>=height Or y<=-100 Then
remove
Return
EndIf
[/blitz]
Если пуля вылетает за пределы экрана - удаляем.

[blitz]
For Monster:TMonster = EachIn SMonster
If x > monster.x - 25 And x < monster.x + 25 And y > monster.y - 25 And y < monster.y + 25 Then
monster.life:-20
TBlood.CreateBlood (x,y,0.001)
remove
Return
End If
Next
[/blitz]

Обновляем монстров. Если пуля близко к монстру ,то удаляем пулю, добавляе крови.

[blitz]
x=x+(speed*Cos(ang))
y=y+(speed*Sin(ang))
[/blitz]
Перемещаем пулю.
[blitz]
Dn_DrawImage bulletImage, x, y, ang,1
[/blitz]
Рисуем.

КРОВЬ
[blitz]
Method Update() 'Цикл, где будут проходить все действия для крови.
If alpha < 0 Then REmove ; Return
alpha = alpha - alpham
Dn_DrawImage (BloodImage, x, y, ang,alpha )
End Method
[/blitz]

Постепенно делаем кровь прозрачней. (уменьшаем alpha на alpham)
Если прозрачность = 0 (т.е. совсем невидим), то удаляем


Так. можете себя поздравить. Вы полностью сделали каркас вашей игры.

ЧАСТЬ 6. Создание меню.

Ни одна игра не обходится без меню. Так давайте же создадим меню и в нашей игре.

[blitz]
While TipGame <> 1 'Цикл для меню. Пока переменная не равна 1, будет меню.
Cls

Dn_DrawImage (button, width*0.5, height*0.5, 0,1 )
Dn_DrawImage (buttonexit, width*0.5, height*0.5+50, 0,1 )

If MouseX()> (width*0.5)-((ImageWidth(Button))*0.5) And MouseX()< (width*0.5)+((ImageWidth(Button))*0.5) And MouseY()> (height*0.5)-((ImageHeight(Button))*0.5) And MouseY()< (height*0.5)+((ImageHeight(Button))*0.5) Then
'Вот такой мегааццкий код для коллизии кнопка - курсор.
'(width*0.5)-((ImageWidth(Button))*0.5) - ширину * 0.5 - ширину кнопки * 0.5 -- определяем начальную х кнопки.
'(width*0.5)+((ImageWidth(Button))*0.5) - ширину * 0.5 + ширину кнопки * 0.5 -- определяем конечную х кнопки.
'и так же для высоты кнопки
Dn_DrawImage (buttondown, width*0.5, height*0.5, 0,1 )
End If

If MouseX()> (width*0.5)-((ImageWidth(Button))*0.5) And MouseX()< (width*0.5)+((ImageWidth(Button))*0.5) And MouseY()> (height*0.5)-((ImageHeight(Button))*0.5) And MouseY()< (height*0.5)+((ImageHeight(Button))*0.5)And MouseDown (1) Then TipGame = 1

If MouseX()> (width*0.5)-((ImageWidth(Button))*0.5) And MouseX()< (width*0.5)+((ImageWidth(Button))*0.5) And MouseY()> (height*0.5)-((ImageHeight(Button))*0.5)+50 And MouseY()< (height*0.5)+((ImageHeight(Button))*0.5)+50 Then
Dn_DrawImage (buttonexitdown, width*0.5, height*0.5+50, 0,1 )
End If

If MouseX()> (width*0.5)-((ImageWidth(Button))*0.5) And MouseX()< (width*0.5)+((ImageWidth(Button))*0.5) And MouseY()> (height*0.5)-((ImageHeight(Button))*0.5)+50 And MouseY()< (height*0.5)+((ImageHeight(Button))*0.5)+50 And MouseDown (1) Then End

Flip
Wend
[/blitz]

Тут все просто. Рисуем две кнопки. Если курсор находится в зоне кнопки, то рисуем поверх нее другую. Если нажимаем на курсор и курсор находится над кнопкой, то делаем то-то.
В нашем случае изменяем переменную TipGame 1.

А цикл меню заверщается, если переменная становится не равна 0. то есть если мы нажимаем на "новая игра", то цикл меню завершается и продолжается выполнение кода...

Кстати, cls - очищает экран, flip - все рисует.
ЧАСТЬ 7.Цикл для игры.


Так. Подошли мы к концу.

[blitz]
TPlayer.CreatePlayer ()

While Not KeyDown (KEy_Escape)
Cls

TileImage Fonimage , 0 , 0

UpdateEntities Sblood
UpdateEntities Sbullet
UpdateEntities Splayer
UpdateEntities Smonster


If time < MilliSecs () Then
time = MilliSecs () + level
a = Rand (1,4)
Select a
Case 1
TMonster.CreateMonster(-50, Rand(height))
Case 2
TMonster.CreateMonster (width+50, Rand(height))
Case 3
TMonster.CreateMonster (Rand(width) , -50)
Case 4
TMonster.CreateMonster (Rand(width), height+50)
End Select
End If
Flip
Wend



[/blitz]

TPlayer.CreatePlayer () - что это такое?
TileImage Fonimage , 0 , 0 - Рисуем фон игры.
[blitz]
UpdateEntities Sblood
UpdateEntities Sbullet
UpdateEntities Splayer
UpdateEntities Smonster
[/blitz]
Обновляем все объекты. UpdateEntities - наша функция, она была в самом начале.
[blitz]
If time < MilliSecs () Then
time = MilliSecs () + level
a = Rand (1,4)
Select a
Case 1
TMonster.CreateMonster(-50, Rand(height))
Case 2
TMonster.CreateMonster (width+50, Rand(height))
Case 3
TMonster.CreateMonster (Rand(width) , -50)
Case 4
TMonster.CreateMonster (Rand(width), height+50)
End Select
End If
[/blitz]

Так. Если time меньше системного времени, то присваиваем переменной a случайное значение от 1 до 4.

Если равно 1 , то создаем монстра слева экрана.
Если 2, то справа.
Если 3, то вверху экрана.
Если 4, то снизу.


Все! нажимаем F5! Работает? если нет - код в с тудию ,будем выеснять. А так все готово! Мы можите поздравить себя с созданием игры основы Crimsonland. Конечно ,все аспекты типа уровней, спецэффетов и тому подобного описывать я не буду ,но вы уже сделали основу. Уже легче.

Поздравляляю! так.. а я спать. .у меня моск конкретно взорвался...
(Offline)
 
Ответить с цитированием
Старый 16.10.2007, 22:58   #10
Данил
Модератор
 
Аватар для Данил
 
Регистрация: 11.07.2007
Сообщений: 2,910
Написано 686 полезных сообщений
(для 1,694 пользователей)
Re: Создаём свой Crimsonland.

Все! туториал закончен, мона флудить)))
туториал.rar
(Offline)
 
Ответить с цитированием
Старый 16.10.2007, 23:20   #11
dimanche13
Мастер
 
Регистрация: 19.03.2007
Сообщений: 1,039
Написано 153 полезных сообщений
(для 252 пользователей)
Re: Создаём свой Crimsonland.

Почему бы не ввести параметр по-умолчанию ?
Function CreateMonster:Tmonster(x#,y#,life = 100)
добавил:
Вот накидал, как бы я писал Кримсон:
__________________

Последний раз редактировалось dimanche13, 06.01.2008 в 14:23.
(Offline)
 
Ответить с цитированием
Старый 17.10.2007, 11:04   #12
Данил
Модератор
 
Аватар для Данил
 
Регистрация: 11.07.2007
Сообщений: 2,910
Написано 686 полезных сообщений
(для 1,694 пользователей)
Re: Создаём свой Crimsonland.

У тебя, dimanche13, очень много методов.. по 3-4 на тип. .а у меня на тип один метод и одна функция. А типа "удаления" или тому подобного в отдельный тип отношу, доступный для дркгих...

Ну, это имхо. Я так делаю. Ты так.
(Offline)
 
Ответить с цитированием
Старый 17.10.2007, 11:16   #13
dimanche13
Мастер
 
Регистрация: 19.03.2007
Сообщений: 1,039
Написано 153 полезных сообщений
(для 252 пользователей)
Re: Создаём свой Crimsonland.

Данил, это зависит от подхода конкретного программиста. Ты абсолютно прав, что каждый делает так как считает нужным. Посмотрев твой код, я и для себя присмотрел пару вещиц.
__________________
(Offline)
 
Ответить с цитированием
Старый 19.10.2007, 09:24   #14
Данил
Модератор
 
Аватар для Данил
 
Регистрация: 11.07.2007
Сообщений: 2,910
Написано 686 полезных сообщений
(для 1,694 пользователей)
Re: Создаём свой Crimsonland.

http://blitzetcetera.org/index.php/С...ой_Crimsonland

я рад!
(Offline)
 
Ответить с цитированием
Старый 10.01.2009, 21:44   #15
Abiron
ПроЭктировщик
 
Регистрация: 30.12.2008
Сообщений: 164
Написано 18 полезных сообщений
(для 23 пользователей)
Ответ: Создаём свой Crimsonland.

Оличный туториал. Щас пишу нечто похожее на b3d, и еслиб только начатый был, то перешел бы на БМ. Только меня напрягает циферка в верхнем левом углу, это фпс?
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создаём свой FPS (first person shooter) impersonalis FAQ 146 16.03.2010 22:30
Свои шрифты DiS[IP] Библиотеки 20 24.02.2009 10:47
Crimsonland alcoSHoLiK Игры / Games 19 15.11.2007 19:14
Аля свой язык..... Raiter Болтовня 12 27.09.2006 18:36
Создаём свой Fps (first Person Shooter) impersonalis Болтовня 5 22.02.2006 20:37


Часовой пояс GMT +4, время: 01:43.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com