一、游戲代碼結(jié)構(gòu)
代碼結(jié)構(gòu)是代碼的組織方式,也是游戲編程的思考框架。pygame官方文檔中給出了以下建議,將游戲代碼結(jié)構(gòu)分為以下六個(gè)部分。
1導(dǎo)入游戲模塊。
2資源處理類(lèi);定義一些類(lèi)來(lái)處理最基本的資源,包括加載圖像和聲音,連接和斷開(kāi)網(wǎng)絡(luò),加載保存的游戲。
3游戲?qū)ο箢?lèi);為你的游戲?qū)ο蠖x類(lèi)。例如游戲?qū)ο?、背景?duì)象、玩家對(duì)象、敵人對(duì)象、道具對(duì)象、文本對(duì)象等。
4其他游戲功能;定義其他必要的功能,如游戲面板、菜單處理等。
5初始化游戲,包括pygame對(duì)象本身,背景,游戲?qū)ο?初始化類(lèi)的實(shí)例)和任何其他你可能想要添加的小代碼。
6主循環(huán),你在其中放入任何輸入處理(即觀察用戶敲擊按鍵/鼠標(biāo)按鈕),用于更新游戲?qū)ο蟮拇a,最后用于更新屏幕。
基于以上結(jié)構(gòu),對(duì)上一篇最后的代碼,我們按照導(dǎo)入游戲模塊、定義全局變量、定義游戲?qū)ο蟆⒍x游戲主循環(huán)四個(gè)模塊了進(jìn)行優(yōu)化,其中定義游戲?qū)ο笥诌M(jìn)行了細(xì)分。
1.需要導(dǎo)入的游戲模塊
import pygame
import sys
2.定義全局常量
分別為screen的size,目標(biāo)區(qū)域的位置,目標(biāo)區(qū)域的size,文本顏色,目標(biāo)抵達(dá)狀態(tài)。
BG_SIZE = (400, 500) # 背景尺寸
ON_TARGET = False # 初始化目標(biāo)狀態(tài)
TARGET_SIZE = (50, 50) # 目標(biāo)區(qū)域大小
TARGET_POSITION = (300, 200) # 目標(biāo)位置
TEXT_COLOR = (255, 0, 0) # 文本顏色
3.定義游戲?qū)ο?/h4>
定義一個(gè)Game對(duì)象,并定義__init__、event_handler、start三個(gè)函數(shù),分別完成所有對(duì)象的初始化、事件的監(jiān)聽(tīng)與更新、游戲主循環(huán)。
下面詳細(xì)介紹:
__init__主要完成游戲的初始化。包括窗口初始化、背景初始化、目標(biāo)位置初始化、生成玩家實(shí)例、生成消息文本實(shí)例
代碼如下:
>定義Game對(duì)象
class Game(object):
# 游戲類(lèi)
def __init__(self):
# 1.游戲主窗口
self.screen = pygame.display.set_mode(BG_SIZE)
self.image = pygame.image.load('./image/plane/background.png')
self.rect = self.image.get_rect()
self.stop_position = pygame.image.load('./image/driver/grass.jpg')
self.stop_position = pygame.transform.scale(self.stop_position, TARGET_SIZE)
self.stop_position_rect = self.stop_position.get_rect()
self.stop_position_rect.topleft = TARGET_POSITION
self.hero = Car()
self.label = Label()
在Game對(duì)象中繼續(xù)定義event_handler函數(shù)。它的任務(wù)是使用pygame.event.get()方法監(jiān)聽(tīng)事件,判斷玩家是否點(diǎn)擊了窗口的退出按鈕,如果是則返回True。
def event_handler(self):
# 定義事件捕獲
for event in pygame.event.get():
if event.type == pygame.QUIT:
return True
return False
在Game對(duì)象中定義start函數(shù)。它的任務(wù)是定義游戲主循環(huán)。包括設(shè)置循環(huán)和屏幕刷新速率、根據(jù)用戶關(guān)閉窗口動(dòng)作退出主循環(huán)、判斷是否到達(dá)目標(biāo)、捕獲鍵盤(pán)動(dòng)作、返回移動(dòng)基數(shù)、刷新背景、目標(biāo)、小車(chē)和文本對(duì)象、更新屏幕等。
代碼如下:
def start(self):
clock = pygame.time.Clock()
while True:
clock.tick(60)
if self.event_handler():
return
if self.hero.rect.topleft == TARGET_POSITION: # 判斷汽車(chē)是否移動(dòng)到目標(biāo)位置
ON_TARGET = True
else:
ON_TARGET = False
keys = pygame.key.get_pressed()
move_hori = keys[pygame.K_RIGHT] - keys[pygame.K_LEFT] # 獲得水平移動(dòng)基數(shù),向右為正
move_vert = keys[pygame.K_DOWN] - keys[pygame.K_UP] # 獲得垂直移動(dòng)基數(shù),向下為正
self.hero.update(move_hori, move_vert)
self.label.update(ON_TARGET)
self.screen.blit(self.image, self.rect)
self.screen.blit(self.stop_position, self.stop_position_rect)
self.screen.blit(self.hero.image, self.hero.rect)
self.screen.blit(self.label.image, self.label.image_rect)
pygame.display.update()
>定義小車(chē)對(duì)象
定義了初始化和更新兩個(gè)函數(shù)。
在__init__函數(shù)主要用于創(chuàng)建小車(chē)surface對(duì)象并縮放圖片大小,設(shè)置小車(chē)移動(dòng)速度。
在update函數(shù)主要用于更新小車(chē)的坐標(biāo)位置。具體代碼如下:
class Car(object):
# 定義玩家對(duì)象
def __init__(self):
self.image = pygame.image.load('./image/driver/car1.png').convert_alpha()
self.image = pygame.transform.scale(self.image, (50, 50))
self.rect = self.image.get_rect()
self.speed = 10
def update(self, *args):
self.rect.x += args[0] * self.speed
self.rect.y += args[1] * self.speed
>定義文本對(duì)象
同樣定義了初始化和更新兩個(gè)函數(shù)。
在__init__函數(shù)主要用于創(chuàng)建生成系統(tǒng)字體對(duì)象、文本surface。
在update函數(shù)主要用于根據(jù)是否到達(dá)目標(biāo)值,刷新文本信息。具體代碼如下:
class Label(object):
# 定義文本對(duì)象
def __init__(self):
self.font = pygame.font.SysFont('仿宋gb_2312', 25)
self.image = self.font.render('go to the target', True, TEXT_COLOR)
self.image_rect = self.image.get_rect()
self.image_rect.topleft = (100, 100)
def update(self, is_on_target):
if is_on_target:
text = 'well done'
else:
text = 'go to the target'
self.image = self.font.render(text, True, TEXT_COLOR)
self.image_rect = self.image.get_rect()
self.image_rect.topleft = (100, 100)
4.定義游戲主程序
def main():
pygame.init()
Game().start()
pygame.quit()
if __name__ == '__main__':
main()
二、動(dòng)態(tài)效果實(shí)現(xiàn)
在游戲中動(dòng)態(tài)效果主要有背景的變化、圖像的變化、文本的變化和音樂(lè)音效等。以下舉例總結(jié)一些實(shí)現(xiàn)以上動(dòng)態(tài)效果的方法。
1.背景連續(xù)滾動(dòng)
實(shí)例:高速飛車(chē)
背景連續(xù)滾動(dòng)是通過(guò)兩個(gè)拼接的背景上下移動(dòng)實(shí)現(xiàn)的,如下圖所示。
步驟一:制作Background對(duì)象
class Background(object):
def __init__(self, is_alt):
self.image = pygame.image.load('./image/driver/road.png').convert_alpha()
self.image = pygame.transform.scale(self.image, BG_SIZE)
self.speed = 5 # 設(shè)置屏幕移動(dòng)速度
self.rect = self.image.get_rect()
if is_alt: # 背景初始化時(shí),一個(gè)背景在上,一個(gè)背景在屏幕內(nèi)
self.rect.y = - self.rect.height
def update(self):
self.rect.y += self.speed # 在背景更新時(shí),實(shí)現(xiàn)背景向下移動(dòng)
if self.rect.y >= self.rect.height: # 當(dāng)背景剛好移除屏幕時(shí),將背景重新放置到屏幕的上方
self.rect.y = - self.rect.height
步驟二:在Game類(lèi)中生成2個(gè)背景實(shí)例
self.road_1,self.road_2 = Background(True),Background(False)
Game類(lèi)初始化的完整代碼如下:
class Game(object):
# 游戲類(lèi)
def __init__(self):
# 1.游戲主窗口
self.screen = pygame.display.set_mode(BG_SIZE)
self.road_1,self.road_2 = Background(True),Background(False)
self.speed = 5
self.hero = Car() # 生成汽車(chē)實(shí)例
self.hero.rect.midbottom = self.screen.get_rect().midbottom # 在初始化時(shí),將汽車(chē)放在屏幕底部中間位置
步驟三:在游戲主循環(huán)中添加兩個(gè)背景更新動(dòng)作
self.road_1.update()
self.road_2.update()
self.screen.blit(self.road_1.image, self.road_1.rect)
self.screen.blit(self.road_2.image, self.road_2.rect)
完整代碼:
import pygame
# 定義全局常量
BG_SIZE = (400, 500) # 背景尺寸
class Game(object):
# 游戲類(lèi)
def __init__(self):
# 1.游戲主窗口
self.screen = pygame.display.set_mode(BG_SIZE)
self.road_1, self.road_2 = Background(True), Background(False)
self.speed = 5
self.hero = Car()
self.hero.rect.midbottom = self.screen.get_rect().midbottom
def event_handler(self):
# 定義事件捕獲
for event in pygame.event.get():
if event.type == pygame.QUIT:
return True
return False
def start(self):
clock = pygame.time.Clock()
while True:
clock.tick(60)
if self.event_handler():
return
keys = pygame.key.get_pressed()
move_hori = keys[pygame.K_RIGHT] - keys[pygame.K_LEFT] # 獲得水平移動(dòng)基數(shù),向右為正
move_vert = keys[pygame.K_DOWN] - keys[pygame.K_UP] # 獲得垂直移動(dòng)基數(shù),向下為正
self.road_1.update()
self.road_2.update()
self.hero.update(move_hori, move_vert)
self.screen.blit(self.road_1.image, self.road_1.rect)
self.screen.blit(self.road_2.image, self.road_2.rect)
self.screen.blit(self.hero.image, self.hero.rect)
pygame.display.update()
class Background(object):
def __init__(self, is_alt):
self.image = pygame.image.load('./image/driver/road.png').convert_alpha()
self.image = pygame.transform.scale(self.image, BG_SIZE)
self.speed = 5
self.rect = self.image.get_rect()
if is_alt:
self.rect.y = - self.rect.height
def update(self):
self.rect.y += self.speed
if self.rect.y >= self.rect.height:
self.rect.y = - self.rect.height
class Car(object):
# 定義玩家對(duì)象
def __init__(self):
self.image = pygame.image.load('./image/driver/car1.png').convert_alpha()
self.image = pygame.transform.scale(self.image, (50, 50))
self.rect = self.image.get_rect()
self.speed = 10
def update(self, *args):
self.rect.x += args[0] * self.speed
self.rect.y += args[1] * self.speed
class Label(object):
# 定義文本對(duì)象
def __init__(self):
pass
def update(self, is_on_target):
pass
def main():
pygame.init()
Game().start()
pygame.quit()
if __name__ == '__main__':
main()
2.添加音樂(lè)音效
在高速飛車(chē)游戲添加四個(gè)音樂(lè)效果。背景音樂(lè)、汽車(chē)發(fā)動(dòng)音效、汽車(chē)加速行駛音效、汽車(chē)?yán)纫粜А?br> pygame.mixer.music用以播放背景音樂(lè),pygame.mixer.sound用以播放音效。兩者在功能上略有差別。
mixer.Sound
pygame.mixer.Sound 載入音效文件
pygame.mixer.Sound.play 開(kāi)始聲音播放
pygame.mixer.Sound.stop 停止聲音播放
pygame.mixer.Sound.fadeout 淡出后停止聲音播放
pygame.mixer.Sound.set_volume 設(shè)置聲音的播放音量
pygame.mixer.Sound.get_volume 獲取播放音量
pygame.mixer.Sound.get_num_channels 計(jì)算聲音播放了多少次
pygame.mixer.Sound.get_length 獲取聲音的長(zhǎng)度
pygame.mixer.Sound.get_raw 返回聲音樣本的字符串副本
mixer.music
pygame.mixer.music.load 加載音樂(lè)文件
pygame.mixer.music.unload 卸載當(dāng)前加載的音樂(lè)以釋放資源
pygame.mixer.music.play 開(kāi)始播放音樂(lè)
pygame.mixer.music.rewind 重新開(kāi)始播放音樂(lè)
pygame.mixer.music.stop 停止音樂(lè)播放
pygame.mixer.music.pause 暫停音樂(lè)播放
pygame.mixer.music.unpause 恢復(fù)播放音樂(lè)
pygame.mixer.music.fadeout 淡出后停止音樂(lè)播放
pygame.mixer.music.set_volume 設(shè)置音樂(lè)音量
pygame.mixer.music.get_volume 獲取音樂(lè)音量
pygame.mixer.music.get_busy 檢查音樂(lè)是否正在播放
pygame.mixer.music.set_pos 設(shè)置播放位置
pygame.mixer.music.get_pos 獲取音樂(lè)播放時(shí)間
pygame.mixer.music.queue 將聲音文件排隊(duì)以跟隨當(dāng)前
pygame.mixer.music.set_endevent 讓音樂(lè)在播放停止時(shí)發(fā)送一個(gè)事件
pygame.mixer.music.get_endevent 獲取在播放停止時(shí)發(fā)送的事件
準(zhǔn)備工作
創(chuàng)建一個(gè)文件夾,將所有用到的音樂(lè)文件放到這個(gè)文件夾中。
創(chuàng)建Musicplayer對(duì)象
完成音樂(lè)音效初始化和設(shè)置音樂(lè)播放、音效播放、音效停止三個(gè)函數(shù)。
音效初始化主要是載入音樂(lè)、音效文件,為了便于音效文件的文件,可以使用字典進(jìn)行管理。
代碼如下:
class Musicplayer(object):
def __init__(self):
pygame.mixer.music.load('./wav/bgm.mp3') # 載入背景音樂(lè)文件
self.sound_dict = {} # 生成一個(gè)空字典,用于管理音效對(duì)象。
self.sound_dict['car_engine_start'] = pygame.mixer.Sound('./wav/car_engine_start.mp3') # 載入汽車(chē)啟動(dòng)音效
self.sound_dict['car_speed_up'] = pygame.mixer.Sound('./wav/car_speed_up.wav') # 載入汽車(chē)加速行駛音效
self.sound_dict['car_beep'] = pygame.mixer.Sound('./wav/car_beep.wav') # 載入汽車(chē)?yán)纫粜?/span>
- 背景音樂(lè)播放函數(shù)
def play_music(self):
pygame.mixer.music.play(-1) # 當(dāng)參數(shù)為-1時(shí),將循環(huán)播放
pygame.mixer.music.set_volume(0.2) # 設(shè)置播放音量,參數(shù)0-1.0之間,1為最大。
- 音效播放
為了靈活控制不同音效的播放,可將播放的音效名稱(chēng)作為參數(shù)傳入。
def play_sound(self, wav_name):
self.sound_dict[wav_name].play()
修改Game對(duì)象的start函數(shù)設(shè)置音樂(lè)
游戲開(kāi)始后播放背景音樂(lè),播放汽車(chē)引擎發(fā)動(dòng)音效
def start(self):
clock = pygame.time.Clock()
self.music_player.play_music() # 播放背景音樂(lè)
self.music_player.play_sound('car_engine_start') # 播放汽車(chē)發(fā)動(dòng)音效
speed = 0 # 設(shè)置速度初始值為0,目的是與汽車(chē)加速音效相配合
在當(dāng)汽車(chē)任意方向移動(dòng)基數(shù)不為0時(shí),播放汽車(chē)加速音效,speed不斷加速,最高速度不超過(guò)50,將speed作為背景的向下移動(dòng)速度。
if keys[pygame.K_SPACE]:
self.music_player.play_sound('car_beep')
if move_hori != 0 or move_vert != 0:
self.music_player.play_sound('car_speed_up')
if speed > 50:
speed = 50
else:
speed += 1
else:
speed = 0
self.road_1.update(speed)
self.road_2.update(speed)
修改Background背景對(duì)象代碼
class Background(object):
def __init__(self, is_alt):
self.image = pygame.image.load('./image/driver/road.png').convert_alpha()
self.image = pygame.transform.scale(self.image, BG_SIZE)
self.rect = self.image.get_rect()
if is_alt:
self.rect.y = - self.rect.height
def update(self,speed = 0):
self.rect.y += speed
if self.rect.y >= self.rect.height:
self.rect.y = - self.rect.height
完整代碼如下
import pygame
# 定義全局常量
BG_SIZE = (400, 500) # 背景尺寸
class Game(object):
# 游戲類(lèi)
def __init__(self):
# 1.游戲主窗口
self.screen = pygame.display.set_mode(BG_SIZE)
self.road_1, self.road_2 = Background(True), Background(False)
self.hero = Car()
self.music_player = Musicplayer()
self.hero.rect.midbottom = self.screen.get_rect().midbottom
def event_handler(self):
# 定義事件捕獲
for event in pygame.event.get():
if event.type == pygame.QUIT:
return True
return False
def start(self):
clock = pygame.time.Clock()
self.music_player.play_music()
self.music_player.play_sound('car_engine_start')
speed = 0
while True:
clock.tick(60)
if self.event_handler():
return
keys = pygame.key.get_pressed()
move_hori = keys[pygame.K_RIGHT] - keys[pygame.K_LEFT] # 獲得水平移動(dòng)基數(shù),向右為正
move_vert = keys[pygame.K_DOWN] - keys[pygame.K_UP] # 獲得垂直移動(dòng)基數(shù),向下為正
if keys[pygame.K_SPACE]:
self.music_player.play_sound('car_beep')
if move_hori != 0 or move_vert != 0:
self.music_player.play_sound('car_speed_up')
if speed > 50:
speed = 50
else:
speed += 1
else:
speed = 0
self.road_1.update(speed)
self.road_2.update(speed)
self.hero.update(move_hori, move_vert)
self.screen.blit(self.road_1.image, self.road_1.rect)
self.screen.blit(self.road_2.image, self.road_2.rect)
self.screen.blit(self.hero.image, self.hero.rect)
pygame.display.update()
class Background(object):
def __init__(self, is_alt):
self.image = pygame.image.load('./image/driver/road.png').convert_alpha()
self.image = pygame.transform.scale(self.image, BG_SIZE)
self.rect = self.image.get_rect()
if is_alt:
self.rect.y = - self.rect.height
def update(self,speed = 0):
self.rect.y += speed
if self.rect.y >= self.rect.height:
self.rect.y = - self.rect.height
class Musicplayer(object):
def __init__(self):
pygame.mixer.music.load('./wav/bgm.mp3')
self.sound_dict = {}
self.sound_dict['car_engine_start'] = pygame.mixer.Sound('./wav/car_engine_start.mp3')
self.sound_dict['car_speed_up'] = pygame.mixer.Sound('./wav/car_speed_up.wav')
self.sound_dict['car_beep'] = pygame.mixer.Sound('./wav/car_beep.wav')
def play_music(self):
pygame.mixer.music.play(-1)
pygame.mixer.music.set_volume(0.2)
def play_sound(self, wav_name):
self.sound_dict[wav_name].play()
class Car(object):
# 定義玩家對(duì)象
def __init__(self):
self.image = pygame.image.load('./image/driver/car1.png').convert_alpha()
self.image = pygame.transform.scale(self.image, (50, 50))
self.rect = self.image.get_rect()
self.speed = 10
def update(self, *args):
self.rect.x += args[0] * self.speed
self.rect.y += args[1] * self.speed
self.rect.x = 0 if self.rect.x <= 0 else self.rect.x
self.rect.y = 0 if self.rect.y <= 0 else self.rect.y
if self.rect.right > BG_SIZE[0]:
self.rect.right = BG_SIZE[0]
if self.rect.bottom > BG_SIZE[1]:
self.rect.bottom = BG_SIZE[1]
def main():
pygame.init()
Game().start()
pygame.quit()
if __name__ == '__main__':
main()
3.動(dòng)畫(huà)效果
飛機(jī)在飛行時(shí)噴出的火焰會(huì)發(fā)生變化,子彈發(fā)射后會(huì)飛行一段距離,擊中敵人后敵人會(huì)受傷甚至被摧毀。以上都屬于動(dòng)畫(huà)效果。
實(shí)現(xiàn)動(dòng)畫(huà)效果主要有兩種方式,一是圖片的變換,二是圖片的運(yùn)動(dòng)。
實(shí)例1:飛機(jī)飛行效果
飛機(jī)飛行火焰的變化屬于圖片的輪播效果。實(shí)現(xiàn)圖片輪播有兩種方式,一種是將動(dòng)畫(huà)所有幀組成一張長(zhǎng)圖,按照一定速度同一個(gè)方向循環(huán)前進(jìn),但同一時(shí)間只有一幀能被看到,就像坐地鐵時(shí)看到的廣告,視覺(jué)上就像是連續(xù)播放的視頻。第二種將連續(xù)動(dòng)畫(huà)按關(guān)鍵幀分割成一張張圖片,并按找一定頻率在圖片中依次切換,這和我們平時(shí)看動(dòng)畫(huà)片是類(lèi)似的。
以下以第二種方法為例進(jìn)行介紹。
該方法的操作步驟:
對(duì)象初始化
在對(duì)象初始化時(shí),生成一張空列表,將圖片Surface依次添加到列表中,并設(shè)置第一張圖片為初始時(shí)顯示的圖片。
class Plane(object):
# 定義玩家對(duì)象
def __init__(self, rect):
self.images = []
self.now_frame = 0 # 初始圖片的索引
self.images.append(pygame.image.load('./image/plane/me1.png').convert_alpha())
self.images.append(pygame.image.load('./image/plane/me2.png').convert_alpha())
self.image = self.images[self.now_frame]
self.rect = self.image.get_rect()
self.speed = 10
修改游戲主循環(huán)代碼
對(duì)圖片切換的間隔進(jìn)行設(shè)置,例如每10幀更換一次。
方法時(shí),在循環(huán)中設(shè)置當(dāng)前幀計(jì)數(shù)器frame_count,初始為0,利用與10取余數(shù)的方法,每次循環(huán)frame_count會(huì)+1,到第10次時(shí)歸為0。最后將frame_count==0返回給對(duì)象的update函數(shù)。
def start(self):
clock = pygame.time.Clock()
frame_count = 0
while True:
clock.tick(40)
if self.event_handler():
return
frame_count = (frame_count + 1) % 10
self.hero.update(frame_count==0, move_hori, move_vert)
設(shè)置對(duì)象更新函數(shù)
當(dāng)對(duì)象update函數(shù)被調(diào)用時(shí),先判斷args[0]是否為真,即判斷frame_count == 0 是否為真,如果為T(mén)rue則代表此次時(shí)過(guò)去了10幀,需切換圖片;如果為false,則直接返回。
更新的方式是從頭開(kāi)始輪播圖片,如果當(dāng)前不是最后一張圖片,則切換到下一張;如果是最后一張圖片,則切換到第一張。
def update(self, *args):
if not args[0]:
return
if self.now_frame < range(len(self.images))[-1]:
self.now_frame += 1
self.image = self.images[self.now_frame]
else:
self.now_frame = range(len(self.images))[0]
self.image = self.images[self.now_frame]
本篇主要內(nèi)容如上,主要介紹了游戲代碼的典型結(jié)構(gòu),總結(jié)了背景連續(xù)滾動(dòng)、聲音效果和圖像動(dòng)態(tài)效果的實(shí)現(xiàn)方法。下一篇將對(duì)Pygame的精靈和精靈組實(shí)現(xiàn)方法進(jìn)行。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-425329.html
上例完整代碼如下:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-425329.html
import pygame
import time
import os
# 定義全局常量
BG_SIZE = (400, 500) # 背景尺寸
INIT_RECT = pygame.Rect(200, 250, 60, 60)
class Game(object):
# 游戲類(lèi)
def __init__(self):
# 1.游戲主窗口
self.screen = pygame.display.set_mode(BG_SIZE)
self.road_1, self.road_2 = Background(True), Background(False)
self.hero = Plane(INIT_RECT)
self.hero.rect.midbottom = self.screen.get_rect().midbottom
def event_handler(self):
# 定義事件捕獲
for event in pygame.event.get():
if event.type == pygame.QUIT:
return True
return False
def start(self):
clock = pygame.time.Clock()
frame_count = 0
while True:
clock.tick(40)
if self.event_handler():
return
keys = pygame.key.get_pressed()
move_hori = keys[pygame.K_RIGHT] - keys[pygame.K_LEFT] # 獲得水平移動(dòng)基數(shù),向右為正
move_vert = keys[pygame.K_DOWN] - keys[pygame.K_UP] # 獲得垂直移動(dòng)基數(shù),向下為正
self.road_1.update()
self.road_2.update()
frame_count = (frame_count + 1) % 10
self.hero.update(frame_count == 0, move_hori, move_vert)
self.screen.blit(self.road_1.image, self.road_1.rect)
self.screen.blit(self.road_2.image, self.road_2.rect)
self.screen.blit(self.hero.image, self.hero.rect)
pygame.display.update()
class Background(object):
def __init__(self, is_alt):
self.image = pygame.image.load('./image/plane/background.png').convert_alpha()
self.image = pygame.transform.scale(self.image, BG_SIZE)
self.rect = self.image.get_rect()
if is_alt:
self.rect.y = - self.rect.height
def update(self,speed = 1):
self.rect.y += speed
if self.rect.y >= self.rect.height:
self.rect.y = - self.rect.height
class Plane(object):
# 定義玩家對(duì)象
def __init__(self, rect):
self.images = []
self.now_frame = 0
self.images.append(pygame.image.load('./image/plane/me1.png').convert_alpha())
self.images.append(pygame.image.load('./image/plane/me2.png').convert_alpha())
self.image = self.images[self.now_frame]
self.rect = self.image.get_rect()
self.speed = 10
def update(self, *args):
if not args[0]:
return
if self.now_frame < range(len(self.images))[-1]:
self.now_frame += 1
print(self.now_frame)
self.image = self.images[self.now_frame]
else:
self.now_frame = range(len(self.images))[0]
print(self.now_frame)
self.image = self.images[self.now_frame]
self.rect.x += args[1] * self.speed
self.rect.y += args[2] * self.speed
self.rect.x = 0 if self.rect.x <= 0 else self.rect.x
self.rect.y = 0 if self.rect.y <= 0 else self.rect.y
if self.rect.right > BG_SIZE[0]:
self.rect.right = BG_SIZE[0]
if self.rect.bottom > BG_SIZE[1]:
self.rect.bottom = BG_SIZE[1]
class Label(object):
# 定義文本對(duì)象
def __init__(self):
pass
def update(self, is_on_target):
pass
def main():
pygame.init()
Game().start()
pygame.quit()
到了這里,關(guān)于Pygame入門(mén)-游戲代碼結(jié)構(gòu)及背景輪播、聲音音效及圖像動(dòng)態(tài)效果的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!