|
3D-программирование Вопросы, касающиеся программирования 3D мира |
27.12.2005, 18:49
|
#1
|
Бывалый
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений (для 5 пользователей)
|
Пожалуйтса, подскажите как это реализовать!
Здесь нужно сделать так, что бы при нажатии кнопки "пробел" белые кубики случайным образом расставлялись на поле и не пересекались ни с черными ни с белыми.
7,9 - доп. клава.
4,8,6,2 - доп клава.
пробел.
------
управление
;We are not interested in this piece of code. See below.
;Смотрим в самый низ кода. Именно там функция расстановки кубиков.
Const gwidth=1024
Const gheight=768
Const gdeep=32
Const gmode=1
;-----------------------ВАжный участок-------------------------------------------------;
Const typecube=3;ДЛЯ КОЛЛИЗИИ КУБИКОВ
Const typecube2=4;ДЛЯ КОЛЛИЗИИ КУБИКОВ
;-----------------------ВАжный участок----------------------------------------------;
Const CFieldWidth=29
Const CFieldHeight=29
Const BoxUpperSide%=0
Const BoxFrontSide%=1
Const BoxBackSide%=2
Const BoxLeftSide%=3
Const BoxRighrtSide%=4
Dim masPrep(CFieldWidth,CFieldHeight)
Dim masBonuses(CFieldWidth,CFieldHeight)
Type cubes
Field obj
Field nomerX, nomerZ
End Type
Graphics3D gwidth,gheight,gdeep,gmode
SetBuffer BackBuffer()
SeedRnd MilliSecs()
fnLoadlevel("maps\null.txt")
fnCreateEnvir()
camera=CreateCamera()
EntityType camera,typecamera
PositionEntity camera,150,220,-150
RotateEntity camera,90,0,0
;-----------------------ВАжный участок--------------------------------------------------;
Collisions typecube,typecube2,2,3; КОЛЛИЗИИ!!!!!!!!!!!!
;-----------------------ВАжный участок-----------------------------------------------;
Repeat
Delay 1
If KeyHit(57) Then fnCreateRandScub1()
If KeyDown(72) Then MoveEntity camera,0,1,0
If KeyDown(80) Then MoveEntity camera,0,-1,0
If KeyDown(75) Then MoveEntity camera,-1,0,0
If KeyDown(77) Then MoveEntity camera,1,0,0
If KeyDown(71) Then MoveEntity camera,0,0,1
If KeyDown(73) Then MoveEntity camera,0,0,-1
UpdateWorld()
RenderWorld()
Flip
Until KeyHit(1)
End
Function fnLoadlevel(file$)
scub=CreateMesh()
surf=CreateSurface(scub)
AddBoxToSurface(Surf%,0,0,0,10)
UpdateNormals(scub)
EntityRadius scub,5
scub2=CreateMesh()
surf=CreateSurface(scub2)
AddBoxToSurface(Surf%,0,0,0,10)
UpdateNormals(scub)
EntityRadius scub2,5
;-----------------------ВАжный участок------------------------------------------;
EntityColor scub2,0,0,0; ЦВЕТ НЕПРОБИВАЕМОГО КУБИКА
;-----------------------ВАжный участок------------------------------------------;
width1=10
depth1=10
width2=10
depth2=10
stream=ReadFile(file$)
For x=0 To CFieldWidth
For z=0 To CFieldHeight
value=ReadShort (Stream)
masPrep(x,z) = 0
masBonuses(x,z) = 0
Select value
Case 1
masPrep(x,z) = 1
cube.cubes = New cubes
cube\obj = CopyEntity(scub)
EntityAlpha cube\obj,0.5
PositionEntity cube\obj,x*width1+5,5,-z*depth1-5
;-----------------------ВАжный участок-------------------------------------------------;
EntityType cube\obj,typecube;;ДЛЯ КОЛЛИЗИИ КУБИКОВ
;-----------------------ВАжный участок-------------------------------------------
EntityPickMode cube\obj,2
NameEntity (cube\obj,Handle (cube))
cube\nomerX = x
cube\nomerZ = z
Case 2
masPrep(x,z) = 2
cube.cubes = New cubes
cube\obj = CopyEntity(scub2)
PositionEntity cube\obj,x*width2+5,5,-z*depth2-5
;-----------------------ВАжный участок----------------------------------------;
EntityType cube\obj,typecube2;ДЛЯ КОЛЛИЗИИ КУБИКОВ
;-----------------------ВАжный участок--------------------------------------------------
EntityPickMode cube\obj,2
NameEntity (cube\obj,Handle (cube))
cube\nomerX = x
cube\nomerZ = z
End Select
Next
Next
CloseFile stream
FreeEntity scub
FreeEntity scub2
End Function
Function AddBoxSideToSurface(Surf%,BoxSide%,X#,Y#,Z#,C#)
Local X1#, Y1#, Z1#, X2#, Y2#, Z2#, X3#, Y3#, Z3#, X4#, Y4#, Z4#
Local V1%, V2%, V3%, V4%
Local T1%, T2%
C#=C#/2
Select BoxSide%
Case BoxUpperSide%
X1#=X#-C: X2#=X#+C: X3#=X#+C: X4#=X#-C
Y1#=Y#+C: Y2#=Y#+C: Y3#=Y#+C: Y4#=Y#+C
Z1#=Z#-C: Z2#=Z#-C: Z3#=Z#+C: Z4#=Z#+C
Case BoxFrontSide%
X1#=X#-C: X2#=X#+C: X3#=X#+C: X4#=X#-C
Y1#=Y#-C: Y2#=Y#-C: Y3#=Y#+C: Y4#=Y#+C
Z1#=Z#-C: Z2#=Z#-C: Z3#=Z#-C: Z4#=Z#-C
Case BoxBackSide%
X1#=X#-C: X2#=X#+C: X3#=X#+C: X4#=X#-C
Y1#=Y#+C: Y2#=Y#+C: Y3#=Y#-C: Y4#=Y#-C
Z1#=Z#+C: Z2#=Z#+C: Z3#=Z#+C: Z4#=Z#+C
Case BoxLeftSide%
X1#=X#-C: X2#=X#-C: X3#=X#-C: X4#=X#-C
Y1#=Y#-C: Y2#=Y#+C: Y3#=Y#+C: Y4#=Y#-C
Z1#=Z#-C: Z2#=Z#-C: Z3#=Z#+C: Z4#=Z#+C
Case BoxRighrtSide%
X1#=X#+C: X2#=X#+C: X3#=X#+C: X4#=X#+C
Y1#=Y#+C: Y2#=Y#-C: Y3#=Y#-C: Y4#=Y#+C
Z1#=Z#-C: Z2#=Z#-C: Z3#=Z#+C: Z4#=Z#+C
End Select
V1%=AddVertex(Surf%, X1#, Y1#, Z1#, 0, 0)
V2%=AddVertex(Surf%, X2#, Y2#, Z2#, 1, 0)
V3%=AddVertex(Surf%, X3#, Y3#, Z3#, 1, 1)
V4%=AddVertex(Surf%, X4#, Y4#, Z4#, 0, 1)
T1%=AddTriangle(Surf%, V1%,V3%,V2%)
T2%=AddTriangle(Surf%, V1%,V4%,V3%)
End Function
Function AddBoxToSurface(Surf%,X#,Y#,Z#,C#=1)
AddBoxSideToSurface(Surf%,BoxUpperSide%,X#,Y#,Z#,C#)
AddBoxSideToSurface(Surf%,BoxFrontSide%,X#,Y#,Z#,C#)
AddBoxSideToSurface(Surf%,BoxBackSide%,X#,Y#,Z#,C#)
AddBoxSideToSurface(Surf%,BoxLeftSide%,X#,Y#,Z#,C#)
AddBoxSideToSurface(Surf%,BoxRighrtSide%,X#,Y#,Z#,C#)
End Function
Function fnCreateEnvir()
light=CreateLight()
RotateEntity Light,45,0,0
Floorr=CreateCube()
FitMesh floorr ,0,-1,0, 290,1,-290
EntityColor floorr,0,255,0
EntityType floorr,typescene
wall1=CreateCube()
FitMesh wall1 ,0,0,0,290,5,2
EntityColor wall1,70,30,60
EntityType wall1, typewall
wall2=CreateCube()
FitMesh wall2 ,0,0,-291.5,290,5,2
EntityColor wall2,70,30,60
EntityType wall2, typewall
wall3=CreateCube()
FitMesh wall3 ,290,0,0,2,5,-290
EntityColor wall3,70,30,60
EntityType wall3, typewall
wall4=CreateCube()
FitMesh wall4 ,0,0,0,-2,5,-291
EntityColor wall4,70,30,60
EntityType wall4,typewall
End Function
;We are not interested in this piece of code. See below.
;+++++++++++++++++LOOK HERE+++++++++++++++++++++++++++++++++
Function fnCreateRandScub1()
cube.cubes = New cubes
scub=CreateMesh()
surf=CreateSurface(scub)
AddBoxToSurface(Surf%,0,0,0,10)
UpdateNormals(scub)
HideEntity scub
For i = 1 To Rand(90,115)
cube\obj = CopyEntity(scub)
PositionEntity cube\obj,Rand(5,285),5,Rand(-5,-285)
EntityColor cube\obj,255,255,255; ЦВЕТ ПРОБИВАЕМОГО КУБИКА
EntityType cube\obj,typecube
Next
FreeTexture tex1
NameEntity (cube\obj,Handle (cube))
End Function
;+++++++++++++++++LOOK HERE+++++++++++++++++++++++++++
|
(Offline)
|
|
27.12.2005, 19:20
|
#2
|
Дэвелопер
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений (для 886 пользователей)
|
Больше всего понравилась строчка
For i = 1 To Rand(90,115)
Убрал удаление текстуры, т.к. её нет вовсе.
Запоминание Хендла кубика вставил в цикл создания кубиков, ибо это логично.
Вот дополненая и рабочая функция создания и расстановки:
;+++++++++++++++++LOOK HERE+++++++++++++++++++++++++++++++++
Function fnCreateRandScub1()
cube.cubes = New cubes
scub=CreateMesh()
surf=CreateSurface(scub)
AddBoxToSurface(Surf%,0,0,0,10)
UpdateNormals(scub)
HideEntity scub
SeedRnd MilliSecs ()
Local kolvo = Rand(90,115)
For i = 1 To kolvo
cube\obj = CopyEntity(scub)
;выбор случайного позиции
Local x_rnd = Rand (1,CFieldWidth-1)
Local z_rnd = Rand (1,CFieldHeight-1)
;будем выбирать позицию до тех пор, пока
;не выберем ту, где нет препятствий
While Not (masPrep(x_rnd, z_rnd) = 0)
x_rnd = Rand (0,CFieldWidth-1)
z_rnd = Rand (0,CFieldHeight-1)
Wend
;зная позицию противника, определяем его координаты на поле
Local posX# = x_rnd * 10 + 5
Local posZ# = -z_rnd * 10 - 5
PositionEntity cube\obj,posX,5,posZ
EntityColor cube\obj,255,255,255; ЦВЕТ ПРОБИВАЕМОГО КУБИКА
EntityType cube\obj,typecube
NameEntity (cube\obj,Handle (cube))
Next
End Function
;+++++++++++++++++LOOK HERE+++++++++++++++++++++++++++
|
(Offline)
|
|
27.12.2005, 19:42
|
#3
|
Бывалый
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений (для 5 пользователей)
|
Огромное спасибо. Все отлично работает!
|
(Offline)
|
|
27.12.2005, 20:34
|
#4
|
Бывалый
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений (для 5 пользователей)
|
Если нажать f10 для случайной расстановки кубиков и начать их уничтожать, то СО ВТОРОГО КУБИКА случается баг.
;на этом месте препятствия больше нет!
masPrep(ptr_cube\nomerX,ptr_cube\nomerZ) = 0
в этой строчке.
|
(Offline)
|
|
27.12.2005, 21:06
|
#5
|
Бывалый
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений (для 5 пользователей)
|
Исправили.
После For i = 1 To kolvo
нужно было добавить еще
cube.cubes = New cubes
и все пойдет по плану!
|
(Offline)
|
|
28.12.2005, 15:56
|
#6
|
Дэвелопер
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений (для 886 пользователей)
|
Ага, а в начале тела функции эту строчку надо удалить!
|
(Offline)
|
|
28.12.2005, 20:59
|
#7
|
Бывалый
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений (для 5 пользователей)
|
Так было
Function fnCreateRandScub1()
cube.cubes = New cubes
scub=CreateMesh()
surf=CreateSurface(scub)
AddBoxToSurface(Surf%,0,0,0,10)
UpdateNormals(scub)
HideEntity scub
А елси убрать строчку
cube.cubes = New cubes
то будет ошибка(зависание будет)
Поэтому лучше строку эту не трогать!
|
(Offline)
|
|
28.12.2005, 21:58
|
#8
|
Бывалый
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений (для 5 пользователей)
|
И еще!
бывает случается так, что игрок оказывается зажатым между кубиками! Как сделать так, что бы пространство, где будет стоять игрок не занималось кубиками?
Маленькая неприятность. Если рассталвять кубики случайно, то нажатие клавиши приза приводит к зависанию программы!
|
(Offline)
|
|
29.12.2005, 11:09
|
#9
|
Элита
Регистрация: 02.10.2005
Сообщений: 1,789
Написано 132 полезных сообщений (для 252 пользователей)
|
Originally posted by Fant@Dec 28 2005, 08:58 PM
И еще!
бывает случается так, что игрок оказывается зажатым между кубиками! Как сделать так, что бы пространство, где будет стоять игрок не занималось кубиками?
|
поищи вот в этом туториале там как раз ответ на твой вопрос
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 19:32.
|