Очень часто в играх персонаж имеет возможность взаемодействовать с разными предметами и сущностями, которые описываются разными типами даных !!
Например, есть типы предметов (Type TItems), есть тип врагов (Type TEnemy), есть тип друзей (Type TFriends) и т.д. !! Ну что угодно короче... ;-)
Одним из самых популярных методов взаимодействия персонажа с этими предметами и сущностями является pick (команды CameraPick и т.д.) !! Естественно, если мы взаемодействуем с предметом - мы его подымаем и кладем себе в инвентарь например, если с врагом - начинаем бой, если с другом - начинаем разговор и т.д. !!
Что бы начать соответствующие взаимодействие нужно во-первых знать к какому класу он относится и какой именно объект класса "активирован" (т. е. его Handle) !!
Все это можна зделать с помощью замечательных команд: NameEntity, EntityName !!
Смысл в чем ?? При создании объекта, нужную информацию в виде строки мы записываем объекту в "Имя":
temp.TCube = New TCube
temp\ent = CreateCube()
; здесь мы записываем идентификатор типи и его хендп (Handle)
NameEntity temp\ent, Str(Handle(temp))+"cube"
Потом, когды мы вибрали какой-то объект, мы читаем эту информацию:
; читаем информацию
ent_info$ = EntityName(f_picked)
; извлекаем идентификатор типа
ent_type$ = Right(ent_info, 5)
Потом, выбираем какое действие нам выполнять:
Select ent_type$
Case "items"
obj1.TItems = Object.TItems(Int(ent_info))
; поднимаем предмет
Case "enemy"
obj1.TEnemy = Object.TEnemy(Int(ent_info))
; начинаем бой
Case "frend"
obj1.TFriend = Object.TFriend(Int(ent_info))
; начинаем общятся
End Select
Все !! Далее код примера !! Может поможет разобраться лучше !! ;-)
Graphics3D 800,600,32,2
SetBuffer BackBuffer()
SeedRnd (MilliSecs())
Global prev_picked% = 0
posXrange = 20
posYrange = 20
posZrange = 20
cam = CreateCamera()
PositionEntity cam,0,40,-100
; тип куба
Type TCube
Field ent%
Field size%
Field alpha#
End Type
; тип сферы
Type TSphere
Field ent%
Field radius%
Field alpha#
End Type
; тип конуса
Type TCone
Field ent%
Field height%
Field radius%
Field alpha#
End Type
; функция создания куба
Function Create_Cube.TCube(f_posX%, f_posY%, f_posZ%)
temp.TCube = New TCube
temp\ent = CreateCube()
NameEntity temp\ent, Str(Handle(temp))+"cube"
EntityPickMode temp\ent, 2
PositionEntity temp\ent, f_posX, f_posY, f_posZ
temp\size = Rand(2, 5)
ScaleEntity temp\ent, temp\size, temp\size, temp\size
temp\alpha = Rnd(0.2, 0.8)
EntityAlpha temp\ent, temp\alpha
Return temp
End Function
; функция создания сферы
Function Create_Sphere.TSphere(f_posX%, f_posY%, f_posZ%)
temp.TSphere = New TSphere
temp\ent = CreateSphere()
NameEntity temp\ent, Str(Handle(temp))+"sfer"
EntityPickMode temp\ent, 2
PositionEntity temp\ent, f_posX, f_posY, f_posZ
temp\radius = Rand(3, 8)
ScaleEntity temp\ent, temp\radius, temp\radius, temp\radius
temp\alpha = Rnd(0.2, 0.8)
EntityAlpha temp\ent, temp\alpha
Return temp
End Function
; функция создания конуса
Function Create_Cone.TCone(f_posX%, f_posY%, f_posZ%)
temp.TCone = New TCone
temp\ent = CreateCone()
NameEntity temp\ent, Str(Handle(temp))+"cone"
EntityPickMode temp\ent, 2
PositionEntity temp\ent, f_posX, f_posY, f_posZ
temp\radius = Rand(3, 8)
temp\height = Rand(3, 8)
ScaleEntity temp\ent, temp\radius, temp\height, temp\radius
temp\alpha = Rnd(0.2, 0.8)
EntityAlpha temp\ent, temp\alpha
Return temp
End Function
cube1.TCube = Create_Cube(-30, 10, -30)
cube2.TCube = Create_Cube(-30, 10, 0)
cube3.TCube = Create_Cube(-30, 10, 50)
sphere1.TSphere = Create_Sphere(0, 10, -30)
sphere2.TSphere = Create_Sphere(0, 10, 0)
sphere3.TSphere = Create_Sphere(0, 10, 50)
cone1.TCone = Create_Cone(30, 10, -30)
cone2.TCone = Create_Cone(30, 10, 0)
cone3.TCone = Create_Cone(30, 10, 50)
Function PickControl(f_picked%)
If f_picked<>prev_picked Then
ent_info$ = EntityName(f_picked)
ent_type$ = Right(ent_info, 4)
Select ent_type$
Case "cube"
cube.TCube = Object.TCube(Int(ent_info))
EntityColor cube\ent, Rand(0, 255), Rand(0, 255), Rand(0, 255)
Case "sfer"
sfer.TSphere = Object.TSphere(Int(ent_info))
ScaleEntity sfer\ent, Rand(3, 8), Rand(3, 8), Rand(3, 8)
Case "cone"
cone.TCone = Object.TCone(Int(ent_info))
EntityAlpha cone\ent, Rnd(0.2, 0.8)
ScaleEntity cone\ent, Rand(3, 8), Rand(3, 8), Rand(3, 8)
End Select
prev_picked = f_picked
EndIf
End Function
Repeat
mx=MouseX()
my=MouseY()
picked=CameraPick(cam,mx,my)
If picked<>0 PickControl(picked)
RenderWorld()
Flip
Until KeyHit(1)
End