Advertisement
Guest User

Untitled

a guest
Mar 5th, 2016
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;shooting.bb
  2. Graphics3D 800,600
  3.  
  4. PositionEntity CreateCamera(),0,0,-20
  5. RotateEntity CreateLight(),45,45,45
  6.  
  7. ;Тип для пушки - координаты, угол, режим стрельбы, указатели на 3D-объекты,
  8. ; переменные для AI
  9. Type turret
  10. Field x#,y#,Mode,head,barrel,ang#,dir#,dx#,dy#
  11. End Type
  12.  
  13. ;Тип для выстрела - координаты, приращения, указатель на 3D-объект,
  14. ; расстояние от пушки, вспомогательные переменные для AI
  15. Type shot
  16. Field x#,y#,dx#,dy#,h,r#,tx#,ty#,dir#,t.turret
  17. End Type
  18.  
  19. Const aimax=200,aistp#=.2
  20. Dim aiang#(aimax)
  21.  
  22. SetFont LoadFont("arial",14)
  23. SetBuffer BackBuffer()
  24.  
  25. ;Константы - период стрельбы, скорость снарядов, скорость игрока
  26. Const frq=200, v0#=.01, vp#=.005
  27. ;Const frq=200, v0#=.2, vp#=.1
  28. Const bs#=2
  29.  
  30. Global x#,y#
  31.  
  32. ;createturret 1:createturret 2:createturret 3:createturret 4
  33. createturret 5:createturret 4:createturret 2
  34.  
  35.  
  36. ;Создание игрока
  37. p=CreateSphere(16)
  38. h=CreateSphere(8,p)
  39. PositionEntity h,1,0,0
  40. ScaleEntity h,.4,.4,.4
  41.  
  42. Repeat
  43. tim=MilliSecs()
  44.  
  45. For t.turret=Each turret
  46.  
  47.   ;Вспомогательные переменные + нацеливание на игрока по умолчанию
  48.   dx#=x#-t\x
  49.   dy#=y#-t\y
  50.   cang#=ATan2(dy#,dx)
  51.   t\dx#=dx#
  52.   t\dy#=dy#
  53.   t\dir#=cang#
  54.   pr#=Sqr(dx#*dx#+dy#*dy#)
  55.  
  56.   ;Режимы прицеливания пушек:
  57.   Select t\Mode
  58.   Case 0; стрельба в данном направлении
  59.     cang=0
  60.   Case 1; стрельба с вращением
  61.     cang#=t\ang#+.05*dt#
  62.   Case 2; точное нацеливание на объект
  63.  
  64.   Case 3; стрельба веером
  65.     cang#=cang#+Sin(dcang#)*30
  66.     dcang#=dcang#+2
  67.   Case 4; стрельба на опережение
  68.     ;Вычисление коэффициентов квадратного уравнения
  69.     a#=v#*v#-v0#*v0#
  70.     b#=2.0*v#*(dx#*Cos(ang#)+dy#*Sin(ang#)-bs#)
  71.     c#=dx#*dx#+dy#*dy#-bs#*bs#
  72.     ;Вычисление дискриминанта
  73.     d#=b#*b#-4.0*a#*c#
  74.     If d#>=0 Then
  75.     ;Вычисление момента встречи снаряда и игрока
  76.     t1#=(-b#+Sqr(d#))/2.0/a#
  77.     t2#=(-b#-Sqr(d#))/2.0/a#
  78.     If t2#>0 Then t1#=t2#
  79.     If t1#>=0 Then
  80.       ;Вычисление угла через координаты объекта в найденный момент времени
  81.       cang#=ATan2(y#+t1#*v#*Sin(ang#)-t\y#,x#+t1#*v#*Cos(ang#)-t\x#)
  82.     End If
  83.     End If
  84.   Case 5; самообучающаяся пушка (поправка к углу берется из массива
  85.     cang#=cang#+aiang(Int(pr#*aistp#))
  86.   End Select
  87.  
  88.   ;Поворот пушки
  89.   rotateturret t,cang#
  90.   ;Возврат дула на прежнее положение
  91.   If EntityX(t\barrel)<.75 Then MoveEntity t\barrel,0,-.25/frq*dt#,0
  92.  
  93.   ;Выстрел и смещение дула внутрь пушки
  94.   If nextshot<=tim Then
  95.   fire t
  96.   PositionEntity t\barrel,.5,0,0
  97.   End If
  98. Next
  99.  
  100. ;Задание следующего момента стрельбы
  101. If nextshot<=tim Then nextshot=tim+frq
  102.  
  103. For s.shot=Each shot
  104.   ;Смещение снарядов
  105.   s\x#=s\x#+s\dx#*dt#
  106.   s\y#=s\y#+s\dy#*dt#
  107.   s\r#=s\r#+v0#*dt#
  108.   PositionEntity s\h,s\x#,s\y#,0
  109.   ;Если расстояния от пушки до снаряда и до игрока равны, то
  110.   If pr#<=s\r# And s\dir#<999 Then
  111.   ;Вычисляется корректирующий угол для данного расстояния
  112.   Newang#=s\t\dir#-s\dir#
  113.   ; втискивается в границы [-180,180)
  114.   Newang#=Newang#-Floor((Newang#+180.0)/360.0)*360.0
  115.   ; и заносится в массив,
  116.   aiang(Int(pr#*aistp#))=Newang#
  117.   ; (следующая строка - чтобы не заносить этот снаряд в массив еще раз)
  118.   s\dir#=999
  119.   End If
  120.   If (s\x#-x#)^2+(s\y#-y#)^2<1 Then
  121.   FreeEntity s\h:Delete s
  122.   red=255
  123.   hits#=hits#+1
  124.   Else
  125.   ;Удаление снарядов, вышедших за границы экрана
  126.   If Abs(s\x#)+Abs(s\y#)>40 Then FreeEntity s\h:Delete s
  127.   End If
  128. Next
  129.  
  130. ;Индикация попадания
  131. If red>0 Then
  132.   red=red-Int(dt/3)
  133. Else
  134.   red=0
  135. End If
  136. EntityColor p,255,255-red,255-red
  137.  
  138. ;Перемещение и поворот игрока (скорость вычисляется исходя из прошедшего времени)
  139. PositionEntity p,x#,y#,0
  140. RotateEntity p,0,0,ang#
  141. v#=(KeyDown(200)-KeyDown(208))*vp#
  142. ang#=ang#+.3*dt#*(KeyDown(203)-KeyDown(205))
  143. x#=x#+v#*Cos(ang#)*dt#
  144. y#=y#+v#*Sin(ang#)*dt#
  145.  
  146. RenderWorld
  147. ;Счет
  148. Text 0,0,"Hits/sec:"+(hits#/sec#)
  149. Flip
  150. ;Время, затраченное этот цикл (дробное, так как умножается на дробные величины)
  151. dt#=MilliSecs()-tim
  152. sec#=sec#+0.001*dt#
  153. Until KeyHit(1)
  154.  
  155. Function createturret(Mode)
  156. ;Создание головной части
  157. t.turret=New turret
  158. t\head=CreateCylinder(6)
  159. ScaleMesh t\head,1,.5,1
  160. RotateMesh t\head,90,0,0
  161. ;Дуло создать отдельно, но привязать к головной части
  162. t\barrel=CreateCylinder(16,False)
  163. RotateEntity t\barrel,0,0,90
  164. ScaleEntity t\barrel,.2,1,.2
  165. PositionEntity t\barrel,.75,0,0
  166. h=CreateCylinder(16,True)
  167. ScaleEntity h,.3,.3,.3
  168. RotateEntity h,0,0,90
  169. PositionEntity h,2,0,0
  170. EntityParent t\barrel,t\head
  171. EntityParent h,t\barrel
  172. ;Задание координат пушки случайным образом
  173. t\x#=Rnd(-20,20)
  174. t\y#=Rnd(-20,20)
  175. PositionEntity t\head,t\x#,t\y#,0
  176. t\Mode=Mode
  177. End Function
  178.  
  179. Function rotateturret(t.turret,ang#)
  180. t\ang#=ang#
  181. RotateEntity t\head,0,0,ang#
  182. End Function
  183.  
  184. Function fire(t.turret)
  185. ang#=t\ang#
  186. s.shot=New shot
  187. s\x#=t\x#+Cos(ang#)*r
  188. s\y#=t\y#+Sin(ang#)*r
  189. s\r#=r
  190. s\dx#=Cos(ang#)*v0#
  191. s\dy#=Sin(ang#)*v0#
  192. s\h=CreateSphere(2)
  193. ScaleEntity s\h,.15,.15,.15
  194. EntityColor s\h,255,255,0
  195. ;Вспомогательные переменные (для AI)
  196. s\tx#=t\x#
  197. s\ty#=t\y#
  198. s\dir=t\dir#
  199. s\t=t
  200. End Function
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement