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

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

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

Ответ
 
Опции темы
Старый 23.08.2013, 19:29   #1
Devilox
ПроЭктировщик
 
Аватар для Devilox
 
Регистрация: 14.01.2012
Адрес: Зеленоград
Сообщений: 192
Написано 5 полезных сообщений
(для 9 пользователей)
Управление отдельными объектами из типа.

Мне нужно сделать генератор карт, использующий отдельно нарисованные комнаты. Механизм предельно прост: создание комнат идёт построчно с нумерацией и проверкой типа соседних комнат. Проблема в том, что EntityName не помогает обратиться к нужной комнате. Что делать?
__________________
(Offline)
 
Ответить с цитированием
Старый 24.08.2013, 04:48   #2
ABTOMAT
Ференька
 
Аватар для ABTOMAT
 
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,741
Написано 5,461 полезных сообщений
(для 15,675 пользователей)
Ответ: Управление отдельными объектами из типа.

Почитай про функции Handle и Object. Они позволят засовать в имя ентити хендл объекта, а потом получить по нему сам объект.
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**

* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена

(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Devilox (24.08.2013)
Старый 24.08.2013, 13:02   #3
Devilox
ПроЭктировщик
 
Аватар для Devilox
 
Регистрация: 14.01.2012
Адрес: Зеленоград
Сообщений: 192
Написано 5 полезных сообщений
(для 9 пользователей)
Ответ: Управление отдельными объектами из типа.

Что-то я ничего не понимаю
Нужно, чтобы перед созданием нового куба проверялся предыдущий.
Почему-то кажется, что в коде полный бред написал.
Что не так?

Graphics3D 0,0,32,1
SetBuffer BackBuffer()

Type T_cubes
	Field x
	Field y
	Field z
	Field col$
	Field ent
	Field hndl
End Type


cam = CreateCamera()

CreateCubes()

While Not KeyDown(1)

UpdateWorld()
RenderWorld()

Flip

Wend

End

;---------------------------------------------------;

Function CreateCubes()
	
	For i = 1 To 10
		cube.T_cubes = New T_cubes
		cube\ent = CreateCube()
		cube\x = i * 3 - 15
		cube\y = 0
		cube\z = 20
		cube\hndl = Handle(cube.T_cubes)
		
		pointer.T_cubes = New T_cubes		
		pointer.T_cubes = Object.T_cubes(i - 1)
		
		If pointer\col = "green"
			EntityColor cube\ent,0,0,255
		ElseIf pointer\col = "blue"
			EntityColor cube\ent,255,0,0
		ElseIf pointer\col = "red"
			EntityColor cube\ent,0,255,0
		Else			
			n = Rand(1,3)
		
			If n = 1
				cube\col = "red"
				EntityColor cube\ent,255,0,0
			ElseIf n = 2
				cube\col = "green"
				EntityColor cube\ent,0,255,0
			ElseIf n = 3
				cube\col = "blue"
				EntityColor cube\ent,0,0,255
			EndIf
		EndIf
		
		PositionEntity cube\ent,cube\x,cube\y,cube\z
	Next
End Function
__________________
(Offline)
 
Ответить с цитированием
Старый 25.08.2013, 00:12   #4
Devilox
ПроЭктировщик
 
Аватар для Devilox
 
Регистрация: 14.01.2012
Адрес: Зеленоград
Сообщений: 192
Написано 5 полезных сообщений
(для 9 пользователей)
Ответ: Управление отдельными объектами из типа.

Вроде работает, но у меня ощущение, что я тут зря намудрил. Подскажете что-нибудь?

Graphics3D 0,0,32,1
SetBuffer BackBuffer()

Type T_cubes
	Field x
	Field y
	Field z
	Field col$
	Field ent
	Field hndl
End Type


cam = CreateCamera()

CreateCubes()

While Not KeyDown(1)

UpdateWorld()
RenderWorld()

Flip

Wend

End

;---------------------------------------------------;

Function CreateCubes()
	
	For i = 1 To 10
		cube.T_cubes = New T_cubes
		cube\ent = CreateCube()
		cube\x = i * 3 - 15
		cube\y = 0
		cube\z = 20
		cube\hndl = Handle(cube.T_cubes)
		
		If i > 1
			pointer.T_cubes = New T_cubes		
			pointer.T_cubes = Object.T_cubes(i - 1)
		
			If pointer\col = "green"
				cube\col = "blue"
			ElseIf pointer\col = "blue"
				cube\col = "red"
			ElseIf pointer\col = "red"
				cube\col = "green"
			EndIf
		Else			
			n = Rand(1,3)
		
			If n = 1
				cube\col = "red"
				EntityColor cube\ent,255,0,0
			ElseIf n = 2
				cube\col = "green"
				EntityColor cube\ent,0,255,0
			ElseIf n = 3
				cube\col = "blue"
				EntityColor cube\ent,0,0,255
			EndIf
		EndIf
		
		If cube\col = "red"
			EntityColor cube\ent,255,0,0
		ElseIf cube\col = "green"
			EntityColor cube\ent,0,255,0
		ElseIf cube\col = "blue"
			EntityColor cube\ent,0,0,255
		EndIf
		
		PositionEntity cube\ent,cube\x,cube\y,cube\z
	Next
End Function
__________________
(Offline)
 
Ответить с цитированием
Старый 25.08.2013, 01:58   #5
DStalk
Разработчик
 
Аватар для DStalk
 
Регистрация: 27.06.2009
Адрес: Рязань-Москва
Сообщений: 471
Написано 401 полезных сообщений
(для 1,072 пользователей)
Ответ: Управление отдельными объектами из типа.

Function CreateCubes()
	
	For i = 1 To 10
		cube.T_cubes = New T_cubes
		cube\ent = CreateCube()
		cube\x = i * 3 - 15
		cube\y = 0
		cube\z = 20
		cube\hndl = Handle(cube.T_cubes)
		
		If i > 1
			n=n+1:if n=4 then n=1
		Else			
			n = Rand(1,3)
		EndIf
		
		Select n
			Case 1:cube\col="red":EntityColor cube\ent,255,0,0
			Case 2:cube\col="green":EntityColor cube\ent,0,0,255
			Case 3:cube\col="blue":EntityColor cube\ent,0,0,255
		EndSelect

		PositionEntity cube\ent,cube\x,cube\y,cube\z
	Next
End Function
__________________
galaxies.su | dstalk.ru
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
ABTOMAT (25.08.2013)
Старый 25.08.2013, 04:15   #6
ABTOMAT
Ференька
 
Аватар для ABTOMAT
 
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,741
Написано 5,461 полезных сообщений
(для 15,675 пользователей)
Ответ: Управление отдельными объектами из типа.

К сожалению, у меня нет возможности запустить код в блице, поэтому исхожу только из того, что прочитал.

cube\hndl Handle(cube.T_cubes
Вот тут ты суёшь хендл объекта в поле самого этого объекта. Я не очень понял чего ты хотел добиться этим действием.

Я сначала думал, ты по Entity хочешь найти свой объект T_cubes, так?
Тогда я бы предложил засовать хендл в NameEntity для cube\ent вместо cube\hndl.
Типа так:

NameEntity cube\entHandle(cube.T_cubes
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**

* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена

(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
DStalk (25.08.2013)
Старый 25.08.2013, 10:37   #7
Devilox
ПроЭктировщик
 
Аватар для Devilox
 
Регистрация: 14.01.2012
Адрес: Зеленоград
Сообщений: 192
Написано 5 полезных сообщений
(для 9 пользователей)
Ответ: Управление отдельными объектами из типа.

Мне нужно сделать новую систему координат, а т. к. с помощью handle и object можно обратиться к кубу только по числу, возможно беспроблемное определение типа соседних кубов, лишь задав их координаты. Если генерировать весь уровень просто построчно, то, вроде, можно обойтись без этих команд, привязываясь только к значению i, но я хочу генерировать сначала поверхность(для избежания выхода за пределы карты), а потом уже внутреннюю часть, поэтому число i не будет постоянно определённым...Или можно по-другому?
__________________
(Offline)
 
Ответить с цитированием
Старый 25.08.2013, 13:11   #8
DStalk
Разработчик
 
Аватар для DStalk
 
Регистрация: 27.06.2009
Адрес: Рязань-Москва
Сообщений: 471
Написано 401 полезных сообщений
(для 1,072 пользователей)
Ответ: Управление отдельными объектами из типа.

Так как поверхность скорее всего будет прямоугольная и непрерывная, лучше всего для нее создать двухмерный массив, в качестве значений использовать хендлы типа, хотя, имхо, это изврат

Кстати, может быть, массиву можно присвоить тип, но я этого в блитце никогда не делал...

Type T_cubes
	Field x
	Field y
	Field z
	Field col$
	Field ent
	Field hndl
End Type

Dim Map(10,10)



For x=1 to 10
	For y=1 to 10
		cube.T_cubes = New T_cubes
		cube\ent = CreateCube()
		cube\x = x*tile_size
		cube\y = y*tile_size
		cube\z = 20
		Map(x,y) = Handle(cube.T_cubes)
	Next
Next
Далее уже можно обращаться к типу через массив, с известными x и y.


Вообще лучше всего бросить блитц, и использовать PureBasic, например в связке с Xors3D или тем же самым B3D.
В нем такая конструкция получится такого вида:

Structure Cube
	X.i:Y.i:Z.i
	Color.i:Entity.i
EndStructure

;Далее любую переменную, массив, список и т.д. можно объявлять с этой структурой:
Dim Tiles_array.Cube(100)
NewList Tiles_list.Cube()
NewMap Tiles_map.Cube()

;Примеры
Tiles_array(1)\X=10:Tiles_array(1)\Y=20

AddElement(Tiles_list())
Tiles_list()\X=10
Tiles_list()\Y=20

Tiles_map("Element_name")\X=10
Tiles_map("Element_name")\Y=20
__________________
galaxies.su | dstalk.ru
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Devilox (25.08.2013)
Старый 25.08.2013, 14:48   #9
Devilox
ПроЭктировщик
 
Аватар для Devilox
 
Регистрация: 14.01.2012
Адрес: Зеленоград
Сообщений: 192
Написано 5 полезных сообщений
(для 9 пользователей)
Ответ: Управление отдельными объектами из типа.

Спасибо, пока буду разбираться с этим способом.
Вот только по задумке непрерывных поверхностей быть не должно. Сильно такой случай будет отличаться, или достаточно ещё рандом добавить?
(Массив, как я понял, выполняет роль дополнительных координат)
__________________
(Offline)
 
Ответить с цитированием
Старый 25.08.2013, 14:58   #10
Devilox
ПроЭктировщик
 
Аватар для Devilox
 
Регистрация: 14.01.2012
Адрес: Зеленоград
Сообщений: 192
Написано 5 полезных сообщений
(для 9 пользователей)
Ответ: Управление отдельными объектами из типа.

Да, я вот ещё заметил, что плохо использовать for...next в for...next, т.к. я текстом проверил: пишу координаты 10,5, а он мне выводит номер куба 95, а должно быть 50
__________________
(Offline)
 
Ответить с цитированием
Старый 25.08.2013, 14:59   #11
DStalk
Разработчик
 
Аватар для DStalk
 
Регистрация: 27.06.2009
Адрес: Рязань-Москва
Сообщений: 471
Написано 401 полезных сообщений
(для 1,072 пользователей)
Ответ: Управление отдельными объектами из типа.

Массив - для удобства обращений к типу через координаты Можно в массиве оставлять нулевые значения, а потом делать проверку If Map(x,y)=0 then в этом квадрате ничего нет.
__________________
galaxies.su | dstalk.ru
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Devilox (25.08.2013)
Старый 25.08.2013, 15:30   #12
Devilox
ПроЭктировщик
 
Аватар для Devilox
 
Регистрация: 14.01.2012
Адрес: Зеленоград
Сообщений: 192
Написано 5 полезных сообщений
(для 9 пользователей)
Ответ: Управление отдельными объектами из типа.

Блин, for...next в for...next работает, только нужно местами x и y поменять
__________________
(Offline)
 
Ответить с цитированием
Старый 25.08.2013, 16:19   #13
Devilox
ПроЭктировщик
 
Аватар для Devilox
 
Регистрация: 14.01.2012
Адрес: Зеленоград
Сообщений: 192
Написано 5 полезных сообщений
(для 9 пользователей)
Ответ: Управление отдельными объектами из типа.

Так, как юзать Handle, я понял, а с командой Object что делать? Что-то не получается. По-моему, я с pointer-ом намудрил...
Function CreateCubes()
	For y = 1 To 10
		For x = 1 To 10
			cube.T_cubes = New T_cubes
			cube\ent = CreateCube()
			cube\x = x * 3 - 15
			cube\y = y * 3 - 15
			cube\z = 20
			map(x,y) = Handle(cube.T_cubes)
			
			If x = 1 And y = 1
				n = Rand(1,2)
				
				Select n
					Case 1
						cube\col = "red" : EntityColor cube\ent,255,0,0
					Case 2
						cube\col = "green" : EntityColor cube\ent,0,255,0
				End Select
			Else
				pointer.T_cubes = Object.T_cubes(map(x - 1,y))
				
				If pointer\col = "red"
					cube\col = "green"
					EntityColor cube\ent,0,255,0
				ElseIf pointer\col = "green"
					cube\col = "red"
					EntityColor cube\ent,255,0,0
				EndIf
			EndIf
				
			PositionEntity cube\ent,x * 3 - 15,y * 3 - 15,20
		Next
	Next
End Function
__________________
(Offline)
 
Ответить с цитированием
Старый 25.08.2013, 16:30   #14
DStalk
Разработчик
 
Аватар для DStalk
 
Регистрация: 27.06.2009
Адрес: Рязань-Москва
Сообщений: 471
Написано 401 полезных сообщений
(для 1,072 пользователей)
Ответ: Управление отдельными объектами из типа.

If x = 1 And y = 1 надо поставить Or (а вообще надо пересмотреть это условие, поставить просто If x=1, вроде правильно будет), в строчке map(x - 1,y) может получиться ноль, когда x=1 и y=2 например.
__________________
galaxies.su | dstalk.ru
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Devilox (25.08.2013)
Старый 25.08.2013, 16:38   #15
Devilox
ПроЭктировщик
 
Аватар для Devilox
 
Регистрация: 14.01.2012
Адрес: Зеленоград
Сообщений: 192
Написано 5 полезных сообщений
(для 9 пользователей)
Ответ: Управление отдельными объектами из типа.

Работает!!!!

Function CreateCubes()
	For y = 1 To 10
		For x = 1 To 10
			cube.T_cubes = New T_cubes
			cube\ent = CreateCube()
			cube\x = x * 3 - 15
			cube\y = y * 3 - 15
			cube\z = 20
			map(x,y) = Handle(cube.T_cubes)
			
			If x = 1 And y = 1
				n = Rand(1,2)
				
				Select n
					Case 1
						cube\col = "red" : EntityColor cube\ent,255,0,0
					Case 2
						cube\col = "green" : EntityColor cube\ent,0,255,0
				End Select
			Else
				If x > 1
					pointer.T_cubes = Object.T_cubes(map(x - 1,y))
				
					If pointer\col = "red"
						cube\col = "green"
						EntityColor cube\ent,0,255,0
					ElseIf pointer\col = "green"
						cube\col = "red"
						EntityColor cube\ent,255,0,0
					EndIf
				Else
					pointer.T_cubes = Object.T_cubes(map(1,y - 1))
					
					If pointer\col = "red"
						cube\col = "green"
						EntityColor cube\ent,0,255,0
					ElseIf pointer\col = "green"
						cube\col = "red"
						EntityColor cube\ent,255,0,0
					EndIf
				EndIf
			EndIf				
				
			PositionEntity cube\ent,x * 3 - 15,y * 3 - 15,20
		Next
	Next
End Function
if x = 1 and y = 1 надо оставить, т.к. это условие абсолютного начала генерации
__________________
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

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

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


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


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