当前位置:   article > 正文

python3 pygame的发射子弹自编程序_from pygame.sprite import group

from pygame.sprite import group

这是主程序1.py

  1. #1.py主程序
  2. import sys
  3. import pygame
  4. from settings import Settings
  5. from ship import Ship
  6. from gamefunctions import update_screen
  7. from bullet import Bullet
  8. from gamefunctions import check_events
  9. from pygame.sprite import Group
  10. def run_game():
  11. pygame.init()
  12. my_set = Settings()
  13. screen = pygame.display.set_mode(my_set.set_mode)
  14. my_ship = Ship(screen,my_set)
  15. screen = pygame.display.set_mode(my_set.set_mode)
  16. pygame.display.set_caption(my_set.set_caption)
  17. bullets = Group()
  18. while True:
  19. update_screen(my_ship,my_set,screen,bullets)
  20. run_game()

这是bullet.py子弹定义的程序 

  1. #bullet.py 这是子弹的定义程序
  2. import pygame
  3. #导入精灵的类Sprite,用于创建子弹,精灵方便用pygame.sprite的组Group管理子弹
  4. from pygame.sprite import Sprite
  5. #定义子弹的类Bullet,这是一个继承类,继承了类Sprite
  6. class Bullet(Sprite):
  7. def __init__(self,ai_settings,screen,ship):
  8. #初始化父类
  9. super().__init__()
  10. self.screen = screen
  11. #定义表示子弹的长方形,位置为屏幕左上角(0,0)
  12. self.rect = pygame.Rect(0,0,ai_settings.bullet_width,
  13. ai_settings.bullet_height)
  14. #设置子弹的位置为飞船的顶部
  15. self.rect.centerx = ship.rect.centerx
  16. self.rect.top = ship.rect.top
  17. #定义self.py表示飞船的位置,这里为了微调子弹,所以定义为一个float对象
  18. self.y = float(self.rect.y)
  19. #存储子弹颜色
  20. self.color = ai_settings.bullet_color
  21. #子弹的速度
  22. self.speed_factor = ai_settings.bullet_speed_factor
  23. def update(self):
  24. #这个函数更新子弹的位置,子弹向屏幕上方移动,横坐标不变,所以只需要改变纵坐标
  25. self.y -= self.speed_factor
  26. #把self.py赋值给子弹的纵坐标
  27. self.rect.y =self.y
  28. def draw_bullet(self):
  29. #下面这句是表示在屏幕上绘制子弹
  30. pygame.draw.rect(self.screen,self.color,self.rect)
  1. #gamefunctions.py
  2. import pygame
  3. import sys
  4. #因为下面要创建子弹实例,所以必须导入表示子弹的类
  5. from bullet import Bullet
  6. def check_keydown(event,ship,screen,bullets,settings):
  7. if event.key == pygame.K_DOWN:
  8. ship.moving_down = True
  9. if event.key == pygame.K_UP:
  10. ship.moving_up = True
  11. if event.key == pygame.K_LEFT:
  12. ship.moving_left = True
  13. if event.key == pygame.K_RIGHT:
  14. ship.moving_right = True
  15. if event.key == pygame.K_SPACE:
  16. #创建一个子弹
  17. new_bullet = Bullet(settings,screen,ship)
  18. #把子弹加入组bullets中,bullets是一个Group,一会方便用这个Group对象管理所有子弹
  19. #特别是方便更新子弹的位置
  20. bullets.add(new_bullet)
  21. #放开按键不用增加别的代码,因为放开按键对子弹没有什么影响
  22. def check_keyup(event,ship):
  23. if event.key == pygame.K_RIGHT:
  24. ship.moving_right = False
  25. if event.key == pygame.K_LEFT:
  26. ship.moving_left = False
  27. if event.key == pygame.K_UP:
  28. ship.moving_up = False
  29. if event.key == pygame.K_DOWN:
  30. ship.moving_down = False
  31. def check_events(ship,screen,bullets,settings):
  32. for event in pygame.event.get():
  33. if event.type == pygame.QUIT:
  34. sys.exit()
  35. if event.type == pygame.KEYDOWN:
  36. check_keydown(event,ship,screen,bullets,settings)
  37. if event.type == pygame.KEYUP:
  38. check_keyup(event,ship)
  39. def update_screen(ship,settings,screen,bullets):
  40. check_events(ship,screen,bullets,settings)
  41. ship.update()
  42. screen.fill(settings.color)
  43. #刷新子弹位置
  44. bullets.update()
  45. ship.blitme()
  46. #对bullets中每一个子弹,都绘制到屏幕上,sprites()得到所有子弹的一个类似列表的对象
  47. for bullet in bullets.sprites():
  48. bullet.draw_bullet()
  49. #下面是屏幕刷新程序,在刷新前必须绘制子弹
  50. pygame.display.flip()

我们可以发现, 某个函数中要建立类,那么只需要导入这个类即可,这个类需要的其它类不需要导入,只需要在函数参数表中出现即可

  1. #settings.py 这是设置程序
  2. class Settings():
  3. def __init__(self):
  4. self.set_mode = (1000,800)
  5. self.set_caption = "alien invasion"
  6. self.speed_factor = 1.5
  7. self.color = (255,255,255)
  8. self.bullet_speed_factor = 1
  9. self.bullet_color = 60,60,60
  10. self.bullet_width = 3
  11. self.bullet_height = 15
  1. #ship.py
  2. import pygame
  3. class Ship():
  4. def __init__(self,screen,settings):
  5. self.screen = screen
  6. self.settings = settings
  7. self.image = pygame.image.load("ship.bmp")
  8. self.rect = self.image.get_rect()
  9. self.screen_rect = self.screen.get_rect()
  10. self.rect.centerx = self.screen_rect.centerx
  11. self.rect.bottom = self.screen_rect.bottom
  12. self.moving_left = False
  13. self.moving_right = False
  14. self.moving_up = False
  15. self.moving_down = False
  16. self.center_x = float(self.rect.centerx)
  17. self.settings = settings
  18. def blitme(self):
  19. self.screen.blit(self.image,self.rect)
  20. def update(self):
  21. if self.moving_left and self.rect.left > 0:
  22. self.center_x -= self.settings.speed_factor
  23. if self.moving_right and self.rect.right < self.screen_rect.right:
  24. self.center_x += self.settings.speed_factor
  25. if self.moving_up:
  26. self.rect.bottom -= 1
  27. if self.moving_down:
  28. self.rect.bottom += 1
  29. self.rect.centerx = self.center_x

本文所用到的ship.bmp的下载   链接: https://pan.baidu.com/s/1Dn5yaQGZLIsN0BohM8PzoA  密码: 38ie

运行结果:

注意几个问题:

1.有时候定义类的对象的时候,少几个参数编译器是检测不出来的。

2.定义矩形的代码是:pygame.Rect(0,0,width,height),这里的R是大写的,如果写成小写,会报告以下错误:

  1. self.rect = pygame.rect(0,0,settings.bullet_width,settings.bullet_height)
  2. TypeError: 'module' object is not callable

这是目前自己学习是pygame中的第一个以大写字母开头的pygame的方法

3.精灵的英文是:sprite,读作[spraɪt]

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/123153
推荐阅读
相关标签
  

闽ICP备14008679号