日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python游戏练习侧面射击没有出现飞船和子弹

發布時間:2024/1/18 python 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 #此游戲不限制子彈數量

eye.py#創建一個關于眼的模塊 import pygame class Eye:def __init__(self,settings,screen):#初始化眼self.setting = settingsself.screen = screen#返回飛船貼圖路徑self.image = pygame.image.load("image/eye.png")#矩形化屏幕和眼貼圖self.screen_rect = self.screen.get_rect()self.rect = self.image.get_rect()#以屏幕為參照設置眼的初始位置(屏幕右邊界中央)self.rect.right = self.screen_rect.rightself.rect.centery = self.screen_rect.centery#用屬性x和y來儲存浮點化后的坐標self.x = float(self.rect.right)self.y = float(self.rect.centery)#設置眼上下左右移動的標志self.moving_right = Falseself.moving_left = Falseself.moving_down = Falseself.moving_up = False#創建一個函數用于傳輸圖像def blitme(self):self.screen.blit(self.image,self.rect)#創建一個根據標志來移動眼的函數def update(self):if self.moving_right and self.rect.right < self.screen_rect.right :self.x += self.setting.eye_speed_factorif self.moving_left and self.rect.left > 0 :self.x -= self.setting.eye_speed_factorif self.moving_down and self.rect.bottom < self.screen_rect.bottom :self.y += self.setting.eye_speed_factorif self.moving_up and self.rect.top > 0 :self.y -= self.setting.eye_speed_factor#根據x和y的值來更新rectself.rect.x = self.xself.rect.y = self.y

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

#側面射擊 :編寫一個游戲,將一艘飛船放在屏幕右邊,并允許玩家上下左右移動飛船。 # 在玩家按空格鍵時,讓飛船發射一顆在屏幕中向左穿行的子彈,并在子彈離開屏幕而消失后將其刪除。 import pygame from settings import Settings from eye import Eye import functions as f #導入編組 from pygame.sprite import Group def run_game():#初始化游戲pygame.init()settings = Settings()#設置屏幕#這里是括號中引用一個元組,所以是括中括screen = pygame.display.set_mode((settings.screen_width,settings.screen_height))#設置游戲標題pygame.display.set_caption('side_shoot')#創建一個眼實例eye = Eye(settings,screen)#創建一個火編組fires = Group()#開始游戲主循環while True:#調用模塊functions的check_events對事件進行檢查f.check_events(settings,screen,eye,fires)#根據事件來改變眼的位置eye.update()#更新和刪除火f.update_fire(fires)#繪制屏幕、眼和火f.update_screen(settings,screen,fires,eye) #運行游戲 run_game()


屏幕填充顏色是在繪制眼和火之前啊,為什么還是沒有顯示呢

看了幾遍還是沒有找到問題求大神解惑,指點迷津。

總結

以上是生活随笔為你收集整理的python游戏练习侧面射击没有出现飞船和子弹的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。