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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于pygame的射击小游戏制作(二)射击子弹

發(fā)布時間:2025/3/12 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于pygame的射击小游戏制作(二)射击子弹 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在本篇文章中,將學(xué)習(xí)如何創(chuàng)建子彈移動的元素,如何在屏幕中讓子彈向上飛馳,如何刪除超過屏幕邊界的子彈。

1.編程思路

1.1 創(chuàng)建一個子彈

功能描述:玩家將按空格鍵時發(fā)射子彈,子彈在屏幕中向上穿行,抵達屏幕邊緣后消失。
在settings.py文件中,的init方法中加入子彈(Bullet)的值:速度,寬度、高度、顏色、允許發(fā)射的最大子彈數(shù)量

#子彈設(shè)置self.bullet_speed_factor = 1self.bullet_width = 3self.bullet_height = 15self.bullet_color = (60,60,60)self.bullets_allowed = 3

在project中新建一個bullet.py ,用來存儲Bullet類。該類主要用于在游戲中同時操作編組中的所有元素,為創(chuàng)建子彈實例,傳遞參數(shù),并調(diào)用了super()來繼承Sprite。
用小矩形框來代替子彈,使用pygame.Rect(),從空白創(chuàng)建一個寬為3,高為15像素的矩形,子彈的初始位置取決于飛船的當(dāng)前位置,并應(yīng)從飛船頂部射出,將子彈的top屬性設(shè)置為飛船的top屬性,讓子彈看起來像是從飛船中射擊的。將子彈的y坐標(biāo)設(shè)為小數(shù),并把子彈的顏色和速度設(shè)置分別存儲在self.color和self.speed_factor中。

import pygame from pygame.sprite import Spriteclass Bullet(Sprite):"""一個對飛船發(fā)射的子彈進行管理的類"""def __init__(self, ai_settings,screen, ship):"""在飛船所處的位置創(chuàng)建一個子彈對象"""super(Bullet, self).__init__()self.screen = screen#在(0,0)處創(chuàng)建一個表示子彈的矩形,再設(shè)置正確的位置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#儲存用小數(shù)表示子彈的位置self.y = float(self.rect.y)self.color = ai_settings.bullet_colorself.speed_factor = ai_settings.bullet_speed_factor

1.2 將子彈發(fā)射出來

接下來我們要讓子彈更新在屏幕中,方法update()管理子彈的位置。發(fā)射出去后,子彈在屏幕中向上移動,這意味著y坐標(biāo)將不斷減小,因此為更新子彈的位置,我們從self.y中減去self.speed_factor的值。子彈發(fā)射后,其x坐標(biāo)始終不變,因此子彈將沿直線垂直地往上穿行。
調(diào)用draw_bullet()來繪制子彈。self.color中的顏色填充表示子彈占據(jù)的屏幕部分。

def update(self):"""向上移動子彈"""#更新表示子彈位置的小數(shù)值self.y -= self.speed_factor#更新表示子彈的rect的位置self.rect.y = self.ydef draw_bullet(self):"""在屏幕上繪制子彈"""pygame.draw.rect(self.screen, self.color, self.rect)

1.3 將子彈添加進彈膛

在玩家每次按空格鍵時都射出一發(fā)子彈。首先,我們將在alien_invasion.py中創(chuàng)建一個編組(group),用于存儲所有有效的子彈,以便能夠管理發(fā)射出去的所有子彈。在主循環(huán)中,我們將使用這個編組在屏幕上繪制子彈,以及更新每顆子彈的位置:

"""游戲主循環(huán)"""while True:"""監(jiān)視鍵鼠事件"""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(),以便在玩家按空格鍵時發(fā)射一顆子彈。還要把超出屏幕的子彈刪除,控制子彈的發(fā)射數(shù)量

def fire_bullet(ai_settings, screen, ship, bullets):"""如果還沒有達到限制,就發(fā)射一顆子彈"""# 創(chuàng)建一顆子彈,并將其加入到編組bulletsif len(bullets) < ai_settings.bullets_allowed:new_bullet = Bullet(ai_settings, screen, ship)bullets.add(new_bullet) def update_bullets(bullets):"""更新子彈的位置,刪除已消失的子彈"""#更新子彈位置bullets.update()# 刪除已經(jīng)消失的子彈for bullet in bullets.copy():if bullet.rect.bottom <= 0:bullets.remove(bullet) def check_keydown_events(event, ai_settings, screen, ship, bullets):"""響應(yīng)按鍵"""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()中,檢測到空格鍵按下時,就會發(fā)射出一顆子彈,并且子彈的數(shù)量不能超過3顆。

3.源代碼

alien_invasion.py

import sys #退出游戲 import pygame #包含開發(fā)所需功能 from settings import Settings from ship import Ship import game_functions as gf from pygame.sprite import Group def run_game():# 初始化背景設(shè)置pygame.init()ai_settings = Settings()# 創(chuàng)建游戲窗口screen = pygame.display.set_mode((ai_settings.screen_width, ai_settings.screen_height))pygame.display.set_caption("Alien Invasion")"""創(chuàng)建一艘飛船"""ship = Ship(ai_settings, screen)"""創(chuàng)建一個用于存儲子彈的編組"""bullets = Group()"""設(shè)置背景色"""bg_color = (230,230,230)"""游戲主循環(huán)"""while True:"""監(jiān)視鍵鼠事件"""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):#鍵鼠響應(yīng)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):"""響應(yīng)按鍵"""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):#更新屏幕圖像# 每次循環(huán)時都重繪屏幕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()# 刪除已經(jīng)消失的子彈for bullet in bullets.copy():if bullet.rect.bottom <= 0:bullets.remove(bullet)def fire_bullet(ai_settings, screen, ship, bullets):"""如果還沒有達到限制,就發(fā)射一顆子彈"""# 創(chuàng)建一顆子彈,并將其加入到編組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):"""一個對飛船發(fā)射的子彈進行管理的類"""def __init__(self, ai_settings,screen, ship):"""在飛船所處的位置創(chuàng)建一個子彈對象"""super(Bullet, self).__init__()self.screen = screen#在(0,0)處創(chuàng)建一個表示子彈的矩形,再設(shè)置正確的位置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#儲存用小數(shù)表示子彈的位置self.y = float(self.rect.y)self.color = ai_settings.bullet_colorself.speed_factor = ai_settings.bullet_speed_factordef update(self):"""向上移動子彈"""#更新表示子彈位置的小數(shù)值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():#用于存儲該項目設(shè)置的所有的類def __init__(self):#初始化設(shè)置#屏幕設(shè)置self.screen_width = 1200self.screen_height = 800self.bg_color = (230,230,230)#飛船設(shè)置self.ship_speed_factor = 1.5#子彈設(shè)置self.bullet_speed_factor = 1self.bullet_width = 3self.bullet_height = 15self.bullet_color = (60,60,60)self.bullets_allowed = 3

4.實現(xiàn)效果

總結(jié)

以上是生活随笔為你收集整理的基于pygame的射击小游戏制作(二)射击子弹的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。