pygame用精灵编组的问题的猜想和验证(未完待续)
?一、第一部分
#文件1.py from ship import Ship from settings import Settings from pygame.sprite import Group import pygame import game_functions as gf def run_game():pygame.init()my_set = Settings()screen = pygame.display.set_mode(my_set.set_mode)my_ship = Ship(screen,my_set)ships = Group()ships.add(my_ship)bullets = Group()pygame.display.set_caption(my_set.set_caption)while True:gf.check_events(screen,my_ship,my_set,bullets)bullets.update()#用編組update完全可以的ships.update()gf.update_screen(screen,my_ship,bullets,my_set)#刪除多余的子彈for bullet in bullets.copy():if bullet.rect.bottom < 0:bullets.remove(bullet) run_game()#文件game_functions.py from bullet import Bullet import pygame import sys def check_keydown_events(screen,ship,ai_settings,bullets,event):if event.key == pygame.K_RIGHT:ship.moving_right = Trueelif event.key == pygame.K_LEFT:ship.moving_left = Trueelif event.key == pygame.K_UP:ship.moving_up = Trueelif event.key == pygame.K_DOWN:ship.moving_down = Trueelif event.key == pygame.K_SPACE:new_bullet = Bullet(screen,ship,ai_settings)bullets.add(new_bullet)elif event.key == pygame.K_q:sys.exit()def check_keyup_events(ship,event):if event.key == pygame.K_RIGHT:ship.moving_right = Falseelif event.key == pygame.K_LEFT:ship.moving_left = Falseelif event.key == pygame.K_UP:ship.moving_up = Falseelif event.key == pygame.K_DOWN:ship.moving_down = Falsedef check_events(screen,ship,ai_settings,bullets):for event in pygame.event.get():if event.type == pygame.KEYDOWN:check_keydown_events(screen,ship,ai_settings,bullets,event) elif event.type == pygame.KEYUP:check_keyup_events(ship,event)elif event.type == pygame.QUIT:sys.exit()def update_screen(screen,ship,bullets,ai_settings):screen.fill(ai_settings.color)#這里不能用編組畫ship,否則報錯,#'Group' has no attribute 'blitme',所以,編組不能直接畫飛船ship.blitme()for bullet in bullets.sprites():bullet.draw_bullet()pygame.display.flip()#文件settings.py import pygame import sys class Settings():def __init__(self):self.set_mode = (1000,800)self.set_caption = "alien invasion"self.color = (255,255,255)self.bullet_color = 60,60,60self.bullet_speed_factor = 0.5self.bullet_width = 3self.bullet_height = 15#文件ship.py import pygame from pygame.sprite import Sprite class Ship(Sprite):def __init__(self,screen,settings):super().__init__()self.screen = screenself.settings = settingsself.image = pygame.image.load("ship.bmp")self.rect = self.image.get_rect()self.screen_rect = self.screen.get_rect()self.rect.centerx = self.screen_rect.centerxself.rect.bottom = self.screen_rect.bottomself.moving_right = Falseself.moving_left = Falseself.moving_up = Falseself.moving_down = Falseself.center = float(self.rect.centerx)def update(self):if self.moving_right and self.rect.right < self.screen_rect.right:self.rect.centerx += 1elif self.moving_left and self.rect.left > 0:self.rect.centerx -= 1elif self.moving_up and self.rect.top > self.screen_rect.top:self.rect.bottom -= 1elif self.moving_down and self.rect.bottom < self.screen_rect.bottom:self.rect.bottom += 1def blitme(self):self.screen.blit(self.image,self.rect)#文件bullet.py from pygame.sprite import Sprite import pygameclass Bullet(Sprite):def __init__(self,screen,ship,ai_settings):super().__init__()self.screen = screenself.settings = ai_settingsself.rect = pygame.Rect(0,0,ai_settings.bullet_width,ai_settings.bullet_height)self.rect.top = ship.rect.topself.rect.centerx = ship.rect.centerxself.y = float(self.rect.y)def draw_bullet(self):pygame.draw.rect(self.screen,self.settings.bullet_color,self.rect)def update(self):self.y -= self.settings.bullet_speed_factorself.rect.y = self.y編組不能畫飛船的意思是,如果在主函數1.py中創立編組,比如ships = Group(),然后把ship加入,執行ships.blitme()是錯誤的。不能運行成功。即稱為編組不能畫飛船。我自己理解的。
但是,編組可以執行飛船位置更新,也就是按上述過程創立編組,然后執行ships.update()可以把飛船的位置更新.
另外,雖然,編組不能畫飛船,但是可以對編組的每個元素,飛別調用畫飛船的函數。如下:
for ship in ships.sprites():ship.blitme()或者
for ship in ships: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(),否則匯報錯:
?bullets.draw_bullet() AttributeError: 'Group' object has no attribute 'draw_bullet'第二部分:
如果對子彈編組調用如下代碼,匯報錯:
bullets.draw(screen)編譯器提示如下:
pygame 1.9.6 Hello from the pygame community. https://www.pygame.org/contribute.html Traceback (most recent call last):File "game.py", line 23, in <module>run_game()File "game.py", line 22, in run_gameupdate_screen(screen,my_set,my_ship,bullets)File "/home/r/alien_invasion/1/game_functions.py", line 46, in update_screenbullets.draw(screen) File "/usr/lib/python3/dist-packages/pygame/sprite.py", line 476, in drawself.spritedict[spr] = surface_blit(spr.image, spr.rect) AttributeError: 'Bullet' object has no attribute 'image'大題意思是,bullet沒有image屬性,所以不能使用bullets.draw(screen)來運行代碼??淳幾g結尾的敘述,類似? ? 精靈編組.draw(screen)的代碼其實是如下方式調用的:
? ? ? ? ? ? self.screen.blit(self.image,self.rect)? ?#這句是偽代碼,是解釋調用.draw(screen)的過程
?
總結
以上是生活随笔為你收集整理的pygame用精灵编组的问题的猜想和验证(未完待续)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 删除副本列表中的消失项目符号
- 下一篇: C++中如何初始化类中const或引用类