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