近來想用pygame做做游戲,在 xishui 大神的目光博客中學了學這東西,就上一段自己寫的飛機大戰的代碼,主要是對鍵盤控制飛機的移動做了相關的優化 在這裡,飛機的偏移量之所以設置四個而不是兩個,是因為如果設置的是兩個,即控制x和y軸,那麼飛機控制的方向只能是x軸或y軸, 就比如說,當按住a鍵的時 ...
近來想用pygame做做游戲,在
# -*- coding: utf-8 -*- import pygame from pygame.locals import * import sys import time pygame.init() screen_width = 640 screen_height = 480 # 設置游戲視窗的大小 screen = pygame.display.set_mode((screen_width,screen_height), 0, 32) pygame.display.set_caption('飛機大戰') image = 'feiji.png' mv_image = pygame.image.load(image) # 獲取飛機的長度 mv_image_width = mv_image.get_width() # 獲取飛機的寬度 mv_image_height = mv_image.get_height() # 飛機的起始位置,應該在下麵的正中間 x, y = screen_width/2-mv_image_width/2, screen_height-mv_image_height
# 標記1
# 飛機的移動偏移量,每個方向設置一個 move_a, move_d, move_w, move_s = 0, 0, 0, 0 while True: for event in pygame.event.get(): if event.type == QUIT: sys.exit() elif event.type == KEYDOWN: if event.key == K_a or event.key == K_LEFT: move_a = 1 elif event.key == K_d or event.key == K_RIGHT: move_d = 1 elif event.key == K_UP or event.key == K_w: move_w = 1 elif event.key == K_DOWN or event.key == K_s: move_s = 1 elif event.type == KEYUP: # 某一個方向的鍵盤被鬆開,這個方向的偏移量賦為0 if event.key == K_a or event.key == K_LEFT: move_a = 0 elif event.key == K_d or event.key == K_RIGHT: move_d = 0 elif event.key == K_UP or event.key == K_w: move_w = 0 elif event.key == K_DOWN or event.key == K_s: move_s = 0 # 按下鍵盤時,飛機對應的移動偏移量會變成1,飛機的位置進行相應的加減操作,刷新顯示來控制飛機的移動 # 如果一直按住鍵盤不動,飛機對應的移動偏移量就會一直為1,飛機的位置就會隨著while的不斷迴圈而改變 # 飛機移動後的位置 x = x + move_d - move_a y = y + move_s - move_w
# 標記2
# 控制飛機的範圍,不能超出屏幕,還要考慮到子彈應該能夠發射到任意一個地方 # 左右邊界飛機應該可以進入一半 if x > screen_width-mv_image_width/2: x = screen_width-mv_image_width/2 elif x < 0-mv_image_width/2: x = 0-mv_image_width/2 # 下邊界的話能夠看到飛機頭部就行 if y > screen_height-mv_image_height/5: y = screen_height-mv_image_height/5 # 上邊界不允許飛機進入 elif y < 0: y = 0 # 填充背景顏色以RGB形式 screen.fill((255, 255, 255)) # 在新的位置上畫圖 screen.blit(mv_image, (x, y)) pygame.display.update() # 減少CPU負擔,測試後感覺這個數值最恰當 time.sleep(0.001)
在這裡,飛機的偏移量之所以設置四個而不是兩個,是因為如果設置的是兩個,即控制x和y軸,那麼飛機控制的方向只能是x軸或y軸,
就比如說,當按住a鍵的時候,飛機往左移動,此時不鬆開a鍵而繼續按住d鍵,飛機就會停止往左移動轉而向右移動,這裡明顯是不對的,我們目標應該是同時按住a鍵和d鍵時飛機停止移動,
緊接著,鬆開d鍵,此時飛機卻不動了,但我們的a鍵此時還按著呢,他不是應該向左邊移動嗎?
所以用四個偏移量控制飛機的移動,各個方向互不影響,才能讓飛機順利的移動。
下麵是飛機用兩個偏移量時的代碼
# 標記1
move_x, move_y = 0, 0
while True: for event in pygame.event.get(): if event.type == QUIT: exit() if event.type == KEYDOWN: if event.key == K_a or event.key == K_LEFT: move_x = -1 elif event.key == K_d or event.key == K_RIGHT: move_x = 1 elif event.key == K_UP or event.key == K_w: move_y = -1 elif event.key == K_DOWN or event.key == K_s: move_y = 1 elif event.type == KEYUP: # 如果用戶放開了鍵盤,圖就不要動了 move_x = 0 move_y = 0 # 計算出新的坐標 x += move_x y += move_y
# 標記2
需要的圖片feiji.png,純手工繪,不好看莫怪
如果還想做一個更酷的效果(其實也不怎麼酷啦),比如游戲開始時飛機不是直接出現在屏幕上,而是緩緩的從下方移動到開始位置。
代碼如下:
# 使游戲開始時飛機緩緩到達戰場 y1 = screen_height while True: if y1 <= y: break screen.fill((255, 255, 255)) screen.blit(mv_image, (x, y1)) pygame.display.update() y1 -= 1 # 每0.01秒前進一步 time.sleep(0.01)
這段代碼插入到#標記1的前面