Показать сообщение отдельно
Старый 09.11.2012, 16:44   #14
Devilox
ПроЭктировщик
 
Аватар для Devilox
 
Регистрация: 14.01.2012
Адрес: Зеленоград
Сообщений: 192
Написано 5 полезных сообщений
(для 9 пользователей)
Ответ: Отскок мяча

Ура!!! Получилось!!! Код, конечно, плохой, но он работает(движение по координатам и гравитация):
Global player
Global cam
Global pln
Global gun
Global pivo
Global cube

Global v# = 0.5
Global g# = 0.005

Graphics3D 800,600,32,1
SetBuffer BackBuffer()

Const TYPE_PLANE = 1 
Const TYPE_SPHERES = 2

Type T_bullets
	Field ent
	Field old_x#
	Field old_y#
	Field old_z#
	Field xspeed#
	Field yspeed#
	Field zspeed#
	Field m%
End Type

player = CreateSphere()
EntityType player,TYPE_SPHERES

cam = CreateCamera(player)

gun = CreateCylinder()
ScaleEntity gun,0.2,0.5,0.2
EntityColor gun,200,50,50
EntityParent gun,cam
PositionEntity gun,1.2,-0.8,1
TurnEntity gun,90,0,0

pivo = CreatePivot()
EntityParent pivo,gun
PositionEntity pivo,0,1,0

pln = CreatePlane()
PositionEntity pln,0,-2,0
EntityColor pln,50,150,150
EntityType pln,TYPE_PLANE

cube1 = CreateCube()
EntityType cube1,TYPE_PLANE
EntityColor cube1,50,50,200
ScaleEntity cube1,2,2,1
PositionEntity cube1,0,-1,-5

cube2 = CreateCube()
EntityType cube2,TYPE_PLANE
EntityColor cube2,50,50,200
ScaleEntity cube2,2,2,1
PositionEntity cube2,0,-1,5

Collisions TYPE_SPHERES,TYPE_PLANE,2,1

HidePointer()

While Not KeyHit(1)

If MouseHit(1)
	CreateBullet()
EndIf

UpdateBullets()

If KeyDown(17) MoveEntity player,0,0,0.1
If KeyDown(31) MoveEntity player,0,0,-0.1
If KeyDown(30) MoveEntity player,-0.1,0,0
If KeyDown(32) MoveEntity player,0.1,0,0

TurnEntity player, 0, 0 -MouseXSpeed() * 0.1, 0
TurnEntity cam, MouseYSpeed() * 0.1, 0, 0			
MoveMouse GraphicsWidth() / 2, GraphicsHeight() / 2
RotateEntity cam, EntityPitch#(cam), 0, 0

UpdateWorld()
RenderWorld()

Flip

Wend

End

;---------------------------------------------------;

Function CreateBullet.T_bullets()
	ex_bul.T_bullets = New T_bullets
	ex_bul\ent = CreateSphere(6,pivo)	
	ScaleEntity ex_bul\ent,0.2,0.2,0.2
	EntityParent ex_bul\ent,0
	RotateEntity ex_bul\ent,0,0,0
	EntityType ex_bul\ent,TYPE_SPHERES
	EntityRadius ex_bul\ent,0.2,0.2
	
	ex_bul\old_x = EntityX(ex_bul\ent)
	ex_bul\old_y = EntityY(ex_bul\ent)
	ex_bul\old_z = EntityZ(ex_bul\ent)
	
	ex_bul\xspeed = v * Cos(-EntityPitch#(cam)) * Sin(-EntityYaw#(player))
	ex_bul\yspeed = v * Sin(-EntityPitch#(cam))
	ex_bul\zspeed = v * Cos(-EntityPitch#(cam)) * Cos(EntityYaw#(player))
	
	ex_bul\m = 1
	
	Return ex_bul
End Function

Function UpdateBullets()
	Local ex_bul.T_bullets
	
	For ex_bul = Each T_bullets
	
	If ex_bul\m = 1		
		MoveEntity ex_bul\ent,ex_bul\xspeed,ex_bul\yspeed,ex_bul\zspeed
		ex_bul\yspeed = ex_bul\yspeed - g
	EndIf
				
		If EntityCollided(ex_bul\ent,TYPE_PLANE)
			
			ex_bul\m = 0
			
			For c% = 1 To CountCollisions(ex_bul\ent)
				nx# = CollisionNX(ex_bul\ent,c)
				ny# = CollisionNY(ex_bul\ent,c)
				nz# = CollisionNZ(ex_bul\ent,c)
			
				If nz <> 0
					If ex_bul\zspeed > 0
						ex_bul\zspeed = ex_bul\zspeed * nz
					Else
						ex_bul\zspeed = ex_bul\zspeed * (-nz)
					EndIf
				EndIf
				
				If nx <> 0
					If ex_bul\xspeed > 0
						ex_bul\xspeed = ex_bul\xspeed * nx
					Else
						ex_bul\xspeed = ex_bul\xspeed * (-nx)
					EndIf
				EndIf
				
				If ny <> 0
					If ex_bul\yspeed > 0
						ex_bul\yspeed = ex_bul\yspeed * ny
					Else
						ex_bul\yspeed = ex_bul\yspeed * (-ny)
					EndIf
				EndIf

				ex_bul\m  = 1
			Next
				
		EndIf
	Next
End Function
__________________

Последний раз редактировалось Devilox, 11.11.2012 в 13:50. Причина: Разобрался :)
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
CRASHER (19.12.2013)