Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D > 3D-программирование

3D-программирование Вопросы, касающиеся программирования 3D мира

Ответ
 
Опции темы
Старый 27.12.2005, 18:49   #1
Fant
Бывалый
 
Регистрация: 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
Fant
Бывалый
 
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений
(для 5 пользователей)
Огромное спасибо. Все отлично работает!
(Offline)
 
Ответить с цитированием
Старый 27.12.2005, 20:34   #4
Fant
Бывалый
 
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений
(для 5 пользователей)
Если нажать f10 для случайной расстановки кубиков и начать их уничтожать, то СО ВТОРОГО КУБИКА случается баг.

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

в этой строчке.
(Offline)
 
Ответить с цитированием
Старый 27.12.2005, 21:06   #5
Fant
Бывалый
 
Регистрация: 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
Fant
Бывалый
 
Регистрация: 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
Fant
Бывалый
 
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений
(для 5 пользователей)
И еще!

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


Маленькая неприятность. Если рассталвять кубики случайно, то нажатие клавиши приза приводит к зависанию программы!
(Offline)
 
Ответить с цитированием
Старый 29.12.2005, 11:09   #9
ZanoZa
Элита
 
Регистрация: 02.10.2005
Сообщений: 1,789
Написано 132 полезных сообщений
(для 252 пользователей)
Originally posted by Fant@Dec 28 2005, 08:58 PM
И еще!

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


поищи вот в этом туториале там как раз ответ на твой вопрос
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Расстановка физических обьектов. Черный крыс Blitz3D 17 06.01.2008 18:57
случайная точка внутри кривосторонего треугольника jimon Алгоритмика 8 22.12.2007 00:49
Расстановка. Chrono Syndrome Алгоритмика 4 20.08.2007 16:57
Расстановка ботов smaller 3D-программирование 1 18.12.2006 19:36
Расстановка точек по сфере GoodWin 3D-программирование 5 17.08.2006 22:57


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com