当前位置:   article > 正文

pygame用精灵编组的问题的猜想和验证(未完待续)_pygame编组

pygame编组

 一、第一部分

  1. #文件1.py
  2. from ship import Ship
  3. from settings import Settings
  4. from pygame.sprite import Group
  5. import pygame
  6. import game_functions as gf
  7. def run_game():
  8. pygame.init()
  9. my_set = Settings()
  10. screen = pygame.display.set_mode(my_set.set_mode)
  11. my_ship = Ship(screen,my_set)
  12. ships = Group()
  13. ships.add(my_ship)
  14. bullets = Group()
  15. pygame.display.set_caption(my_set.set_caption)
  16. while True:
  17. gf.check_events(screen,my_ship,my_set,bullets)
  18. bullets.update()
  19. #用编组update完全可以的
  20. ships.update()
  21. gf.update_screen(screen,my_ship,bullets,my_set)
  22. #删除多余的子弹
  23. for bullet in bullets.copy():
  24. if bullet.rect.bottom < 0:
  25. bullets.remove(bullet)
  26. run_game()
  27. #文件game_functions.py
  28. from bullet import Bullet
  29. import pygame
  30. import sys
  31. def check_keydown_events(screen,ship,ai_settings,bullets,event):
  32. if event.key == pygame.K_RIGHT:
  33. ship.moving_right = True
  34. elif event.key == pygame.K_LEFT:
  35. ship.moving_left = True
  36. elif event.key == pygame.K_UP:
  37. ship.moving_up = True
  38. elif event.key == pygame.K_DOWN:
  39. ship.moving_down = True
  40. elif event.key == pygame.K_SPACE:
  41. new_bullet = Bullet(screen,ship,ai_settings)
  42. bullets.add(new_bullet)
  43. elif event.key == pygame.K_q:
  44. sys.exit()
  45. def check_keyup_events(ship,event):
  46. if event.key == pygame.K_RIGHT:
  47. ship.moving_right = False
  48. elif event.key == pygame.K_LEFT:
  49. ship.moving_left = False
  50. elif event.key == pygame.K_UP:
  51. ship.moving_up = False
  52. elif event.key == pygame.K_DOWN:
  53. ship.moving_down = False
  54. def check_events(screen,ship,ai_settings,bullets):
  55. for event in pygame.event.get():
  56. if event.type == pygame.KEYDOWN:
  57. check_keydown_events(screen,ship,ai_settings,bullets,event)
  58. elif event.type == pygame.KEYUP:
  59. check_keyup_events(ship,event)
  60. elif event.type == pygame.QUIT:
  61. sys.exit()
  62. def update_screen(screen,ship,bullets,ai_settings):
  63. screen.fill(ai_settings.color)
  64. #这里不能用编组画ship,否则报错,
  65. #'Group' has no attribute 'blitme',所以,编组不能直接画飞船
  66. ship.blitme()
  67. for bullet in bullets.sprites():
  68. bullet.draw_bullet()
  69. pygame.display.flip()
  70. #文件settings.py
  71. import pygame
  72. import sys
  73. class Settings():
  74. def __init__(self):
  75. self.set_mode = (1000,800)
  76. self.set_caption = "alien invasion"
  77. self.color = (255,255,255)
  78. self.bullet_color = 60,60,60
  79. self.bullet_speed_factor = 0.5
  80. self.bullet_width = 3
  81. self.bullet_height = 15
  82. #文件ship.py
  83. import pygame
  84. from pygame.sprite import Sprite
  85. class Ship(Sprite):
  86. def __init__(self,screen,settings):
  87. super().__init__()
  88. self.screen = screen
  89. self.settings = settings
  90. self.image = pygame.image.load("ship.bmp")
  91. self.rect = self.image.get_rect()
  92. self.screen_rect = self.screen.get_rect()
  93. self.rect.centerx = self.screen_rect.centerx
  94. self.rect.bottom = self.screen_rect.bottom
  95. self.moving_right = False
  96. self.moving_left = False
  97. self.moving_up = False
  98. self.moving_down = False
  99. self.center = float(self.rect.centerx)
  100. def update(self):
  101. if self.moving_right and self.rect.right < self.screen_rect.right:
  102. self.rect.centerx += 1
  103. elif self.moving_left and self.rect.left > 0:
  104. self.rect.centerx -= 1
  105. elif self.moving_up and self.rect.top > self.screen_rect.top:
  106. self.rect.bottom -= 1
  107. elif self.moving_down and self.rect.bottom < self.screen_rect.bottom:
  108. self.rect.bottom += 1
  109. def blitme(self):
  110. self.screen.blit(self.image,self.rect)
  111. #文件bullet.py
  112. from pygame.sprite import Sprite
  113. import pygame
  114. class Bullet(Sprite):
  115. def __init__(self,screen,ship,ai_settings):
  116. super().__init__()
  117. self.screen = screen
  118. self.settings = ai_settings
  119. self.rect = pygame.Rect(0,0,ai_settings.bullet_width,ai_settings.bullet_height)
  120. self.rect.top = ship.rect.top
  121. self.rect.centerx = ship.rect.centerx
  122. self.y = float(self.rect.y)
  123. def draw_bullet(self):
  124. pygame.draw.rect(self.screen,self.settings.bullet_color,self.rect)
  125. def update(self):
  126. self.y -= self.settings.bullet_speed_factor
  127. self.rect.y = self.y

