使用Pygame製作8位遊戲
Pygame是一個用於製作遊戲的開源Python庫。Pygame庫提供了各種用於建立遊戲、聲音處理和圖形的功能和工具。Pygame庫可用於在任何作業系統(如Windows、Linux和macOS)上建立遊戲,因為Pygame是一個跨平臺庫。
什麼是8位遊戲?
8位遊戲在20世紀80年代非常流行。8位影片遊戲包含使用8位技術建立的圖形和聲音,即使用有限的調色盤和聲音範圍(屬於8位範圍)來建立此類影片遊戲。在本文中,我們將使用Python中的Pygame庫建立一個圖形簡單的8位遊戲。
在使用Pygame建立8位遊戲之前,我們需要使用Python中的pip命令安裝Pygame,如下所示:
pip install pygame
建立8位遊戲
建立遊戲視窗
安裝Pygame庫後,我們可以用它來建立我們的遊戲。要建立遊戲,我們首先需要建立一個特定大小的視窗來顯示或玩遊戲。要建立視窗,我們需要:
指定視窗的寬度和高度
使用pygame.display.set_mode()函式建立視窗,並將寬度和高度傳遞給它。
建立遊戲開始時在遊戲視窗頂部顯示的視窗名稱。使用display.set_caption()函式設定視窗名稱。
示例
import pygame pygame.init() width = 640 height = 480 screen = pygame.display.set_mode((width, height)) pygame.display.set_caption("My 8-bit Game")
建立8位精靈
建立遊戲視窗後,我們將建立8位精靈。精靈是8位遊戲的基本構建塊。精靈是在螢幕上移動的物件,可以由計算機或玩家移動。我們可以透過以下方式在8位遊戲中建立精靈:
使用pygame.sprite.Sprite()類
建立一個從精靈類繼承的玩家類
定義類的屬性和函式
示例
class Player(pygame.sprite.Sprite): def __init__(self, x, y): super().__init__() self.image = pygame.Surface((16, 16)) self.image.fill((255, 255, 255)) self.rect = self.image.get_rect() self.rect.x = x self.rect.y = y player = Player(0, 0)
在遊戲中建立敵人
為了使遊戲更具吸引力,我們可以為玩家建立一些敵人,當敵人與玩家碰撞時會對玩家造成傷害。我們可以透過建立一個從pygame.sprite.Sprite()類繼承的新敵人類來建立敵人,這將類似於玩家類。
在這裡,我們將:
使用pygame.sprite.Sprite()類建立類似於玩家類的敵人類
以紅色建立敵人
水平移動敵人
建立一個更新函式,設定移動敵人的速度。
# Define the Enemy class class Enemy(pygame.sprite.Sprite): def __init__(self, x, y): super().__init__() self.image = pygame.Surface((32, 32)) self.image.fill((0, 0, 255)) self.rect = self.image.get_rect() self.rect.x = x self.rect.y = y self.speed = 2 def update(self): self.rect.x += self.speed if self.rect.left > WIDTH: self.rect.right = 0
新增增強道具
我們可以為玩家建立增強道具,當玩家與增強道具碰撞時,將增加玩家的力量或速度。我們可以建立一個從pygame.sprite.Sprite()類繼承的新增強道具類,這將類似於玩家和敵人類。
在這裡,我們將:
建立一個類似於玩家和敵人類的增強道具類,它將具有力量或速度屬性
增強道具物件將為綠色
# Define the PowerUp class class PowerUp(pygame.sprite.Sprite): def __init__(self, x, y, power): super().__init__() self.image = pygame.Surface((16, 16)) self.image.fill((0, 255, 0)) self.rect = self.image.get_rect() self.rect.x = x self.rect.y = y self.power = power def update(self): pass
建立玩家和敵人組及例項
為玩家、敵人和增強道具建立組,以便我們可以建立多個例項以使遊戲更具互動性。在這個遊戲中,我們將:
建立5個Enemy類的例項並將它們新增到enemies組
建立3個PowerUp類的例項並將它們新增到powerups組
# Create the player and enemy groups all_sprites = pygame.sprite.Group() enemies = pygame.sprite.Group() powerups = pygame.sprite.Group() player = Player() all_sprites.add(player) ``` ``` # Create 5 instances of the Enemy class and add them to the enemies group for i in range(5): enemy = Enemy(random.randint(0, WIDTH), random.randint(0, HEIGHT)) enemies.add(enemy) all_sprites.add(enemy) # Create 3 instances of the PowerUp class and add them to the powerups group for i in range(3): power = random.choice(['health', 'speed']) powerup = PowerUp(random.randint(0, WIDTH), random.randint(0, HEIGHT), power) powerups.add(powerup) all_sprites.add(powerup)
建立遊戲迴圈
我們可以使用鍵盤輸入為遊戲新增移動功能。我們可以使用pygame.key.get_pressed()函式處理遊戲中的鍵盤輸入,該函式返回一個布林值,指示當前按下了哪個鍵。
這裡:
我們將建立一個無限迴圈來持續監聽事件
如果使用者關閉視窗,我們將使用pygame.quit()和sys.exit()函式退出遊戲。
使用**pygame.key.get_pressed()**函式獲取當前按下的鍵
如果按下了左箭頭鍵,我們將透過從x座標減去5來向後移動玩家;如果按下了右箭頭鍵,我們將透過向玩家位置的x座標新增5來向前移動玩家;向上和向下箭頭鍵也是如此。
使用pygame.sprite.spritecollide()函式檢查與敵人的碰撞
使用pygame.sprite.spritecollide()函式檢查與增強道具的碰撞
當敵人與玩家碰撞時更新敵人。
使用screen.fill()函式用黑色填充螢幕
使用screen.blit()函式在螢幕上顯示玩家
使用pygame.display.flip()函式更新顯示。
# Game loop while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() keys = pygame.key.get_pressed() if keys[pygame.K_LEFT]: player.rect.x -= player.speed elif keys[pygame.K_RIGHT]: player.rect.x += player.speed elif keys[pygame.K_UP]: player.rect.y -= player.speed elif keys[pygame.K_DOWN]: player.rect.y += player.speed # Check for collisions with enemies if pygame.sprite.spritecollide(player, enemies, True): player.health -= 10 # Check for collisions with power-ups powerups_collected = pygame.sprite.spritecollide(player, powerups, True) for powerup in powerups_collected: if powerup.power == 'health': player.health += 20 elif powerup.power == 'speed': player.speed += 1 # Update the enemies enemies.update() # Draw the sprites on the screen screen.fill((0, 0, 0)) screen.blit(player.image, player.rect) enemies.draw(screen) powerups.draw(screen) pygame.display.flip()
完整的程式碼如下:
import pygame import sys import random # Initialize Pygame pygame.init() # Set up the display WIDTH = 800 HEIGHT = 600 screen = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption('8-Bit Game') # Set up the clock clock = pygame.time.Clock() # Define the Player class class Player(pygame.sprite.Sprite): def __init__(self): super().__init__() self.image = pygame.Surface((32, 32)) self.image.fill((255, 0, 0)) self.rect = self.image.get_rect() self.rect.x = WIDTH // 2 self.rect.y = HEIGHT // 2 self.speed = 5 self.health = 100 def update(self): pass # Define the Enemy class class Enemy(pygame.sprite.Sprite): def __init__(self, x, y): super().__init__() self.image = pygame.Surface((32, 32)) self.image.fill((0, 0, 255)) self.rect = self.image.get_rect() self.rect.x = x self.rect.y = y self.speed = 2 def update(self): self.rect.x += self.speed if self.rect.left > WIDTH: self.rect.right = 0 # Define the PowerUp class class PowerUp(pygame.sprite.Sprite): def __init__(self, x, y, power): super().__init__() self.image = pygame.Surface((16, 16)) self.image.fill((0, 255, 0)) self.rect = self.image.get_rect() self.rect.x = x self.rect.y = y self.power = power def update(self): pass # Create the player and enemy groups all_sprites = pygame.sprite.Group() enemies = pygame.sprite.Group() powerups = pygame.sprite.Group() player = Player() all_sprites.add(player) # Create 5 instances of the Enemy class and add them to the enemies group for i in range(5): enemy = Enemy(random.randint(0, WIDTH), random.randint(0, HEIGHT)) enemies.add(enemy) all_sprites.add(enemy) # Create 3 instances of the PowerUp class and add them to the powerups group for i in range(3): power = random.choice(['health', 'speed']) powerup = PowerUp(random.randint(0, WIDTH), random.randint(0, HEIGHT), power) powerups.add(powerup) all_sprites.add(powerup) # Game loop while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() keys = pygame.key.get_pressed() if keys[pygame.K_LEFT]: player.rect.x -= player.speed elif keys[pygame.K_RIGHT]: player.rect.x += player.speed elif keys[pygame.K_UP]: player.rect.y -= player.speed elif keys[pygame.K_DOWN]: player.rect.y += player.speed # Check for collisions with enemies if pygame.sprite.spritecollide(player, enemies, True): player.health -= 10 # Check for collisions with power-ups powerups_collected = pygame.sprite.spritecollide(player, powerups, True) for powerup in powerups_collected: if powerup.power == 'health': player.health += 20 elif powerup.power == 'speed': player.speed += 1 # Update the enemies enemies.update() # Draw the sprites on the screen screen.fill((0, 0, 0)) screen.blit(player.image, player.rect) enemies.draw(screen) powerups.draw(screen) pygame.display.flip()
輸出
結論
在本文中,我們透過建立一個包含玩家、敵人和增強道具的8位遊戲來探索Pygame庫,以使遊戲更有趣。Pygame庫可用於向遊戲新增更多功能和聲音,這可能會使程式碼更復雜。