forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   FAQ и уроки (http://forum.boolean.name/forumdisplay.php?f=110)
-   -   Создаём свой Crimsonland. (http://forum.boolean.name/showthread.php?t=4777)

Данил 16.10.2007 18:04

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

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

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

Задавайте вопросы.

dimanche13 16.10.2007 18:42

Re: Создаём свой Crimsonland.
 
Код:

        Player.x = width*0.5 'Делаем, чтобы положение игрока было точно в центре.
        Player.y = width*0.5

эммм... опечатка

IGR 16.10.2007 18:47

Re: Создаём свой Crimsonland.
 
Цитата:

Прощу в теме до окончания создания туториала особо не флудить.
извени, но Залей НЕ на рапиду !!
оттуда немогу скачать/посмотреть !!

Данил 16.10.2007 18:54

Re: Создаём свой Crimsonland.
 
Ок.
http://meg.ifolder.ru/3758488

dimanche13 16.10.2007 18:58

Re: Создаём свой Crimsonland.
 
IGR, это другая рапида ;) все норм качается. Данил, я бы сделал по-другому. Приду домой напишу.

IGR 16.10.2007 18:58

Re: Создаём свой Crimsonland.
 
ОК !! совсем другое дело !!
начинаю качать !!
со своей скоростю завтра докачаю, отпишусь !! :-)

Данил 16.10.2007 21:31

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]

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


Так. завтра у нас будет две части. Самых сложных....

Данил 16.10.2007 22:06

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 ,то удаляем кровь.

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

Правда посмотреть пока не на что...

Данил 16.10.2007 22:54

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. Конечно ,все аспекты типа уровней, спецэффетов и тому подобного описывать я не буду ,но вы уже сделали основу. Уже легче.

Поздравляляю! так.. а я спать. .у меня моск конкретно взорвался...:wallbash:

Данил 16.10.2007 22:58

Re: Создаём свой Crimsonland.
 
Все! туториал закончен, мона флудить)))
туториал.rar

dimanche13 16.10.2007 23:20

Re: Создаём свой Crimsonland.
 
Вложений: 1
Почему бы не ввести параметр по-умолчанию ?
Код:

Function CreateMonster:Tmonster(x#,y#,life = 100)
добавил:
Вот накидал, как бы я писал Кримсон:

Данил 17.10.2007 11:04

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

Ну, это имхо. Я так делаю. Ты так.

dimanche13 17.10.2007 11:16

Re: Создаём свой Crimsonland.
 
Данил, это зависит от подхода конкретного программиста. Ты абсолютно прав, что каждый делает так как считает нужным. Посмотрев твой код, я и для себя присмотрел пару вещиц. ;)

Данил 19.10.2007 09:24

Re: Создаём свой Crimsonland.
 
http://blitzetcetera.org/index.php/С...ой_Crimsonland

я рад! ;)

Abiron 10.01.2009 21:44

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

NitE 11.01.2009 00:02

Re: Создаём свой Crimsonland.
 
думаю надо встаки практиковать вечный бан слепым

Abiron 11.01.2009 00:11

Ответ: Создаём свой Crimsonland.
 
Цитата:

думаю надо встаки практиковать вечный бан слепым
Ты меня достал. Я понимаю, что ты мегагуру во всех языках, и все недостойные должны трепетать при твоем появлении, но ты не думал, что пока разберешься в незнакомом языке, в странице коджа и коментов, чтож там такое выводится в уголке, времени не мало пройти может, тем паче если занимаешься еще чем то кроме сидения на форуме?

NitE 11.01.2009 00:57

Re: Создаём свой Crimsonland.
 
я говорил про дату последнего поста дурачек ))))) хватит некрофильничять !!!

Abiron 11.01.2009 01:01

Ответ: Создаём свой Crimsonland.
 
Ясно. Сори. Но туда вообще никогда не смотрю.

NitE 11.01.2009 01:04

Re: Создаём свой Crimsonland.
 
так вот большинство людей (особенно новых) никогда и не смотрят, а если теме больше года врядли уже кто-то будет на такие детальные вопросы отвечать... хотя всё бывает )

Phantom 11.01.2009 04:22

Ответ: Создаём свой Crimsonland.
 
Ы. На днях открыл для себя Кримсонлэнд и понял, что это одна из лучших игр, сделанных когда-либо. Очень хотелось переделать там многое под себя, например, очень не хватает управления двумя мышками :-D , но я в игроделании не разбираюсь. Было приятно увидеть тут эту тему =)

Данил 11.01.2009 19:40

Ответ: Создаём свой Crimsonland.
 
приятно было увидеть свою тему,в поднятых)

Randomize 15.01.2009 05:22

Ответ: Создаём свой Crimsonland.
 
