python - 如何在pygame中的屏幕内区域添加边界

标签 python pygame

我一直在尝试创建一个游戏屏幕,但我似乎无法在屏幕上的房屋周围添加边界,以便玩家不会走过它们。下面是我的代码

import pygame
import sys
from pygame import mixer

pygame.init()

playerImg = pygame.image.load('player.png')
WalkFront = [pygame.image.load('B1.png'), pygame.image.load('B2.png'),pygame.image.load('B3.png'),
         pygame.image.load('B4.png')]
WalkBack = [pygame.image.load('F1.png'), pygame.image.load('F2.png'), pygame.image.load('F3.png'),
        pygame.image.load('F4.png')]
WalkRight = [pygame.image.load('R1.png'), pygame.image.load('R2.png'), pygame.image.load('R3.png'),
         pygame.image.load('R4.png')]
WalkLeft = [pygame.image.load('L1.png'), pygame.image.load('L2.png'), pygame.image.load('L3.png'),
        pygame.image.load('L4.png')]
walkcount = 0
clock = pygame.time.Clock()


scr = pygame.display.set_mode((800, 600))
pygame.display.set_caption('Pokemon: Red')

logo = pygame.image.load('logo.png')
pygame.display.set_icon(logo)

background = pygame.image.load('BG.png')
pallet = pygame.image.load('pallet town.png')

mixer.music.load('Start menu.mp3')
mixer.music.play(100, 0, 0)


playerX = 200
playerY = 200
up = False
down = False
left = False
right = False


def redrawgamewindow():
    global walkcount
    scr.fill((0, 0, 0))
    scr.blit(pallet, (60, 0))
    if walkcount + 1 >= 29:
        walkcount = 0
    if up:
        scr.blit(WalkFront[walkcount // 7], (playerX, playerY))
        walkcount += 1
    elif down:
        scr.blit(WalkBack[walkcount // 7], (playerX, playerY))
        walkcount += 1
    elif left:
        scr.blit(WalkLeft[walkcount // 7], (playerX, playerY))
        walkcount += 1
    elif right:
        scr.blit(WalkRight[walkcount // 7], (playerX, playerY))
        walkcount += 1
    else:
        player(playerX, playerY)

    pygame.display.update()


def player(x, y):
    scr.blit(playerImg, (x, y))


def start_menu():
    while True:
        scr.fill((255, 255, 255))
        scr.blit(background, (0, 0))

        for event in pygame.event.get():
            if event.type == pygame.KEYDOWN:
                game()

                if event.type == pygame.QUIT:
                    pygame.quit()
                    sys.exit()
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_ESCAPE:
                        pygame.quit()
                        sys.exit()

            pygame.display.update()


def game():
    global playerX
    global playerY
    clock.tick(12)
    mixer.music.pause()
    mixer.music.load('pallet_music.mp3')
    mixer.music.play(100)
    playerX_change = 0
    playerY_change = 0
    running = True
    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
   
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_UP:
                    global up
                    global down
                    global left
                    global right
                    up = True
                    down = False
                    playerY_change = -0.8
                elif event.key == pygame.K_DOWN:
                    up = False
                    down = True
                    playerY_change = 0.8
                else:
                    up = False
                    down = False
                    walkcount = 0
                if event.key == pygame.K_LEFT:
                    playerX_change = -1
                    left = True
                    right = False
                elif event.key == pygame.K_RIGHT:
                    playerX_change = 1
                    right = True
                    left = False
                else:
                    left = False
                    right = False
                    walkcount = 0

            if event.type == pygame.KEYUP:
                if event.key == pygame.K_UP or event.key == pygame.K_DOWN:
                    playerY_change = 0
                    up = False
                    down = False
                    left = False
                    right = False
                if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
                    playerX_change = 0
                    up = False
                    down = False
                    left = False
                    right = False

        playerX += playerX_change
        playerY += playerY_change

        if playerX <= 90:
            playerX = 90
        elif playerX >= 670:
            playerX = 670
        if playerY <= 40:
            playerY = 40
        elif playerY >= 540:
            playerY = 540
        redrawgamewindow()


start_menu()

背景图像上有一个区域,左上角有一座房子。请参阅下面的背景图片,以便您获得更好的想法。我想要的是玩家无法在房子上行走,因此他会被挡在边缘。

background image

最佳答案

我建议为房子定义一个矩形区域。使用pygame.Rect 。您必须找到 hxhyhwhh 的值:

house_rect = pygame.Rect(hx, hy, hw, hh)

在玩家位置改变后为玩家创建一个矩形。矩形的大小可以从 pygame.Surface 获取代表玩家的对象 get_rect() 。该位置必须通过关键字参数设置(topleft = (playerX, playerY))。
使用pygame.Rect.colliderect评估玩家是否与房屋发生碰撞并将玩家的位置限制在房屋外的区域:

playerX += playerX_change
player_rect = playerImg.get_rect(topleft = (playerX, playerY))

if player_rect.colliderect(house_rect):
    if playerX_change > 0:
        player_rect.right = house_rect.left
    elif playerX_change < 0:
        player_rect.left = house_rect.right
    playerX = player_rect.x

playerY += playerY_change
player_rect = playerImg.get_rect(topleft = (playerX, playerY))

if player_rect.colliderect(house_rect):
    if playerY_change < 0:
        player_rect.top = house_rect.bottom
    elif playerY_change > 0:
        player_rect.bottom = house_rect.top
    playerY = player_rect.y

关于python - 如何在pygame中的屏幕内区域添加边界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63899418/

相关文章:

python - 如何将 SVG 与 pygame 一起使用(或者以更高的清晰度显示 PNG)?

animation - 当我运行此示例 pygame 代码时,DOS 窗口出现并突然消失,无需等待任何用户输入

python - Pygame 按钮 get.pressed()

python - pygame.Sound.get_num_channels 不准确

python - 有什么简单的方法可以在 python 中稀疏地存储具有冗余模式的矩阵?

python - 基于 Pandas DataFrame 中两行之间的斜率的条件

python - Tensorflow 体育预测

python - 如何将尾随零添加到整数

python - 更新字典并在键存在时追加

python - ImportError:没有使用 pygame2exe 的名为 _view 的模块