Показать сообщение отдельно
Старый 04.09.2005, 06:29   #11
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
вот так будут улетать вдаль спрайты. Слово далеко относится к неопределённой логике. Ограничим расстояние полёта.
	Field dist#
добавим ещё одно поле в тип. И обработаем его:
Function update_shot()
	vs#=1
	max_dist#=1000
	For a.shot=Each shot
 MoveEntity a\entity,0,0,vs#
 a\dist#=a\dist#+vs#
 If a\dist#>max_dist#
 	FreeEntity a\entity
 	Delete a
 EndIf
	Next
End Function
будем накапливать всоответствующем поле пройденное "снарядом" расстояние, и если оно больше максимального, то: очистим память, занимаемую спрайтом, затем удалим этот элемент типа. В том, что всё работает как надо Вы можите убедиться поэкспериментировав со значением max_dist# и сделав кучу выстрелов (после исчезновения выстрелов фпс возвращается в стабильное состояние).
Const SHOTT=3;for shot
в глобал.
Collisions SHOTT,TERRT,2,1
в создание мира
EntityType s\entity,SHOTT
в создании выстрела.
Если запустить программу теперь, то можно наблюдать забавный эффект - поверхность стала уловителем выстрелов:



Обновим условие в цикле обработки выстрелов
 If a\dist#>max_dist#
 	FreeEntity a\entity
 	Delete a
 ElseIf EntityCollided(a\entity,TERRT) < > 0
 	FreeEntity a\entity
 	Delete a
 EndIf
Теперь при столкновении текущего спрайта с объектом, у которого коллизионный тип (а не "обычный" тип - как shot) TERRT, происходит удаление выстрела.

;инициализация графики
Graphics3D 800,600,32
SetBuffer BackBuffer()

Global user
Global camera

Const G#=1

Const USERT=1;for user
Const TERRT=2;for terrain
Const SHOTT=3;for shot

Global pricel=LoadImage("pricel.bmp")
Global shot_sprite=LoadSprite("sprite.bmp")

Type shot
	Field entity
	Field dist#
End Type

;создание игрока
Function create_user(x#=0,y#=10,z#=0)

	MidHandle pricel
	MaskImage pricel,255,255,255
	
	user=CreateSphere()
	k#=3
	ScaleEntity user,k#,k#,k#
	EntityRadius user,k#
	camera=CreateCamera(user)
	CameraRange camera,0.1,100
	PositionEntity user,x#,y#,z#
	EntityType user,USERT

End Function

;обновление игрока
Function update_user()

	V#=0.5
	u#=70;предельный угол
	TurnEntity camera,MouseYSpeed(),0,0
	TurnEntity user,0,-MouseXSpeed(),0
	If KeyDown(203)=1 Then MoveEntity user,-V#,0,0
	If KeyDown(205)=1 Then MoveEntity user,V#,0,0
	If KeyDown(200)=1 Then MoveEntity user,0,0,+V# 
	If KeyDown(208)=1 Then MoveEntity user,0,0,-V#
	MoveMouse GraphicsWidth()*0.5,GraphicsHeight()*0.5
	If Abs(EntityPitch#(camera))>u# RotateEntity camera,u#*Sgn(EntityPitch#(camera)),0,0
	
	If MouseHit(1) create_shot(EntityX(user),EntityY(user),EntityZ(user),EntityPitch(camera),EntityYaw(user),0)
;физика
	TranslateEntity user,0,-G#,0
End Function

Function create_Shot(x#,y#,z#,pitch#,yaw#,roll#)
	s.shot=New shot
	s\entity=CopyEntity(shot_sprite)
	EntityType s\entity,SHOTT
	PositionEntity s\entity,x#,y#,z#,1
	RotateEntity s\entity,pitch#,yaw#,roll#,1
	Return True
End Function

Function update_shot()
	vs#=1
	max_dist#=1000
	For a.shot=Each shot
 MoveEntity a\entity,0,0,vs#
 a\dist#=a\dist#+vs#
 If a\dist#>max_dist#
 	FreeEntity a\entity
 	Delete a
 ElseIf EntityCollided(a\entity,TERRT) < > 0
 	FreeEntity a\entity
 	Delete a
 EndIf
	Next
End Function

;создание игрового мира
Function create_world()
	HideEntity shot_sprite
	terrain=CreatePlane()
	tertex=LoadTexture("terrain1.jpg")
	ScaleTexture tertex,10,10
	EntityTexture terrain,tertex
	FreeTexture tertex
	EntityType terrain,TERRT
	create_user()
	Collisions USERT,TERRT,2,3
	Collisions SHOTT,TERRT,2,1
End Function
;функции закончились 
;--------------------------------
create_world()

;MAIN LOOP
While Not KeyHit(1)=1
	update_user()
	update_shot()
	UpdateWorld()
	RenderWorld()
	DrawImage pricel,MouseX(),MouseY()
	Flip
Wend
;----------------------------
End
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием