pygame製作飛機大戰3 邊緣檢測 發射子彈

2021-10-09 09:42:05 字數 4199 閱讀 5090

飛機可以自由移動後就需要做邊緣檢測,避免移動到彈窗之外的座標,pygame的原點座標在左上角,而我的視窗大小是(450,550),所以只需要當檢測到當飛機要飛出這四個座標範圍(0, y)、(x, 0)、(450,y)、(x,550)時將對應的座標變為邊緣對應的值即可,定義函式為judge,**如下:

def judge(potx, poty):

if potx >= 426:

potx = 426

elif potx <= -24:

potx = -24

elif poty >= 526:

poty = 526

elif poty <= -24:

poty = -24

return potx, poty

之所以調整到了426、526以及-24是因為在視覺上這個時候飛機中心剛好處於介面邊緣,比較符合實際在遊戲中的樣子(當然,有的遊戲飛機不能以半身存在,這一點根據喜好調整即可)

對子彈發射的步驟進行拆分可以知道,每過一段時間飛機會生成一顆子彈,隨後子彈向正上方移動,直到畫面邊緣,所以在這裡需要完成三個小步:

(1)為子彈發射準備時間間隔;

(2)設定子彈每一次向上移動的步數,保證從飛機上發射能達到彈窗頂端;

(3)將第二步的子彈畫到介面中。

if i == 0:

button_x1 = x1 + 3

button_y1 = y1 + 60

elif i == 90:

i = -10

i += 10

button_y1 -= 65

x1+3和y1+60是為了調整子彈發射的位置,保證是從飛機機翼上的發射口上發出,i==90和i+=10是為了通過從0自增9次,9***重新整理時間 = 不同兩顆子彈發射的時間間隔,而button_y1 -= 65則是子彈每一次向上移動的步數,步數值越大,子彈的速度越快。飛機有兩個發射口,因此設定了另乙個子彈(當然,x1 + 27是將初始位置設定到了另乙個發射口上):

if j == 0:

button_x2 = x1 + 27

button_y2 = y1 + 60

elif j == 90:

j = -10

j += 10

button_y2 -= 65

子彈都是直接向上移動,而多數飛機大戰的子彈數量、方向都可以根據不同的道具捕獲來變化,這一點在後面會做設計,感興趣也可以直接調整試試,比如單次不同位置射出8顆,單次同乙個位置先後射出兩顆,看看有什麼不同的效果,本次的完整**如下(ps:部分功能實現可能不會使用到太多的函式呼叫,目的是先跑起來,後續會繼續優化):

#引數初始化

background_image_filename = 'background.png'

mouse_image_filename = 'airplane.png'

button_image_filename = 'button1.png'

#匯入函式

import pygame

from pygame.locals import *

from sys import exit

#載入並轉換影象

background = pygame.image.load(background_image_filename)

mouse_cursor = pygame.image.load(mouse_image_filename)

button_picture1 = pygame.image.load(button_image_filename)

button_picture2 = pygame.image.load(button_image_filename)

#建立視窗及標題

screen = pygame.display.set_mode((450, 550), 0, 32)

pygame.display.set_caption("hello world")

#初始化pygame,為硬體使用作準備

pygame.init()

x1 = 225

y1 = 275

#子彈座標初始化

button_x1 = 0

button_y1 = 0

button_x2 = 0

button_y2 = 0

v = 4

i = 0

j = 0

# 檢測邊緣

def judge(potx, poty):

if potx >= 426:

potx = 426

elif potx <= -24:

potx = -24

elif poty >= 526:

poty = 526

elif poty <= -24:

poty = -24

return potx, poty

#遊戲主迴圈

while true:

# 檢測退出事件,判斷是否執行退出

for event in pygame.event.get():

if event.type == quit:

exit()

#將背景畫上去

screen.blit(background, (0, 0))

#獲取按鍵狀態並完成移動

press = pygame.key.get_pressed()

if press[k_left] == true:

if press[k_up] == true:

x1 = x1 - v

y1 = y1 - v

elif press[k_down] == true:

x1 = x1 - v

y1 = y1 + v

else:

x1 = x1 - v

elif press[k_right] == true:

if press[k_up] == true:

x1 = x1 + v

y1 = y1 - v

elif press[k_down] == true:

x1 = x1 + v

y1 = y1 + v

else:

x1 = x1 + v

elif press[k_up] == true:

y1 = y1 - v

elif press[k_down] == true:

y1 = y1 + 4

# 獲取滑鼠位置

#x, y = pygame.mouse.get_pos()

#計算游標在左上角的位置

#x -= mouse_cursor.get_width() / 2

#y -= mouse_cursor.get_height() / 2

#子彈移動

#子彈1移動

if i == 0:

button_x1 = x1 + 3

button_y1 = y1 + 60

elif i == 90:

i = -10

i += 10

button_y1 -= 65

#子彈2移動

if j == 0:

button_x2 = x1 + 27

button_y2 = y1 + 60

elif j == 90:

j = -10

j += 10

button_y2 -= 65

#判斷邊緣

x1, y1 = judge(potx = x1, poty = y1)

#隨機出現敵人

pass

#子彈擊中

pass

#顯示分數

pass

#將游標畫上去

screen.blit(mouse_cursor, (x1, y1))

screen.blit(button_picture1, (button_x1, button_y1))

screen.blit(button_picture2, (button_x2, button_y2))

# 在新的位置上畫圖

pygame.display.update()

pygame飛機大戰3

self.destroy images.extend pygame.image.load images enemy1 down1.png convert alpha pygame.image.load images enemy1 down2.png convert alpha pygame.imag...

pygame飛機大戰開發實錄3

通過之前的講解,了解了一些相關原理和基本的控制方法。接下來就可以開始編寫 飛機大戰 了。開始之前,先說一說,為什麼要以物件化程式設計,之前的例子裡的指令碼,都是以過程化編寫,而實際開發則以物件化為主。這裡把飛機移動的指令碼,按物件化重新編寫,右邊是原來的指令碼。乍一看,物件化好像要複雜一些。進一步觀...

pygame飛機大戰4

pygame.mask.from su ce self,image 對的非透明部分做標記 pygame.sprite.spritecollide b,enemies,false,pygame.sprite.collide mask 完美檢測碰撞 me.rect.midtop,子彈生成在飛機的中間的頂...