14. Первая 3Д игра. Часть 4 – от массива к спискам

 

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

 

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

Для начала создадим новый тип - 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 стены и расставим их по отдельности (чего нам места жалко, что ли? J)…

 

И дальше поменяем цикл проверки пересечения модельки цилиндра и кубиков в главном цикле (это когда мы ставим цилиндр в новое место – помните?) – поменяем строчки:

 

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

 

Здесь даже проще получается – т.е. независимо от того, насколько большой у нас список, мы просто «пролистываем» его от начала до конца J

 

Всё – переход на списки перешёл успешно! Можете запустить игру – видите, никаких изменений! J

 

Возможно кому-то покажется, что это лишь усложнение, но это только видимость. Списки намного удобнее чем массивы, если научится с ними работать. Не нужно указывать, какое именно количество элементов вы собираетесь использовать, а значит, игра стала более гибкой – т.е. сейчас мы можем задать любое число во время создания кубиков. Допустим,  если бы мы захотели изменить цифру, если бы мы использовали массив, то нам надо было бы поменять цифру 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

 

 

 Оглавление:

 

0.  Введение

1.  В начале была Тьма

2.  Есть ли жизнь в DirectX

3.  Свобода и Власть 3Д (0)

4.  Свобода и Власть 3Д (1)

5.  2Д в 3Д

6.  Трёхмерный курсор

7.  Родительская зависимость или Привязки

8.  Фишки с привязками

9.  Коллизион Детекшн или как устроен мир…

10.     Первая 3Д игра. Часть 0 – основы движка

11.     Первая 3Д игра. Часть 1 – разработка движка

12.     Первая 3Д игра. Часть 2 – устранение багов

13.     Первая 3Д игра. Часть 3 – внешний вид

14.     Первая 3Д игра. Часть 4 – от массива к спискам

15.     Первая 3Д игра. Часть 5 – оптимизация кода

16.     Первая 3Д игра. Часть 6 – завершение

17.     Выведение

 

 

 

 

Используются технологии uCoz