Было бы неплохо дописать статью.
Чтоб там Hi-Score считалось.
Бонусы.
Оружия поболее+кач скорострельности и обьёма магазина
Получится мега туториал по деланью клона кримсона.
А кримсон во истину вещь!












[/list]

Данил 15.01.2009 16:46

Ответ: Создаём свой Crimsonland.
 
Все это дописать - 5 минутное дело. И базовых знаний, что здесь дается, и так хватит)

Тогда еще уровни, эффектов побольше, колизии - дак на продажу уже можно будет)

NitE 15.01.2009 17:49

Re: Создаём свой Crimsonland.
 
да и какой смысл делать игру по четкой интсрукций ? в туторе все основы объясняются и можно самому делать дальше так как захочешь ))

Randomize 15.01.2009 21:49

Ответ: Создаём свой Crimsonland.
 
Чтоб показать новичкам полны цикл.
Чтоб они сделали то, во что можно играть тобеж игру с хоть какимто игровым стимулом а именно hi-score. После чего они обвешивали её своей графикой, пытались доделать ещё и в итоги сделали свой первый проэкт, который к томуже ещё и неплохой.

Tadeus 15.01.2009 21:53

Ответ: Создаём свой Crimsonland.
 
2Randomize, копипаст пропагандируем? :wild:

Piranha 01.03.2009 20:17

Ответ: Создаём свой Crimsonland.
 
Хотелось бы спросить, как сделать своего главного героя? Пробовал перерисовывать в фотошопе, получилось косячно, двигался совсем не так, глав.герой то исчезал, то появлялся.

NitE 01.03.2009 23:19

Ответ: Создаём свой Crimsonland.
 
а ты на картинку вложенную посмотрел хоть ?? это набор кадров - естественно если кадров нет то он в лучшем случае нече не покажет - хотя всё решается незначительными исправлениями кода...

Piranha 01.03.2009 23:24

Ответ: Создаём свой Crimsonland.
 
NitE, смотрел конечно. Я пытался делать такие же кадры, но нечего не вышло.

NitE 01.03.2009 23:25

Ответ: Создаём свой Crimsonland.
 
имхо там подход неправильный - вместо проигрывания кучи кадров проще в коде прописать чтобы одна картинка туда-сюда крутилас, или вообще статичьна была )

Piranha 01.03.2009 23:30

Ответ: Создаём свой Crimsonland.
 
NitE не подскажешь в какой именно строчке?

NitE 01.03.2009 23:50

Ответ: Создаём свой Crimsonland.
 
19, 97, 104-107, 111, 112

Данил 02.03.2009 15:31

Ответ: Создаём свой Crimsonland.
 
Piranha, ширину раздели на количество кадров - получишь ширину одной картинки)

NitE, как бы сначала я расчитывал, что сделаю нормальную анимацию :)
затем ж я просто вставил этого чела. Тут уже по вкусу)

G.A.D 20.03.2009 21:53

Ответ: Создаём свой Crimsonland.
 
2Данил
а спрайты вы сами делали?
и каким образом?

Randomize 22.03.2009 19:45

Ответ: Создаём свой Crimsonland.
 
Терорист из Counter Strike
Монстр из WarCraft
Всё выдёргивается риперами и распаковщиками.

