Показать сообщение отдельно
Старый 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)
 
Ответить с цитированием