forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Случайная расстановка кубиков (http://forum.boolean.name/showthread.php?t=475)

Fant 27.12.2005 18:49

Пожалуйтса, подскажите как это реализовать!

Здесь нужно сделать так, что бы при нажатии кнопки "пробел" белые кубики случайным образом расставлялись на поле и не пересекались ни с черными ни с белыми.

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+++++++++++++++++++++++++++


Жека 27.12.2005 19:20

Больше всего понравилась строчка
Код:

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+++++++++++++++++++++++++++


Fant 27.12.2005 19:42

Огромное спасибо. Все отлично работает!

Fant 27.12.2005 20:34

Если нажать f10 для случайной расстановки кубиков и начать их уничтожать, то СО ВТОРОГО КУБИКА случается баг.

;на этом месте препятствия больше нет!
masPrep(ptr_cube\nomerX,ptr_cube\nomerZ) = 0

в этой строчке.

Fant 27.12.2005 21:06

Исправили.

После For i = 1 To kolvo

нужно было добавить еще

cube.cubes = New cubes

и все пойдет по плану!

Жека 28.12.2005 15:56

Ага, а в начале тела функции эту строчку надо удалить!

Fant 28.12.2005 20:59

Так было

Код:

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

то будет ошибка(зависание будет)

Поэтому лучше строку эту не трогать!

Fant 28.12.2005 21:58

И еще!

бывает случается так, что игрок оказывается зажатым между кубиками! Как сделать так, что бы пространство, где будет стоять игрок не занималось кубиками?


Маленькая неприятность. Если рассталвять кубики случайно, то нажатие клавиши приза приводит к зависанию программы!

ZanoZa 29.12.2005 11:09

Цитата:

Originally posted by Fant@Dec 28 2005, 08:58 PM
И еще!

бывает случается так, что игрок оказывается зажатым между кубиками! Как сделать так, что бы пространство, где будет стоять игрок не занималось кубиками?



поищи вот в этом туториале там как раз ответ на твой вопрос :super:


Часовой пояс GMT +4, время: 07:51.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot