基于pygame的射击小游戏制作(二)射击子弹
在本篇文章中,將學習如何創建子彈移動的元素,如何在屏幕中讓子彈向上飛馳,如何刪除超過屏幕邊界的子彈。
1.編程思路
1.1 創建一個子彈
功能描述:玩家將按空格鍵時發射子彈,子彈在屏幕中向上穿行,抵達屏幕邊緣后消失。
在settings.py文件中,的init方法中加入子彈(Bullet)的值:速度,寬度、高度、顏色、允許發射的最大子彈數量
在project中新建一個bullet.py ,用來存儲Bullet類。該類主要用于在游戲中同時操作編組中的所有元素,為創建子彈實例,傳遞參數,并調用了super()來繼承Sprite。
用小矩形框來代替子彈,使用pygame.Rect(),從空白創建一個寬為3,高為15像素的矩形,子彈的初始位置取決于飛船的當前位置,并應從飛船頂部射出,將子彈的top屬性設置為飛船的top屬性,讓子彈看起來像是從飛船中射擊的。將子彈的y坐標設為小數,并把子彈的顏色和速度設置分別存儲在self.color和self.speed_factor中。
1.2 將子彈發射出來
接下來我們要讓子彈更新在屏幕中,方法update()管理子彈的位置。發射出去后,子彈在屏幕中向上移動,這意味著y坐標將不斷減小,因此為更新子彈的位置,我們從self.y中減去self.speed_factor的值。子彈發射后,其x坐標始終不變,因此子彈將沿直線垂直地往上穿行。
調用draw_bullet()來繪制子彈。self.color中的顏色填充表示子彈占據的屏幕部分。
1.3 將子彈添加進彈膛
在玩家每次按空格鍵時都射出一發子彈。首先,我們將在alien_invasion.py中創建一個編組(group),用于存儲所有有效的子彈,以便能夠管理發射出去的所有子彈。在主循環中,我們將使用這個編組在屏幕上繪制子彈,以及更新每顆子彈的位置:
"""游戲主循環"""while True:"""監視鍵鼠事件"""gf.check_events(ai_settings, screen, ship, bullets)ship.update()#print(len(bullets))gf.update_bullets(bullets)gf.update_screen(ai_settings, screen, ship, bullets)1.4 開火
在game_functions.py中,我們需要修改check_keydown_events(),以便在玩家按空格鍵時發射一顆子彈。還要把超出屏幕的子彈刪除,控制子彈的發射數量
def fire_bullet(ai_settings, screen, ship, bullets):"""如果還沒有達到限制,就發射一顆子彈"""# 創建一顆子彈,并將其加入到編組bulletsif len(bullets) < ai_settings.bullets_allowed:new_bullet = Bullet(ai_settings, screen, ship)bullets.add(new_bullet) def update_bullets(bullets):"""更新子彈的位置,刪除已消失的子彈"""#更新子彈位置bullets.update()# 刪除已經消失的子彈for bullet in bullets.copy():if bullet.rect.bottom <= 0:bullets.remove(bullet) def check_keydown_events(event, ai_settings, screen, ship, bullets):"""響應按鍵"""if event.key == pygame.K_RIGHT:# 向右移動飛船ship.moving_right = Trueelif event.key == pygame.K_LEFT:ship.moving_left = Trueelif event.key == pygame.K_SPACE:fire_bullet(ai_settings, screen, ship, bullets)在check_keydown_events()中,檢測到空格鍵按下時,就會發射出一顆子彈,并且子彈的數量不能超過3顆。
3.源代碼
alien_invasion.py
import sys #退出游戲 import pygame #包含開發所需功能 from settings import Settings from ship import Ship import game_functions as gf from pygame.sprite import Group def run_game():# 初始化背景設置pygame.init()ai_settings = Settings()# 創建游戲窗口screen = pygame.display.set_mode((ai_settings.screen_width, ai_settings.screen_height))pygame.display.set_caption("Alien Invasion")"""創建一艘飛船"""ship = Ship(ai_settings, screen)"""創建一個用于存儲子彈的編組"""bullets = Group()"""設置背景色"""bg_color = (230,230,230)"""游戲主循環"""while True:"""監視鍵鼠事件"""gf.check_events(ai_settings, screen, ship, bullets)ship.update()#print(len(bullets))gf.update_bullets(bullets)gf.update_screen(ai_settings, screen, ship, bullets)run_game()game_functions.py
import sys import pygame from bullet import Bullet def check_events(ai_settings, screen, ship, bullets):#鍵鼠響應for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()elif event.type == pygame.KEYDOWN:check_keydown_events(event, ai_settings, screen, ship, bullets)elif event.type == pygame.KEYUP:check_keyup_events(event, ship) def check_keydown_events(event, ai_settings, screen, ship, bullets):"""響應按鍵"""if event.key == pygame.K_RIGHT:# 向右移動飛船ship.moving_right = Trueelif event.key == pygame.K_LEFT:ship.moving_left = Trueelif event.key == pygame.K_SPACE:fire_bullet(ai_settings, screen, ship, bullets)def check_keyup_events(event, ship):if event.key == pygame.K_RIGHT:ship.moving_right = Falseelif event.key == pygame.K_LEFT:ship.moving_left = Falsedef update_screen(ai_settings, screen, ship, bullets):#更新屏幕圖像# 每次循環時都重繪屏幕screen.fill(ai_settings.bg_color)#在飛船和外星人后面重繪所有子彈for bullets in bullets.sprites():bullets.draw_bullet()ship.blitme()# 讓最近繪制的屏幕可見pygame.display.flip() # 不斷更新屏幕def update_bullets(bullets):"""更新子彈的位置,刪除已消失的子彈"""#更新子彈位置bullets.update()# 刪除已經消失的子彈for bullet in bullets.copy():if bullet.rect.bottom <= 0:bullets.remove(bullet)def fire_bullet(ai_settings, screen, ship, bullets):"""如果還沒有達到限制,就發射一顆子彈"""# 創建一顆子彈,并將其加入到編組bulletsif len(bullets) < ai_settings.bullets_allowed:new_bullet = Bullet(ai_settings, screen, ship)bullets.add(new_bullet)bullet.py
import pygame from pygame.sprite import Spriteclass Bullet(Sprite):"""一個對飛船發射的子彈進行管理的類"""def __init__(self, ai_settings,screen, ship):"""在飛船所處的位置創建一個子彈對象"""super(Bullet, self).__init__()self.screen = screen#在(0,0)處創建一個表示子彈的矩形,再設置正確的位置self.rect = pygame.Rect(0, 0, ai_settings.bullet_width,ai_settings.bullet_height)self.rect.centerx = ship.rect.centerxself.rect.top = ship.rect.top#儲存用小數表示子彈的位置self.y = float(self.rect.y)self.color = ai_settings.bullet_colorself.speed_factor = ai_settings.bullet_speed_factordef update(self):"""向上移動子彈"""#更新表示子彈位置的小數值self.y -= self.speed_factor#更新表示子彈的rect的位置self.rect.y = self.ydef draw_bullet(self):"""在屏幕上繪制子彈"""pygame.draw.rect(self.screen, self.color, self.rect)settings.py
class Settings():#用于存儲該項目設置的所有的類def __init__(self):#初始化設置#屏幕設置self.screen_width = 1200self.screen_height = 800self.bg_color = (230,230,230)#飛船設置self.ship_speed_factor = 1.5#子彈設置self.bullet_speed_factor = 1self.bullet_width = 3self.bullet_height = 15self.bullet_color = (60,60,60)self.bullets_allowed = 34.實現效果
總結
以上是生活随笔為你收集整理的基于pygame的射击小游戏制作(二)射击子弹的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Java深入理解】String str
- 下一篇: JAVA分布式篇1——Linux