|
23.08.2013, 19:29
|
#1
|
ПроЭктировщик
Регистрация: 14.01.2012
Адрес: Зеленоград
Сообщений: 192
Написано 5 полезных сообщений (для 9 пользователей)
|
Управление отдельными объектами из типа.
Мне нужно сделать генератор карт, использующий отдельно нарисованные комнаты. Механизм предельно прост: создание комнат идёт построчно с нумерацией и проверкой типа соседних комнат. Проблема в том, что EntityName не помогает обратиться к нужной комнате. Что делать?
__________________
|
(Offline)
|
|
24.08.2013, 04:48
|
#2
|
Ференька
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,742
Написано 5,461 полезных сообщений (для 15,675 пользователей)
|
Ответ: Управление отдельными объектами из типа.
Почитай про функции Handle и Object. Они позволят засовать в имя ентити хендл объекта, а потом получить по нему сам объект.
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**
* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
24.08.2013, 13:02
|
#3
|
ПроЭктировщик
Регистрация: 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
|
ПроЭктировщик
Регистрация: 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
|
Разработчик
Регистрация: 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
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
25.08.2013, 04:15
|
#6
|
Ференька
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,742
Написано 5,461 полезных сообщений (для 15,675 пользователей)
|
Ответ: Управление отдельными объектами из типа.
К сожалению, у меня нет возможности запустить код в блице, поэтому исхожу только из того, что прочитал.
cube\hndl = Handle(cube.T_cubes)
Вот тут ты суёшь хендл объекта в поле самого этого объекта. Я не очень понял чего ты хотел добиться этим действием.
Я сначала думал, ты по Entity хочешь найти свой объект T_cubes, так?
Тогда я бы предложил засовать хендл в NameEntity для cube\ent вместо cube\hndl.
Типа так:
NameEntity cube\ent, Handle(cube.T_cubes)
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**
* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
25.08.2013, 10:37
|
#7
|
ПроЭктировщик
Регистрация: 14.01.2012
Адрес: Зеленоград
Сообщений: 192
Написано 5 полезных сообщений (для 9 пользователей)
|
Ответ: Управление отдельными объектами из типа.
Мне нужно сделать новую систему координат, а т. к. с помощью handle и object можно обратиться к кубу только по числу, возможно беспроблемное определение типа соседних кубов, лишь задав их координаты. Если генерировать весь уровень просто построчно, то, вроде, можно обойтись без этих команд, привязываясь только к значению i, но я хочу генерировать сначала поверхность(для избежания выхода за пределы карты), а потом уже внутреннюю часть, поэтому число i не будет постоянно определённым...Или можно по-другому?
__________________
|
(Offline)
|
|
25.08.2013, 13:11
|
#8
|
Разработчик
Регистрация: 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
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
25.08.2013, 14:48
|
#9
|
ПроЭктировщик
Регистрация: 14.01.2012
Адрес: Зеленоград
Сообщений: 192
Написано 5 полезных сообщений (для 9 пользователей)
|
Ответ: Управление отдельными объектами из типа.
Спасибо, пока буду разбираться с этим способом.
Вот только по задумке непрерывных поверхностей быть не должно. Сильно такой случай будет отличаться, или достаточно ещё рандом добавить?
(Массив, как я понял, выполняет роль дополнительных координат)
__________________
|
(Offline)
|
|
25.08.2013, 14:58
|
#10
|
ПроЭктировщик
Регистрация: 14.01.2012
Адрес: Зеленоград
Сообщений: 192
Написано 5 полезных сообщений (для 9 пользователей)
|
Ответ: Управление отдельными объектами из типа.
Да, я вот ещё заметил, что плохо использовать for...next в for...next, т.к. я текстом проверил: пишу координаты 10,5, а он мне выводит номер куба 95, а должно быть 50
__________________
|
(Offline)
|
|
25.08.2013, 14:59
|
#11
|
Разработчик
Регистрация: 27.06.2009
Адрес: Рязань-Москва
Сообщений: 471
Написано 401 полезных сообщений (для 1,072 пользователей)
|
Ответ: Управление отдельными объектами из типа.
Массив - для удобства обращений к типу через координаты Можно в массиве оставлять нулевые значения, а потом делать проверку If Map(x,y)=0 then в этом квадрате ничего нет.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
25.08.2013, 15:30
|
#12
|
ПроЭктировщик
Регистрация: 14.01.2012
Адрес: Зеленоград
Сообщений: 192
Написано 5 полезных сообщений (для 9 пользователей)
|
Ответ: Управление отдельными объектами из типа.
Блин, for...next в for...next работает, только нужно местами x и y поменять
__________________
|
(Offline)
|
|
25.08.2013, 16:19
|
#13
|
ПроЭктировщик
Регистрация: 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
|
Разработчик
Регистрация: 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 например.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
25.08.2013, 16:38
|
#15
|
ПроЭктировщик
Регистрация: 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)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 19:06.
|