python游戏练习侧面射击没有出现飞船和子弹
最近在看《python編程:從入門到實踐》這本書學習python。在項目外星人入侵的射擊練習——側面射擊這里遇到了問題。
側面射擊 :編寫一個游戲,將一艘飛船放在屏幕左邊,并允許玩家上下移動飛船。在玩家按空格鍵時,讓飛船發射一顆在屏幕中向右穿行的子彈,并在子彈離開 屏幕而消失后將其刪除。
我在編寫代碼時想要試一試其他效果,所以設定飛船為可以上下左右移動,子彈是一個png格式的圖片而非python內生成的矩形。
我把飛船圖片替換為圖一,命名為eye 后面的飛船概念命名都為eye
我把子彈圖片設置為圖二,命名為fire,后面的子彈概念命名都為fire
設置模塊
settings.py#儲存相關設置的模塊 class Settings: def __init__(self): #設置屏幕參數 self.screen_width = 1400 self.screen_height = 750 self.bg_color = (200,200,200) #設置眼的參數 self.eye_speed_factor = 1.5 #設置關于火的參數 self.fire_speed_factor = 2.5 #此游戲不限制子彈數量
fire.py
#導入精靈類 import pygame from pygame.sprite import Sprite class Fire(Sprite):'''一個對發射的子彈進行管理的類'''def __init__(self,settings,screen,eye):#通過super來繼承spritesuper().__init__()self.screen = screen#利用load返回火球貼圖并矩形化處理self.image = pygame.image.load('image/fire.png')self.rect = self.image.get_rect()#根據眼的位置來確定眼的位置#由于這個游戲的移動程度大,所以根據眼當時所在位置來確定self.rect.x = eye.rect.xself.rect.y = eye.rect.y#浮點化儲存火的位置'''由于火是從右到左直線移動,y軸坐標由發射時的眼決定,所以這里只需儲存x軸的位置'''self.x = float(self.rect.x)#儲存火移動速度self.speed_factor = settings.fire_speed_factordef update(self):#讓火球向左移動self.x -= self.speed_factor#更新火rect的位置self.rect.x = self.xdef blitme(self):#利用位塊傳輸繪制火球self.screen.blit(self.image,self.rect)functions.py
#將管理事件的代碼放在這個模塊,以簡化主程序 import sys import pygame from fire import Fire def fire(settings,screen,eye,fires):#創建一個新火,將新火添加到編組中去new_fire = Fire(settings,screen,eye)fires.add(new_fire) def check_keydown_events(event,settings,screen,eye,fires):#檢查按鍵情況if event.key == pygame.K_RIGHT:eye.moving_right = Trueelif event.key == pygame.K_LEFT:eye.moving_left = Trueelif event.key == pygame.K_DOWN:eye.moving_down = Trueelif event.key == pygame.K_UP:eye.moving_up = True#當按鍵為空格時調用前面定義的管理火的函數elif event.key == pygame.K_SPACE:fire(settings,screen,eye,fires) def check_keyup_events(event,eye):#檢查松開情況if event.key == pygame.K_RIGHT:eye.moving_right = Falseelif event.key == pygame.K_LEFT:eye.moving_left = Falseelif event.key == pygame.K_DOWN:eye.moving_down = Falseelif event.key == pygame.K_UP:eye.moving_up = False'''由于玩家松開空格鍵也沒有實際影響,這里不必檢查空格松開''' def check_events(settings,screen,eye,fires):#循環檢測事件類型for event in pygame.event.get():#當按鍵時調用檢查按鍵函數if event.type == pygame.K_DOWN:check_keydown_events(event,settings,screen,eye,fires)#當松開時調用檢查松開函數elif event.type == pygame.K_UP:check_keyup_events(event,eye)#檢測到退出條件時退出elif event.type == pygame.QUIT:sys.exit() def update_fire(fires):#對編組中每一個火調用update進行更新fires.update()#刪除已消失的火球#為防止漏掉需要刪掉的精靈,此處遍歷的是編組的副本,能有效刪除已消失的火球for fire in fires.copy():if fire.rect.left <= 0:fires.remove(fire) def update_screen(settings,screen,fires,eye):#填充屏幕顏色screen.fill(settings.bg_color)#對編組中每一個火使用blitme(),繪制所有火#這里對編組使用了方法sprites,它返回編組里的每一個精靈for fire in fires.sprites():fire.blitme()#繪制眼eye.blitme()#讓最近繪制的屏幕可見pygame.display.flip()主程序
side_shoot.py
屏幕填充顏色是在繪制眼和火之前啊,為什么還是沒有顯示呢
看了幾遍還是沒有找到問題求大神解惑,指點迷津。
總結
以上是生活随笔為你收集整理的python游戏练习侧面射击没有出现飞船和子弹的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 修复SQLServer2005/2008
- 下一篇: Photoshop教程(二):首选项的基