You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pygame屏幕角落碰撞失效问题求助

Pygame边界碰撞问题修复

问题

测试代码时,屏幕外围的边界碰撞功能在直接控制方块左/右/上/下移动时正常,能阻止方块越界。但当方块贴住左墙或右墙后,再按上/下键移动,方块会穿过边界,调整边界位置也无法解决问题。

原代码

import pygame

# Initialize pygame
pygame.init()

# Create screen
screen = pygame.display.set_mode((800, 600))

# Caption and Icon
pygame.display.set_caption("Runes")
icon = pygame.image.load("rune.png")
pygame.display.set_icon(icon)

# Player
player_img = pygame.image.load("testcharacter.jpg")
player_x = 370
player_y = 480
player_x_change = 0
player_y_change = 0

def player(x, y, x_change):
    screen.blit(player_img, (x, y))

running = True

while running:

    screen.fill((0, 0, 0))
    
    for event in pygame.event.get():
        
        if event.type == pygame.QUIT:
            running = False
    
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                player_x_change = -0.1
            if event.key == pygame.K_RIGHT:
                player_x_change = 0.1
            if event.key == pygame.K_UP:
                player_y_change = -0.1
            if event.key == pygame.K_DOWN:
                player_y_change = 0.1
    
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT:
                if player_x_change == 0.1:
                    print("Right key still pressed")
                else:
                    player_x_change = 0
            if event.key == pygame.K_RIGHT:
                if player_x_change == -0.1:
                    print("Left key still pressed")
                else:
                    player_x_change = 0
            if event.key == pygame.K_UP:
                if player_y_change == 0.1:
                    print("Down key still pressed")
                else:
                    player_y_change = 0
            if event.key == pygame.K_DOWN:
                if player_y_change == -0.1:
                    print("Up key still pressed")
                else:
                    player_y_change = 0

    player_x += player_x_change
    player_y += player_y_change
    
    # 原边界判断逻辑(存在问题)
    if player_x <= 5:
        player_x = 5
    elif player_x >= 730:
        player_x = 730
    elif player_y <= 5:
        player_y = 5
    elif player_y >= 532:
        player_y = 532
    
    player(player_x, player_y, player_x_change)
    pygame.display.update()

问题原因

边界判断使用了elif链式结构:当x轴触发边界条件(比如player_x <=5)时,后续的y轴边界判断会被跳过,导致y轴移动不受限制,方块会穿过上下边界。

修复方法

将边界判断的elif全部改为独立的if语句,确保x轴和y轴的边界检查都会执行:

# 修改后的边界判断逻辑
if player_x <= 5:
    player_x = 5
if player_x >= 730:
    player_x = 730
if player_y <= 5:
    player_y = 5
if player_y >= 532:
    player_y = 532

这样无论x轴是否触发边界,y轴的边界检查都会正常执行,方块贴住左右墙时上下移动也会被限制在边界内。

内容的提问来源于stack exchange,提问作者Liamo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 10:08:11