微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在Pygame的屏幕内区域上添加边界

如何解决如何在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)


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


def redrawgamewindow():
    global walkcount
    scr.fill((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],playerY))
        walkcount += 1
    elif left:
        scr.blit(WalkLeft[walkcount // 7],playerY))
        walkcount += 1
    elif right:
        scr.blit(WalkRight[walkcount // 7],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
,

我想您必须耐心地像这样用x和y来划分边界:

if x > boundaryX and y > boundaryY:
    xOfThePlayer -= moving

这是一个示例,您必须根据需要进行更改。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。