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