编组不能画飞船的意思是,如果在主函数1.py中创立编组,比如ships = Group(),然后把ship加入,执行ships.blitme()是错误的。不能运行成功。即称为编组不能画飞船。我自己理解的。

但是,编组可以执行飞船位置更新,也就是按上述过程创立编组,然后执行ships.update()可以把飞船的位置更新.

另外,虽然,编组不能画飞船,但是可以对编组的每个元素,飞别调用画飞船的函数。如下:

  1. for ship in ships.sprites():
  2. ship.blitme()

或者

  1. for ship in ships:
  2. ship.blitme()

 两者有啥区别,我不知道,但是都可以运行成功,这样说来,飞船编组完全没问题。

结论:

不论是pygame自己画图还是从外面load图片,最后要使得图形移动,都可以编组的,也就是调用导入类pygame.sprite.Group,然后创立编组,进行管理。

现在有如下结论:

假设ship的编组是ships,bullet的编组是bullets:

(1)ships可以执行update(飞船位置更新),但是不能执行ships.blitme(),否则会报错,’Group‘ has no attribute 'blitme'

(2)bullets可以执行update(子弹位置更新),但是不能执行bullets.draw_bullet(),否则汇报错:

  1.  bullets.draw_bullet()
  2. AttributeError: 'Group' object has no attribute 'draw_bullet'

第二部分:

如果对子弹编组调用如下代码,汇报错:

bullets.draw(screen)   

编译器提示如下:

  1. pygame 1.9.6
  2. Hello from the pygame community. https://www.pygame.org/contribute.html
  3. Traceback (most recent call last):
  4. File "game.py", line 23, in <module>
  5. run_game()
  6. File "game.py", line 22, in run_game
  7. update_screen(screen,my_set,my_ship,bullets)
  8. File "/home/r/alien_invasion/1/game_functions.py", line 46, in update_screen
  9. bullets.draw(screen)
  10. File "/usr/lib/python3/dist-packages/pygame/sprite.py", line 476, in draw
  11. self.spritedict[spr] = surface_blit(spr.image, spr.rect)
  12. AttributeError: 'Bullet' object has no attribute 'image'

大题意思是,bullet没有image属性,所以不能使用bullets.draw(screen)来运行代码。看编译结尾的叙述,类似    精灵编组.draw(screen)的代码其实是如下方式调用的:

            self.screen.blit(self.image,self.rect)   #这句是伪代码,是解释调用.draw(screen)的过程
 

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

闽ICP备14008679号