1 апреля 2010 в 12:57
Blitz3d уроки 14. От массива к спискам
В этой части не произойдёт никаких изменений во внешнем виде игры, не изменится геймплей и даже не увеличится частота кадров, но без этой части нам не пройти на следующую… Сейчас мы будем оптимизировать движок, делать его более понятным и унифицированным.
Для начала, мы переведём наши кубики из массива в список (надеюсь вы хорошо усвоили мой перевод туториала по БлитцБэйсику? . Зачем это нужно – поймёте позже… Итак, грядут большие изменения в программе.
Для начала создадим новый тип - Walls:
Type Walls Field model End Type
Эту строчку поместите до констант. Здесь мы создаём новый тип с одним полем – model. В этом поле у нас будет содержаться меш кубика…
Далее, можно стереть строчку
Dim Walls(33)
Так как нам теперь не надо будет задавать, какое именно количество элементов мы будем использовать…
Дальше, весь процесс создания кубиков нам нужно переделать:
For i=0 To 29 w.Walls = New Walls w\model=CreateCube() Repeat PositionEntity w\model,Rnd(-40,40),0,Rnd(-40,40) Until Abs(EntityX(w\model))>10 Or Abs(EntityZ(w\model))>10 EntityType w\model, TypeWalls EntityColor w\model,255,0,0 Next
Здесь мы создаём новый элемент типа Walls, и создаём новый куб в его поле model, ну остальное всё осталось также… Теперь мы свободно можем поставить любую другую конечную цифру вместо 29 (раньше нам бы понадобилось менять конечное количество элементов когда мы описывали массив…)
Дальше также меняем создание стен:
w.Walls = New Walls w\model=CreateCube() EntityColor w\model,100,20,0 EntityType w\model,TypeWalls PositionEntity w\model,-50,0,0 FitMesh w\model,-1,-1,-50,2,3,100 w.Walls = New Walls w\model=CreateCube() EntityColor w\model,100,20,0 EntityType w\model,TypeWalls PositionEntity w\model,50,0,0 FitMesh w\model,-1,-1,-50,2,3,100 w.Walls = New Walls w\model=CreateCube() EntityColor w\model,100,20,0 EntityType w\model,TypeWalls PositionEntity w\model,0,0,-50 FitMesh w\model,-50,-1,-1,100,3,2 w.Walls = New Walls w\model=CreateCube() EntityColor w\model,100,20,0 EntityType w\model,TypeWalls PositionEntity w\model,0,0,50 FitMesh w\model,-50,-1,-1,100,3,2
К сожалению у нас не получится так же как раньше сначала создать сразу 4 модельки, а потом их расставлять и трансформировать (вернее вряд ли получится это сделать написав меньшее количество строк и не усложняя), поэтому создадим 4 стены и расставим их по отдельности (чего нам места жалко, что ли? )…
И дальше поменяем цикл проверки пересечения модельки цилиндра и кубиков в главном цикле (это когда мы ставим цилиндр в новое место – помните?) – поменяем строчки:
For i=1 To 29 If MeshesIntersect(Target, Walls(i)) inter=True Next …на: For w.Walls = Each Walls If MeshesIntersect(Target, w\model) inter=True Next
Здесь даже проще получается – т.е. независимо от того, насколько большой у нас список, мы просто «пролистываем» его от начала до конца
Всё – переход на списки перешёл успешно! Можете запустить игру – видите, никаких изменений!
Возможно кому-то покажется, что это лишь усложнение, но это только видимость. Списки намного удобнее чем массивы, если научится с ними работать. Не нужно указывать, какое именно количество элементов вы собираетесь использовать, а значит, игра стала более гибкой – т.е. сейчас мы можем задать любое число во время создания кубиков. Допустим, если бы мы захотели изменить цифру, если бы мы использовали массив, то нам надо было бы поменять цифру 1) Когда мы указываем какое кол-во элементов у нас будет в массиве; 2) Когда мы создаём стены (потому что стены мы создавали последними элементами) 3) В главном цикле – когда мы делали проверку на пересечение цилиндра и кубиков – опять же кол-во кубиков изменилось, значит и количество проверок должно измениться… 3 замены… Конечно, это немного, но ведь и игрушка у нас маленькая. Представьте, что было бы в большом проекте!
SeedRnd MilliSecs() Graphics3D 640,480,16,1 SetBuffer BackBuffer() Type Walls Field model End Type Const TypePlayer=1,TypeWalls=2,TypeTarget=3 Global Speed#=.1,Score=0 Global Player=CreateSphere() Plac=CreateCone(8) RotateMesh Plac,-90,0,0 ScaleMesh Plac,1,1,1.2 PositionMesh Plac,0,0,-1.5 AddMesh Plac,Player EntityType Player, TypePlayer EntityColor Player,0,255,0 FreeEntity Plac For i=0 To 29 w.Walls = New Walls w\model=CreateCube() Repeat PositionEntity w\model,Rnd(-40,40),0,Rnd(-40,40) Until Abs(EntityX(w\model))>10 Or Abs(EntityZ(w\model))>10 EntityType w\model, TypeWalls EntityColor w\model,255,0,0 Next w.Walls = New Walls w\model=CreateCube() EntityColor w\model,100,20,0 EntityType w\model,TypeWalls PositionEntity w\model,-50,0,0 FitMesh w\model,-1,-1,-50,2,3,100 w.Walls = New Walls w\model=CreateCube() EntityColor w\model,100,20,0 EntityType w\model,TypeWalls PositionEntity w\model,50,0,0 FitMesh w\model,-1,-1,-50,2,3,100 w.Walls = New Walls w\model=CreateCube() EntityColor w\model,100,20,0 EntityType w\model,TypeWalls PositionEntity w\model,0,0,-50 FitMesh w\model,-50,-1,-1,100,3,2 w.Walls = New Walls w\model=CreateCube() EntityColor w\model,100,20,0 EntityType w\model,TypeWalls PositionEntity w\model,0,0,50 FitMesh w\model,-50,-1,-1,100,3,2 Target=CreateCylinder() PositionEntity Target,Rnd(-40,40),0,Rnd(-40,40) EntityColor Target,255,215,0 EntityType Target,TypeTarget cam=CreateCamera() PositionEntity cam,0,40,0 TurnEntity cam,90,0,0 lit=CreateLight() TurnEntity lit,70,70,0 Collisions TypePlayer,TypeWalls,2,2 Collisions TypePlayer,TypeTarget,2,2 Repeat MoveEntity Player,0,0,Speed# If KeyDown(203) TurnEntity Player,0,3,0 If KeyDown(205) TurnEntity Player,0,-3,0 PointEntity cam,Player If EntityCollided (Player,TypeTarget) Repeat inter=False PositionEntity Target,Rnd(-40,40),0,Rnd(-40,40) For w.Walls = Each Walls If MeshesIntersect(Target, w\model) inter=True Next Until inter=False UpdateWorld Score=Score+1 Speed=Speed+.01 EndIf If EntityCollided (Player,TypeWalls) End UpdateWorld RenderWorld Color 255,215,0 Text 320,10,"Score : "+Score,True,True Flip Until KeyHit(1) End
комментарии отсутствуют
авторизуйтесь