Допустим можно записать с экрана это как видео, а потом сделать по ней кадры
(допустим много Bmp)
Всё это дело вставляем в Active Gif Creator или в создавалку спрайтов Jimon`а и получаем полоску кадров (BMP Strip).

h1dd3n 22.03.2009 20:20

Ответ: Создаём свой Crimsonland.
 
Можно сразу в bmp, способы выдернуть модельки из кс-ы давно лежат в гугле, ставим камеру на головой модельки, рендерим анимацию бега в bmp делаем "полоску" с ASpriter или любой другой прогой

Nex 07.05.2009 07:46

Ответ: Создаём свой Crimsonland.
 
Вложений: 1
Подскажите как сделать карту (уровень), а то не могу понять как такое сделать. И еще как сделать скроллинг за игроком. Точнее я скроллинг сделал, но герой двигается не много быстрее чем камера и фигня какая то получается. :) Ну и если можно, то еще и что бы патроны заканчивались. И как сделать звук, а то в хелпе я нашел только 1 пример и и то для программного создания звука... :-)
У меня вот что получилось. :-)

Данил 07.05.2009 23:22

Ответ: Создаём свой Crimsonland.
 
Посмотри другие примеры, здесь дана основа, а то
"сделайте мне то, сделайте мне се, а вот здесь я хочу круттую игру, сделайте! А еще продайте и отдайте мне деньги!" .) грубо говоря, это так звучит :)
почитай, поспрашивай, но посторайся сделать сам, иначе расслабишься

NitE 08.05.2009 00:16

Ответ: Создаём свой Crimsonland.
 
1) скорость камеры=скорость игрока
2) если патроны>0 выстрел, патроны=патроны-1
3) loadsound, playsound

Nex 08.05.2009 07:18

Ответ: Создаём свой Crimsonland.
 
Данил, я и так стараюсь. А насчет "сделайте мне то,се", я такого не говорил. Я просил подсказать как сделать. :)
А насчет карты (уровня) никто не знает чтоли? :(

h1dd3n 08.05.2009 11:43

Ответ: Создаём свой Crimsonland.
 
Конкретизируй вопрос... Ты не понимаешь как делать модель? Или как "запихивать" её в игру? Или ты вообще ничего не понимаешь?

Nex 09.05.2009 09:23

Ответ: Создаём свой Crimsonland.
 
h1dd3n, как сделать карту тоесть локацию по которой бегать? Тайлами или как? Как разные объекты (ящики, стены) разместить? Просто бегать по бесконечному игровому пространству без разных объектов не интересно.... И сори, что так криво пишу у меня просто уже 9-ое мая и сами понимаете... :)

h1dd3n 10.05.2009 00:05

Ответ: Создаём свой Crimsonland.
 
Опять не конкретный вопрос =) Но мне кажется я тебя понял.
Если ты делаешь любой объект на твоей карте, то это будет картинка (будь то хоть трава хоть ящик) если ты напимер хочешь сделать так чтобы твой чар не проходил сквозь "ящик" тебе надо проверять "ящик" и чара на коллизию, и например отталкивать чара.
Чтобы создать карту для начала её надо нарисовать. Потом надо "расставить" "ящики" и т.д. Можно написать свой формат, а можно взять xml (хотя тут у всех спорные мнения), потом созданую "карту" надо загружать в игру, загружая файл описания карты (xml или свой формат).

Yalenz 10.05.2009 12:26

Ответ: Создаём свой Crimsonland.
 
Данил, анимку для монстра из Варика ты сам делал?

Nex 10.05.2009 16:39

Ответ: Создаём свой Crimsonland.
 
А как сделать что бы "картинка игрока" всегда была так сказать на самом верху (что бы другие картинки ее не перекрывали)?

Halk-DS 11.05.2009 16:17

Ответ: Создаём свой Crimsonland.
 
Если я правильно понял, рисуй ее в последнюю очередь.

Данил 11.05.2009 21:09

Ответ: Создаём свой Crimsonland.
 
Yalenz, да, выдирал модель, через прогу рендрил сверху, и через фотошоп обрабатывал, ставил все кадры в линию. На одного монстра уходила около часа.

Данил 11.05.2009 21:11

Ответ: Создаём свой Crimsonland.
 
SkySream, то есть при обновлении нужно рисовать сначала - карту, то есть фон. затем монстры, потом пули, далее эффекты, в конце - игрока. и поверх всего - интерфейс. тогда получится так, как ты хочешь.
Halk-DS, если рисовать поверх всего, игрок будет бегать по гуи)

Nex 12.05.2009 08:26

Ответ: Создаём свой Crimsonland.
 
Данил, спасибо! :) А то у меня игрок бегает под плитами, пули поверх гуи летают. :-D

Yalenz 12.05.2009 15:48

Ответ: Создаём свой Crimsonland.
 
Цитата:

Сообщение от Данил (Сообщение 104819)
Yalenz, да, выдирал модель, через прогу рендрил сверху, и через фотошоп обрабатывал, ставил все кадры в линию. На одного монстра уходила около часа.

"Да" - всмысле анимация Близордская?
Просто у меня выходило только саму модель вытащить=(

Данил 16.06.2009 03:55

Ответ: Создаём свой Crimsonland.
 
Yalenz, анимация из игры.
Я именно модель не выдирал, я тупо открыл архив игры через прогу, нашел нужную модель, и прямо в проге сделал 20 кадров анимации, затем обрезал.

pitonms 16.06.2009 13:05

Ответ: Создаём свой Crimsonland.
 
хоть я не изучаю blitzMax , но урок очень хороший.
Правда на GML это занимало б меньше строк и времени.( если изучать как я gml 2 года)

Данил 09.07.2009 23:53

Ответ: Создаём свой Crimsonland.
 
pitonms, на gml можно добиться графики - салюта, сделать тени, физику полноценную, билн, ну хотя бы сделать из огромного коилчества объектов , где нои распалагаются на 10000х10000 пикселях одну большую или несколько малеьнких к4ратинок, содержащих все себе все эти объекты ,ну, или, допустим, шифратор/дешифратор? а модули можно подключать?) ... ну так, чисто ради интереса спрашиваю.

Tadeus 10.07.2009 00:19

Ответ: Создаём свой Crimsonland.
 
Библиотеки можно подключать :) Есть даже специальная версия Ирлихта для сего дела (ГМИрлихт). Еще вроде физика специально была )


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot