飛機可以自由移動後就需要做邊緣檢測,避免移動到彈窗之外的座標,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,子彈生成在飛機的中間的頂...