Часть 8. Карта

Бегать по пустому полю мне уже надоело, поэтому поря заняться обстановкой.
SuperStrict
Global gW:Int=800, gH:Int=600
Graphics gW,gH
SetClsColor 255,255,255
SetLineWidth 2
Type TPlayer
 Field x:Float, y:Float, speed:Float, angle:Float
 
 Function Create:TPlayer(_x:Float,_y:Float)
 player:TPlayer = New TPlayer
 player.x=_x
 player.y=_y
 Return player
 End Function
 
 Method update()
 x:+(KeyDown(KEY_D)-KeyDown(KEY_A))*speed
 y:+(KeyDown(KEY_S)-KeyDown(KEY_W))*speed
 If KeyDown(KEY_LSHIFT) 
 speed=6
 Else
 speed=4
 EndIf
 angle=ATan2(MouseY()-y,MouseX()-x)
 If MouseDown(1) TBullet.Create(x+Cos(angle)*16, y+16*Sin(angle), angle)
 End Method
 
 Method draw()
 SetColor 122,122,255
 DrawOval x-16,y-16,32,32
 SetColor 0,0,0
 DrawLine x,y,x+15*Cos(angle),y+15*Sin(angle)
 SetColor 255,255,255
 End Method
 
End Type
Type TBullet
 Field x:Float, y:Float, angle:Float
 Function Create(x:Float,y:Float,angle:Float)
 Local bullet:TBullet = New TBullet
 bullet.x=x
 bullet.y=y
 bullet.angle=angle
 bullets.AddLast(bullet)
 End Function
 Function gupdate()
 For Local bullet:TBullet = EachIn bullets
 bullet.update()
 bullet.draw()
 Next
 End Function
 Method update()
 x:+Cos(angle)*10
 y:+Sin(angle)*10
 End Method 
 Method draw()
 SetColor 0,0,0
 DrawOval x-4,y-4,8,8
 SetColor 255,255,255
 End Method
End Type
Global player:TPlayer=TPlayer.Create(gW/2,gH/2),bullets:TList = New TList, map:Int[100,100]
init()
Function init()
For Local i:Int=0 To 99
 For Local j:Int=0 To 99
  If (i=0 Or i=99 Or j=0 Or j=99) map[i,j]=1
 Next
Next
End Function

Function update()
player.update()
End Function

Function draw()
For Local i:Int = 0 To 99
 For Local j:Int = 0 To 99
 drawTile(map[i,j],i,j)
 Next
Next
player.draw()
TBullet.gupdate()
End Function

Function drawTile(id:Int,i:Int,j:Int)
Select id
 Case 0
 SetColor 230,230,230
 DrawRect i*32,j*32,32,32
 SetColor 200,200,200
 DrawRect i*32+2,j*32+2,30,30
 Case 1
 SetColor 60,60,60
 DrawRect i*32,j*32,32,32
 SetColor 30,30,30
 DrawRect i*32+2,j*32+2,30,30
End Select
SetColor 255,255,255
End Function

While Not KeyDown(KEY_ESCAPE)
update()
draw()
Flip(1)
Cls()
Wend
Кода получилось у нас много, зато уже неплохой результат:) Теперь поэтапно.
Для начала, создадим интовый массив map размером 100х100. Хотите больше, сделайте больше, однако таких размеров пока что хватит. Массивы - они и в BlitzMax массивы, ничего здесь не намудрили. Затем, я изменил главный цикл, закинув туда функции update() и draw(). Таким образом, больше я уже не буду возвращаться к нашему циклу, все поправки будут в этих двух функциях. И ещё одна важная функция - init() - функция запуска игры. Здесь по сути должны быть загрузка медии, создание карты и ботов, но пока что у нас здесь только карта. Создается она следующим образом: каждый крайний элемент становится 1, каждый другой  - 0. Конечно, умный читатель обратит внимание на то, что цикл получился не труЪ. Сделал я его таким для дальнейших изменений, ведь это не готовый вариант создания карты. И последняя новая вещь на сегодня - конструкция Select-Case. Аналог switch в cи подобных, то есть работает следующим образом. В select мы указываем ту переменную, из которой берем значения. В case указываем тот код, который выполнится, если значение нашей переменной совпадает с case.  

Комментариев нет:

Отправить комментарий