forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Blitz3D (http://forum.boolean.name/forumdisplay.php?f=45)
-   -   Управление отдельными объектами из типа. (http://forum.boolean.name/showthread.php?t=18486)

Devilox 23.08.2013 19:29

Управление отдельными объектами из типа.
 
Мне нужно сделать генератор карт, использующий отдельно нарисованные комнаты. Механизм предельно прост: создание комнат идёт построчно с нумерацией и проверкой типа соседних комнат. Проблема в том, что EntityName не помогает обратиться к нужной комнате. Что делать?

ABTOMAT 24.08.2013 04:48

Ответ: Управление отдельными объектами из типа.
 
Почитай про функции Handle и Object. Они позволят засовать в имя ентити хендл объекта, а потом получить по нему сам объект.

Devilox 24.08.2013 13:02

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

Код:

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


Devilox 25.08.2013 00:12

Ответ: Управление отдельными объектами из типа.
 
Вроде работает, но у меня ощущение, что я тут зря намудрил. Подскажете что-нибудь?

Код:

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


DStalk 25.08.2013 01:58

Ответ: Управление отдельными объектами из типа.
 
Код:

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


ABTOMAT 25.08.2013 04:15

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

PHP код:

cube\hndl Handle(cube.T_cubes

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

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

PHP код:

NameEntity cube\entHandle(cube.T_cubes


Devilox 25.08.2013 10:37

Ответ: Управление отдельными объектами из типа.
 
Мне нужно сделать новую систему координат, а т. к. с помощью handle и object можно обратиться к кубу только по числу, возможно беспроблемное определение типа соседних кубов, лишь задав их координаты. Если генерировать весь уровень просто построчно, то, вроде, можно обойтись без этих команд, привязываясь только к значению i, но я хочу генерировать сначала поверхность(для избежания выхода за пределы карты), а потом уже внутреннюю часть, поэтому число i не будет постоянно определённым...Или можно по-другому?

DStalk 25.08.2013 13:11

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

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

Код:

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


Devilox 25.08.2013 14:48

Ответ: Управление отдельными объектами из типа.
 
Спасибо, пока буду разбираться с этим способом. :)
Вот только по задумке непрерывных поверхностей быть не должно. Сильно такой случай будет отличаться, или достаточно ещё рандом добавить?
(Массив, как я понял, выполняет роль дополнительных координат)

Devilox 25.08.2013 14:58

Ответ: Управление отдельными объектами из типа.
 
Да, я вот ещё заметил, что плохо использовать for...next в for...next, т.к. я текстом проверил: пишу координаты 10,5, а он мне выводит номер куба 95, а должно быть 50

DStalk 25.08.2013 14:59

Ответ: Управление отдельными объектами из типа.
 
Массив - для удобства обращений к типу через координаты:) Можно в массиве оставлять нулевые значения, а потом делать проверку If Map(x,y)=0 then в этом квадрате ничего нет.

Devilox 25.08.2013 15:30

Ответ: Управление отдельными объектами из типа.
 
Блин, for...next в for...next работает, только нужно местами x и y поменять :)

Devilox 25.08.2013 16:19

Ответ: Управление отдельными объектами из типа.
 
Так, как юзать Handle, я понял, а с командой Object что делать? Что-то не получается. По-моему, я с pointer-ом намудрил...:dontknow:
Код:

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


DStalk 25.08.2013 16:30

Ответ: Управление отдельными объектами из типа.
 
If x = 1 And y = 1 надо поставить Or (а вообще надо пересмотреть это условие, поставить просто If x=1, вроде правильно будет), в строчке map(x - 1,y) может получиться ноль, когда x=1 и y=2 например.

Devilox 25.08.2013 16:38

Ответ: Управление отдельными объектами из типа.
 
Работает!!!!

Код:

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 надо оставить, т.к. это условие абсолютного начала генерации :)


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

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