程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python實踐——利用pygame創建一個游戲界面(三)

編輯:Python

前面留下的兩個問題,因為游戲界面設置的比較小的原因,火箭在移動時就會顯得比較快,一下就移出了界面,下面需要改進的就是火箭的速度與屏幕邊緣的設置,火箭到了屏幕邊緣就不再移動。
火箭的設置需要在settings類裡添加,這裡添加一個火箭速度的屬性:

self.ship_speed = 0.5

定義一個可以存儲浮點型數據得新屬性,用於存儲位置信息並根據速度變換位置信息,最終再將位置信息傳遞給更新控制飛船的位置屬性。(傳遞回去的時候因為數據類型的不同,會自動去除小數部分,但問題不大,這裡不用細究)

#在飛船屬性center中存儲小數值,傳遞位置信息
self.centerx = float(self.image_rect.centerx)
self.centery = float(self.image_rect.centery)

不讓火箭移到屏幕外面,只需要通過監視飛船外接矩形邊緣的坐標,讓它不能觸及屏幕邊緣坐標,通過if判斷語句來檢測,不僅要檢測到鍵盤事件,還要判斷火箭位置與屏幕邊緣是否有接觸,二者同時滿足才進行移動指令,通過self.centerx,self.centery來進行位置的變換,最後再將值傳遞回去,更新位置的值。

 def update(self):
'''根據移動標志響應飛船的位置'''
if self.moving_right and self.image_rect.right < self.screen_rect.right:
self.centerx += self.mg_settings.ship_speed
if self.moving_left and self.image_rect.left > 0:
self.centerx -= self.mg_settings.ship_speed
if self.moving_up and self.image_rect.top >0:
self.centery -= self.mg_settings.ship_speed
if self.moving_down and self.image_rect.bottom < self.screen_rect.bottom:
self.centery += self.mg_settings.ship_speed
#根據self.center更新rect對象
self.image_rect.centerx = self.centerx
self.image_rect.centery = self.centery

(屏幕左上角的坐標值(0,0))

進行子彈的設置

我們可以通過設置子彈類,使我們按下特定的鍵值時,火箭可以發射子彈。
子彈可以直接利用pygame.Rect()或者是pygame包中其他方法進行生成,但是需要創建特定的圖像時,可以通過自己導入圖片作為子彈進行射擊,這樣看上去更舒服。大概方法與導入火箭大概相同,但是位置是放在了火箭的頂部中心:

 self.image_bullet_rect.centerx = ship.image_rect.centerx
self.image_bullet_rect.top = ship.image_rect.top

創建一個bullet類單獨存儲子彈的設置。話不多說,看代碼!
bullet.py

import pygame
from pygame.sprite import Sprite
class Bullet(Sprite):
'''創建一個對飛船進行管理的類'''
def __init__(self, mg_settings, screen, ship):
'''在飛船所處位置創建一個子彈對象'''
super(Bullet, self).__init__()
self.screen = screen
# 加載導彈圖像並獲取外接矩形
self.image_bullet = pygame.image.load("C:\python項目文件\練習002\image\導彈.bmp")
self.image_bullet_rect = self.image_bullet.get_rect()
self.image_bullet_rect.centerx = ship.image_rect.centerx
self.image_bullet_rect.top = ship.image_rect.top
#存儲用小數表示子彈的位置
self.y = float(self.image_bullet_rect.y)
self.bullet_speed = mg_settings.bullet_speed
def update(self):
'''向上移動子彈'''
#更新表示子彈移動位置的小數值
self.y -= self.bullet_speed
#更新表示子彈rect的位置
self.image_bullet_rect.y = self.y
def draw_bullet(self):
'''在屏幕上繪制子彈'''
self.screen.blit(self.image_bullet, self.image_bullet_rect)

其他模塊也基本上沒有什麼變動,變動了的相關代碼如下:
main_game.py

 #創建一艘飛船
ship = Ship(mg_settings, screen)
#創建一個用於存儲子彈的編組
bullets = Group()
#開始游戲主循環
while True:
gf.check_enents(mg_settings, screen, ship, bullets)#檢測鍵盤事件
ship.update()#檢測到鍵盤事件後更新屏幕
bullets.update()
gf.update_screen(mg_settings, screen, ship, bullets)
run_game()

game_func.py

def check_enents(mg_settings, screen, ship, bullets):
'''響應按鍵和鼠標事件'''
......
elif event.key == pygame.K_SPACE:
#創建一顆子彈,並將其加入到編組bullets中
new_bullet = Bullet(mg_settings, screen, ship)
bullets.add(new_bullet)
......
def update_screen(mg_settings, screen, ship, bullets):
'''更新屏幕上的圖像,並切換到新屏幕'''
# 每次循環時都重繪屏幕
screen.fill(mg_settings.screen_color)
#在外星人和飛船後面重繪所有子彈
for bullet in bullets.sprites():
bullet.draw_bullet()
ship.blitme()
# 讓最近繪制的屏幕可見
pygame.display.flip()

settings.py

#單獨創建一個類存儲游戲所需的界面設置
class Settings():
def __init__(self):
self.screen_w = 400
self.screen_h = 300
self.screen_color = 255,255,255
self.ship_speed = 0.3
#子彈速度設置
self.bullet_speed = 0.1

通過以上的更改,火箭可以上下左右移動且不會移出屏幕,按下空格鍵能發射子彈。
效果圖如下:

後面陸續更新游戲界面的各種效果,增加游戲功能,比如,,,
問我何所有,山中惟白雲。只堪自怡悅,不堪持贈君:部分道理於我有益,未必普適。部分觀點能力所限,難免偏頗主觀。部分行文斬釘截鐵,不代表堅信其唯一正確性,只是不願面面俱到和模稜兩可而已。有錯誤和意見歡迎指正哈!
獨樂樂,不如眾樂樂:寫是樂,評是樂,看是樂,樂最重要。


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved