Показать сообщение отдельно
Старый 21.03.2015, 20:25   #24
LLI.T.A.L.K.E.R.
Мастер
 
Аватар для LLI.T.A.L.K.E.R.
 
Регистрация: 24.06.2009
Адрес: Набережные Челны
Сообщений: 930
Написано 292 полезных сообщений
(для 504 пользователей)
Ответ: Стрельба в игре

Готовый проект:
(потребуется BlitzBASS1.7)

https://www.dropbox.com/s/p0g70w0huj9iqqw/Game.rar?dl=0
Include "Includes\Bass.bb"

Width=800 : Height=600
Width2=Width/2 : Height2=Height/2	;для середины экрана
Graphics3D Width,Height,32,2

;пояснения
;Type EnemyType	;для массива врагов
;	Field ent	;для модели врага
;	Field hp%	;для здоровья врага 
;	Field idle_delay	;как часто враг будет говорить

Type EnemyType
	Field ent
	Field hp%
	Field idle_delay
End Type

BASS_Init(-1,44100,BASS_DEVICE_3D,0,BASS_NULL)
BASS_CheckVersion()
BASS_Set3DFactors(-1,0.5,-1)
BASS_Apply3D()

Camera=CreateCamera()

Dim IdleSnd(3)	;рандомный массив голосов
Dim CrySnd(3)	;рандомный массив плача

IdleNum=1	;переменная чтобы следить, чтобы враги не повторяли фразы
IdleSnd(1)=BASS_StreamCreateFile(0,"Sounds\idle1.wav",0,0,BASS_SAMPLE_3D)
BASS_ChannelSetAttributes(IdleSnd(1),-1,200,-1)
IdleSnd(2)=BASS_StreamCreateFile(0,"Sounds\idle2.wav",0,0,BASS_SAMPLE_3D)
BASS_ChannelSetAttributes(IdleSnd(2),-1,200,-1)
IdleSnd(3)=BASS_StreamCreateFile(0,"Sounds\idle3.wav",0,0,BASS_SAMPLE_3D)
BASS_ChannelSetAttributes(IdleSnd(3),-1,200,-1)

CrySnd(1)=BASS_StreamCreateFile(0,"Sounds\Cry1.wav",0,0,BASS_SAMPLE_3D)
BASS_ChannelSetAttributes(CrySnd(1),-1,200,-1)
CrySnd(2)=BASS_StreamCreateFile(0,"Sounds\Cry2.wav",0,0,BASS_SAMPLE_3D)
BASS_ChannelSetAttributes(CrySnd(2),-1,200,-1)
CrySnd(3)=BASS_StreamCreateFile(0,"Sounds\Cry3.wav",0,0,BASS_SAMPLE_3D)
BASS_ChannelSetAttributes(CrySnd(3),-1,200,-1)

DieSnd=BASS_StreamCreateFile(0,"Sounds\die.wav",0,0,BASS_SAMPLE_3D)
BASS_ChannelSetAttributes(DieSnd,-1,200,-1)

For i=1 To 5	;создадим 5 врагов
	Enemy.EnemyType=New EnemyType
	Enemy\ent=CreateCube()
	PositionEntity Enemy\ent,Rnd(-100,100),0,Rnd(-100,100)
	EntityPickMode Enemy\ent,2	;делаем врага выбираемым
	NameEntity Enemy\ent,Handle(Enemy)	;называем модель врага ссылкой на ячейку врага
	Enemy\hp=100
	Enemy\idle_delay=Rand(300,1000)	;через сколько враг будет выговаривать фразу
Next

Const FPS%=60
period=1000/FPS
time=MilliSecs()-period

While Not KeyHit(1)

Repeat	;FPS limit
elapsed=MilliSecs()-time
Until elapsed
ticks=elapsed/period
tween#=Float(elapsed Mod period)/Float(period)
For k=1 To ticks	;FPS limit
time=time+period
	
	Speed=1	;для ускорения при нажатом Shift
	If KeyDown(42) Then Speed=2
	
	If KeyDown(200) Then MoveEntity Camera,0,0,0.1*Speed	;камера вперёд
	If KeyDown(208) Then MoveEntity Camera,0,0,-0.1*Speed	;камера назад
	
	If KeyDown(203) Then TurnEntity Camera,0,1*Speed,0		;камера влево
	If KeyDown(205) Then TurnEntity Camera,0,-1*Speed,0		;камера вправо
	
	If KeyHit(57) Then
		CameraPick(Camera,Width2,Height2)	;проверяем выборку по центру экрана
		ent=PickedEntity()	;присваиваем к ent что мы выбрали
		If ent<>0 Then	;если что-то выбрали
			If EntityDistance(ent,Camera)<10 Then	;если враг ближе 10 метров
				Enemy.EnemyType=Object.EnemyType(EntityName(ent))	;берём из имени ссылку на ячейку врага
				Enemy\hp=Enemy\hp-25	;вычитываем 25 здоровья
				
				CryNum%=Rand(1,3)	;выбираем разный номер плача
				BASS_ChannelSet3DPositionPos(CrySnd(CryNum),EntityX(Enemy\ent),EntityY(Enemy\ent),EntityZ(Enemy\ent)) ;помещаем звук плача где находится враг
				BASS_ChannelPlay(CrySnd(CryNum),True)	;играем звук плач
				
				If Enemy\hp<1 Then	;если у врага нет жизней
					BASS_ChannelSet3DPositionPos(DieSnd,EntityX(Enemy\ent),EntityY(Enemy\ent),EntityZ(Enemy\ent)) ;помещаем звук смерти где находится враг
					BASS_ChannelPlay(DieSnd,True)	;играем звук смерти
					
					FreeEntity Enemy\ent	;удаляем его модель
					Delete Enemy	;удаляем врага
				EndIf
			EndIf
		EndIf
	EndIf
	
	For Enemy.EnemyType=Each EnemyType	;цикл для каждого из врагов
		Enemy\idle_delay=Enemy\idle_delay-1
		
		If Enemy\idle_delay<1 Then	;если задержка для говора закончилась
			Enemy\idle_delay=Rand(300,1000)	;через сколько враг будет выговаривать фразу
			
			IdleNum=IdleNum+1	;выбираем следующий номер фразы
			If IdleNum>3 Then IdleNum=1
			BASS_ChannelSet3DPositionPos(IdleSnd(IdleNum),EntityX(Enemy\ent),EntityY(Enemy\ent),EntityZ(Enemy\ent)) ;помещаем звук где находится враг
			BASS_ChannelPlay(IdleSnd(IdleNum),True)	;играем звук говора 
		EndIf
	Next
	
	BASS_Update3DListener(Camera)	;обновляем звуковую позицию камеры
	BASS_Apply3D()	;применяем
	
	UpdateWorld()
Next ;end FPS limit

RenderWorld()
Flip()

Wend

End
(Offline)
 
Ответить с цитированием
Эти 3 пользователя(ей) сказали Спасибо LLI.T.A.L.K.E.R. за это полезное сообщение:
Arton (21.03.2015), Randomize (21.03.2015), tormoz (21.03.2015)