Показать сообщение отдельно
Старый 15.07.2009, 18:20   #40
IGR
Blitz's Shame !!
 
Регистрация: 31.03.2007
Сообщений: 3,639
Написано 832 полезных сообщений
(для 2,013 пользователей)
Ответ: Gotaka. Адвенчура с легкой примесью RPG.

Очень часто в играх персонаж имеет возможность взаемодействовать с разными предметами и сущностями, которые описываются разными типами даных !!
Например, есть типы предметов (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
(Offline)
 
Ответить с цитированием
Эти 3 пользователя(ей) сказали Спасибо IGR за это полезное сообщение:
Fatalix3d (15.07.2009), H@NON (15.07.2009), Nex (16.07.2009)