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

Для начала, мы переведём наши кубики из массива в список (надеюсь вы хорошо усвоили мой перевод туториала по БлитцБэйсику? . Зачем это нужно – поймёте позже… Итак, грядут большие изменения в программе.

Для начала создадим новый тип - 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