国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Pygame入門(mén)-游戲代碼結(jié)構(gòu)及背景輪播、聲音音效及圖像動(dòng)態(tài)效果

這篇具有很好參考價(jià)值的文章主要介紹了Pygame入門(mén)-游戲代碼結(jié)構(gòu)及背景輪播、聲音音效及圖像動(dòng)態(tài)效果。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

一、游戲代碼結(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)的,如下圖所示。
Pygame入門(mén)-游戲代碼結(jié)構(gòu)及背景輪播、聲音音效及圖像動(dòng)態(tài)效果
步驟一:制作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

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)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • vue自動(dòng)播放音頻提示音(根據(jù)接口返回的狀態(tài)值,提示聲音。 code==0:播放成功音效; else 播放失敗的音效)

    vue自動(dòng)播放音頻提示音(根據(jù)接口返回的狀態(tài)值,提示聲音。 code==0:播放成功音效; else 播放失敗的音效)

    有時(shí)我們并不是想要在頁(yè)面上放置一個(gè)播放音頻的控件然后人為點(diǎn)擊去播放,**而是通過(guò)一個(gè)圖標(biāo)點(diǎn)擊事件或者js去控制它的播放暫停等操作,此時(shí)我們就要使用到Audio對(duì)象,**博主這里是Vue項(xiàng)目, 所以在data中使用的同一個(gè)Audio實(shí)例 項(xiàng)目需求:輸入框輸入完成 后續(xù)只需要通過(guò)切換

    2024年02月13日
    瀏覽(28)
  • 15. python從入門(mén)到精通——Pygame游戲編程

    15. python從入門(mén)到精通——Pygame游戲編程

    目錄 游戲的原理 安裝Pygame Pygame常用模塊 Pygame的基本使用? ? ? 實(shí)例:制作一個(gè)跳躍的小球游戲,如果碰到窗口邊緣會(huì)改變小球移動(dòng)方向 實(shí)現(xiàn)步驟: ?運(yùn)行效果: 小球圖片:? ?? ?python代碼: 開(kāi)發(fā)Flappy Bird游戲 游戲簡(jiǎn)介: 運(yùn)行效果: 圖片素材 游戲分析? 以面向?qū)ο蟮乃季S

    2024年02月12日
    瀏覽(67)
  • Python游戲入門(mén) 武裝飛船1-創(chuàng)建Pygame窗口

    Python游戲入門(mén) 武裝飛船1-創(chuàng)建Pygame窗口

    C++入門(mén)練習(xí)1 運(yùn)行結(jié)果-這是C++編程 //非?;A(chǔ)的練習(xí),用于熟悉編程用語(yǔ)#include iostreamusing namespace std;int main(){ co ? C++入門(mén)練習(xí)2 運(yùn)行結(jié)果-a+b=c //非?;A(chǔ)的練習(xí),用于熟悉編程用語(yǔ)#include iostreamusing namespace std; int main(){ i ? 綠盟一面-Java 面試其實(shí)也就一面,前兩天剛面完,兩個(gè)

    2024年02月01日
    瀏覽(29)
  • Pygame事件處理機(jī)制簡(jiǎn)介-慕課的python游戲開(kāi)發(fā)入門(mén)02

    Pygame事件處理機(jī)制簡(jiǎn)介-慕課的python游戲開(kāi)發(fā)入門(mén)02

    目錄 首先解釋幾個(gè)問(wèn)題: 1、事件處理需求主要有以下幾個(gè)方面: 2、Pygame事件隊(duì)列 3、Pygame事件 4、事件類(lèi)型及屬性 ?5、事件處理的重要函數(shù) ?6、鍵盤(pán)事件 7、鼠標(biāo)事件 8、處理事件函數(shù) 9、操作事件隊(duì)列 10、生成事件 其次給出代碼段,有利于大家對(duì)其進(jìn)行學(xué)習(xí)和分析 最后進(jìn)

    2024年02月06日
    瀏覽(35)
  • Python版基于pygame的瑪麗快跑小游戲源代碼,瑪麗冒險(xiǎn)小游戲代碼,支持雙人模式

    Python版基于pygame的瑪麗快跑小游戲源代碼,瑪麗冒險(xiǎn)小游戲代碼,支持雙人模式

    基于pygame的瑪麗快跑小游戲源代碼,瑪麗冒險(xiǎn)小游戲代碼,支持雙人模式 按空格進(jìn)入單人模式,按‘t’進(jìn)入雙人模式,雙人模式下瑪麗1采用空格鍵上跳,瑪麗2采用方向上鍵上跳。 完整代碼下載地址:Python版基于pygame的瑪麗快跑小游戲源代碼 完整代碼下載地址:Python版基于

    2024年02月11日
    瀏覽(93)
  • 基于Python pygame簡(jiǎn)易版斗獸棋小游戲源代碼

    基于Python pygame簡(jiǎn)易版斗獸棋小游戲源代碼

    基于Python pygame簡(jiǎn)易版斗獸棋小游戲源代碼 游戲規(guī)則如下: 勝利條件: 1.吃掉對(duì)方全部棋子 2.走入對(duì)方獸穴(不可進(jìn)入自己洞穴) 吃法: 1.象獅虎豹狼狗貓鼠象 2.同類(lèi)棋子先行者吃掉對(duì)方 3.老鼠可以進(jìn)河,老鼠在河里時(shí),岸上的動(dòng)物不能捕食他,他也不能捕食岸上的動(dòng)物 4.獅虎在河中沒(méi)

    2023年04月09日
    瀏覽(101)
  • 基于Python+Pygame實(shí)現(xiàn)一個(gè)俄羅斯方塊小游戲【完整代碼】

    基于Python+Pygame實(shí)現(xiàn)一個(gè)俄羅斯方塊小游戲【完整代碼】

    俄羅斯方塊,一款起源于上世紀(jì)80年代的經(jīng)典電子游戲,憑借簡(jiǎn)單的規(guī)則和獨(dú)特的魅力,一躍成為全球家喻戶曉的經(jīng)典。你知道其實(shí)只需要一些基礎(chǔ)的編程知識(shí),就可以自己實(shí)現(xiàn)它嗎?今天,我們將使用Python的Pygame庫(kù),一步步帶你構(gòu)建屬于自己的俄羅斯方塊小游戲! 游戲初始

    2024年02月04日
    瀏覽(24)
  • 在 Flutter 多人視頻通話中實(shí)現(xiàn)虛擬背景、美顏與空間音效

    在 Flutter 多人視頻通話中實(shí)現(xiàn)虛擬背景、美顏與空間音效

    在之前的「基于聲網(wǎng) Flutter SDK 實(shí)現(xiàn)多人視頻通話」里,我們通過(guò) Flutter + 聲網(wǎng) SDK 完美實(shí)現(xiàn)了跨平臺(tái)和多人視頻通話的效果,那么本篇我們將在之前例子的基礎(chǔ)上進(jìn)階介紹一些常用的特效功能,包括虛擬背景、色彩增強(qiáng)、空間音頻、基礎(chǔ)變聲功能。 本篇主要帶你了解 SDK 里幾

    2023年04月13日
    瀏覽(25)
  • Python版經(jīng)典小游戲憤怒的小鳥(niǎo)源代碼,基于pygame+pymunk

    Python版經(jīng)典小游戲憤怒的小鳥(niǎo)源代碼,基于pygame+pymunk

    Python版經(jīng)典小游戲憤怒的小鳥(niǎo)源代碼,基于pygame+pymunk 程序依賴:pygame 2.0.1, pymunk 5.5.0 直接運(yùn)行main.py 完整代碼下載地址:Python版經(jīng)典小游戲憤怒的小鳥(niǎo)源代碼 tool.py 完整代碼下載地址:Python版經(jīng)典小游戲憤怒的小鳥(niǎo)源代碼

    2024年02月16日
    瀏覽(104)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包