Guest User

Untitled

a guest
Dec 12th, 2022
547
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.59 KB | None | 0 0
  1. ###Flappy_bird.rpy
  2.  
  3. init python:
  4.  
  5.  
  6. class ShooterActor(renpy.Displayable):
  7. """Base class for Shooter objects.
  8. """
  9. def __init__(self, displayable, speed=(0, 0), start=(0, 0), *args, **kwargs):
  10. super(ShooterActor, self).__init__(*args, **kwargs)
  11.  
  12. self.displayable = displayable
  13.  
  14. self.speed_x = 0 ###Герой
  15. self.speed_y = 0 ###Герой
  16.  
  17. self.max_speed_x = speed[0] ### Боты
  18. self.max_speed_y = speed[1] ### Боты
  19.  
  20. self.start_x = start[0]
  21. self.start_y = start[1]
  22.  
  23. self.x = start[0]
  24. self.y = start[1]
  25.  
  26. # Stores the old value of the st value from render()
  27. self.old_st = None
  28.  
  29. self.alive = True
  30.  
  31. self.displayable_render = None
  32.  
  33. @property
  34. def width(self):
  35. """Relies on the object already being rendered on screen.
  36.  
  37. Returns: int
  38. """
  39. try:
  40. return self.displayable_render.get_size()[0]
  41. except AttributeError:
  42. return 0
  43.  
  44. @property
  45. def height(self):
  46. """Relies on the object already being rendered on screen.
  47.  
  48. Returns: int
  49. """
  50. try:
  51. return self.displayable_render.get_size()[1]
  52. except AttributeError:
  53. return 0
  54.  
  55. def overlaps_with(self, other):
  56. """Check if this object's rectangle overlaps with another one."""
  57.  
  58. left = self.x
  59. right = self.x + self.width
  60. top = self.y
  61. bottom = self.y + self.height
  62.  
  63. other_left = other.x
  64. other_right = other.x + other.width
  65. other_top = other.y
  66. other_bottom = other.y + other.height
  67.  
  68. horizontal_hit = False
  69. vertical_hit = False
  70.  
  71. # Left side of self hits other
  72. if (left >= other_left) and (left <= other_right):
  73. horizontal_hit = True
  74.  
  75. # Right side of self hits other
  76. if (right >= other_left) and (right <= other_right):
  77. horizontal_hit = True
  78.  
  79. # Top side of self hits other
  80. if (top >= other_top) and (top <= other_bottom):
  81. vertical_hit = True
  82.  
  83. # Bottom side of self hits other
  84. if (bottom >= other_top) and (bottom <= other_bottom):
  85. vertical_hit = True
  86.  
  87. if horizontal_hit and vertical_hit:
  88. return True
  89. return False
  90.  
  91. def inside_bounds(self):
  92. """Check if Actor is in the screen bounds."""
  93. if (self.x < 0) or (self.x > config.screen_width):
  94. return False
  95. elif (self.y < 0) or (self.y > config.screen_height):
  96. return False
  97.  
  98. return True
  99.  
  100. init python:
  101.  
  102.  
  103.  
  104. class EnemyShooterActor(ShooterActor):
  105. def __init__(self, *args, **kwargs):
  106. super(EnemyShooterActor, self).__init__(*args, **kwargs)
  107.  
  108. self.wave = 1
  109.  
  110. def render(self, width, height, st, at):
  111. render = renpy.Render(width, height)
  112.  
  113. if self.alive:
  114. # Figure out the time elapsed since the previous frame.
  115. if self.old_st is None:
  116. self.old_st = st
  117.  
  118. dtime = st - self.old_st
  119. self.old_st = st
  120.  
  121.  
  122. speed_x = dtime * self.max_speed_x
  123. speed_y = dtime * self.max_speed_y
  124.  
  125. self.x += speed_x
  126. self.y += speed_y
  127.  
  128. self.displayable_render = renpy.render(
  129. self.displayable,
  130. width,
  131. height,
  132. st,
  133. at
  134. )
  135.  
  136. # Kill enemies when they leave the screen
  137. self.alive = self.inside_bounds()
  138.  
  139. # Regenerate enemies at their original position
  140. if not self.alive:
  141. self.x = self.start_x
  142. self.y = self.start_y
  143. self.alive = True
  144.  
  145. renpy.redraw(self, 0)
  146. render.blit(self.displayable_render, (self.x, self.y))
  147.  
  148. return render
  149.  
  150.  
  151. class EnemyGroup(object):
  152. def __init__(self, start=(0, 0), enemies=None):
  153. for enemy in enemies:
  154. enemy.start_x += start[0]
  155. enemy.start_y += start[1]
  156.  
  157. enemy.x += start[0]
  158. enemy.y += start[1]
  159.  
  160. self.enemies = enemies
  161.  
  162. init python:
  163. import pygame
  164.  
  165.  
  166.  
  167.  
  168. class ShooterPlayer(ShooterActor):
  169. def __init__(self, displayable=None, bullet=None, speed=(0, 0), start=(0, 0), *args, **kwargs):
  170. super(ShooterPlayer, self).__init__(
  171. displayable, speed, start, *args, **kwargs)
  172.  
  173. self.weapon = ShooterWeapon(self, bullet=bullet)
  174. self.enemies = []
  175.  
  176. def check_overlap(self):
  177. for enemy in self.enemies:
  178. for bullet in self.weapon.bullets:
  179. if bullet.overlaps_with(enemy):
  180. enemy.alive = False
  181.  
  182. if self.overlaps_with(enemy):
  183. self.alive = False
  184.  
  185. def move_player(self):
  186. if self.y <= 600:
  187. self.speed_y = self.max_speed_y / 2
  188. else:
  189. self.speed_y = 0
  190. keys = pygame.key.get_pressed()
  191.  
  192. #if keys[pygame.K_LEFT]:
  193. #self.speed_x = -self.max_speed_x
  194. #elif keys[pygame.K_RIGHT]:
  195. #self.speed_x = self.max_speed_x
  196.  
  197. if keys[pygame.K_SPACE]:
  198. if self.y >= 0:
  199. self.speed_y = -self.max_speed_y
  200. else:
  201. self.speed_y = 0
  202. #elif keys[pygame.K_DOWN]:
  203. #self.speed_y = self.max_speed_y
  204.  
  205. def render(self, width, height, st, at):
  206. render = renpy.Render(width, height)
  207.  
  208. # Figure out the time elapsed since the previous frame.
  209. if self.old_st is None:
  210. self.old_st = st
  211.  
  212. dtime = st - self.old_st
  213. self.old_st = st
  214.  
  215. self.check_overlap()
  216.  
  217. self.move_player()
  218.  
  219. speed_x = dtime * self.speed_x
  220. speed_y = dtime * self.speed_y
  221.  
  222. self.x += speed_x
  223. self.y += speed_y
  224.  
  225. self.displayable_render = renpy.render(
  226. self.displayable,
  227. width,
  228. height,
  229. st,
  230. at
  231. )
  232.  
  233. # Drawing bullets in ShooterPlayer's render so they
  234. # implicitly get added to the screen
  235. for bullet in self.weapon.bullets:
  236. b = renpy.render(bullet, width, height, st, at)
  237. render.blit(b, (0, 0))
  238.  
  239. renpy.redraw(self, 0)
  240. render.blit(self.displayable_render, (self.x, self.y))
  241.  
  242. return render
  243.  
  244. def event(self, ev, x, y, st):
  245. if ev.type == pygame.KEYUP:
  246. self.speed_x = 0
  247. self.speed_y = 0
  248.  
  249. #elif ev.type == pygame.KEYDOWN:
  250. #if ev.key == pygame.K_SPACE:
  251. #self.weapon.generate_bullets()
  252.  
  253. if not self.alive:
  254. return False
  255. else:
  256. raise renpy.IgnoreEvent()
  257.  
  258. init python:
  259. import copy
  260.  
  261.  
  262.  
  263.  
  264. class ShooterWeapon(object):
  265. def __init__(self, player, bullet=None, *args, **kwargs):
  266. self.player = player
  267. self.bullet = bullet
  268.  
  269. self.bullets = []
  270. self.max_bullets = 6
  271.  
  272. def generate_bullets(self):
  273. # TODO: Don't create new bullet objects, recycle the existing ones.
  274.  
  275. # If a bullet is dead, remove it from the list
  276. for item in self.bullets:
  277. if not item.alive:
  278. self.bullets.remove(item)
  279.  
  280. # If less than the max number of bullets allowed, add a new bullet
  281. if len(self.bullets) < (self.max_bullets - 1):
  282. self.bullet.x = self.player.x
  283. self.bullet.y = self.player.y
  284. self.bullets.append(copy.deepcopy(self.bullet))
  285.  
  286.  
  287. class ShooterBullet(ShooterActor):
  288. def __init__(self, displayable=None, speed=(0, 0), *args, **kwargs):
  289. super(ShooterBullet, self).__init__(
  290. displayable, speed, *args, **kwargs)
  291.  
  292. self.alive = True
  293.  
  294. def render(self, width, height, st, at):
  295. render = renpy.Render(width, height)
  296.  
  297. # Figure out the time elapsed since the previous frame.
  298. if self.old_st is None:
  299. self.old_st = st
  300.  
  301. dtime = st - self.old_st
  302. self.old_st = st
  303.  
  304. speed_x = dtime * self.max_speed_x
  305. speed_y = dtime * self.max_speed_y
  306.  
  307. self.x += speed_x
  308. self.y -= speed_y
  309.  
  310. self.displayable_render = renpy.render(
  311. self.displayable,
  312. width,
  313. height,
  314. st,
  315. at
  316. )
  317.  
  318. renpy.redraw(self, 0)
  319. render.blit(self.displayable_render, (self.x, self.y))
  320.  
  321. # Kill bullets when they leave the screen
  322. self.alive = self.inside_bounds()
  323.  
  324. return render
  325.  
  326.  
  327. ###script.rpy
  328. default standard_bullet = ShooterBullet(Image("bullet.png"), speed=(300, 0))
  329. default actor = ShooterPlayer(Image("actor.png"), bullet=standard_bullet, start=(1100, 100), speed=(300, 300))
  330.  
  331. default enemy1 = EnemyShooterActor(Image("enemy.png"), speed=(150, 0), start=(-950, 0))
  332. default enemy2 = EnemyShooterActor(Image("enemy.png"), speed=(150, 0), start=(-900, 50))
  333. default enemy3 = EnemyShooterActor(Image("enemy.png"), speed=(150, 0), start=(-850, 150))
  334.  
  335. default enemy4 = EnemyShooterActor(Image("enemy.png"), speed=(120, 0), start=(-950, 400))
  336. default enemy5 = EnemyShooterActor(Image("enemy.png"), speed=(120, 0), start=(-900, 500))
  337. default enemy6 = EnemyShooterActor(Image("enemy.png"), speed=(120, 0), start=(-850, 550))
  338.  
  339.  
  340. default enemy_group = EnemyGroup(start=(980, 100), enemies=[enemy1, enemy2, enemy3, enemy4, enemy5, enemy6])
  341.  
  342. screen shooter_main():
  343. add actor
  344.  
  345. for enemy in enemy_group.enemies:
  346. add enemy
  347.  
  348. label start:
  349. $ actor.enemies = [enemy1, enemy2, enemy3, enemy4, enemy5, enemy6]
  350. call screen shooter_main
  351.  
  352. "Game Over"
Advertisement
Add Comment
Please, Sign In to add comment