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

Pygame 2D瓦片游戏实现角色移动与水域碰撞检测

Pygame 2D地图角色移动与碰撞检测实现

现有基础效果

当前瓦片地图渲染逻辑运行正常,已实现的地图效果如下:
已渲染完成的游戏地图

具体实现步骤

  • 新增玩家属性配置:定义玩家显示颜色、初始出生位置(需选在非水域的瓦片上)、移动冷却时间(避免按住按键时移动速度过快)。
  • 键盘输入监听:使用pygame.key.get_pressed()持续检测方向键按下状态,相比事件触发式检测,支持按住按键连续移动,操作体验更流畅。
  • 水域碰撞检测:每次触发移动逻辑时,先计算移动后的目标瓦片坐标,仅当目标坐标在地图合法范围内、且对应瓦片不是标识为W的水域时,才更新玩家位置,直接从逻辑层阻断进入水域的可能。
  • 调整渲染层级:先绘制所有地图瓦片,再绘制玩家角色,保证角色显示在地图上层不被遮挡。

修改后可直接运行的完整代码

import pygame, sys

# 颜色定义
BLUE = (0, 0, 255)
SAND = (194, 176, 128)
GRASS = (124, 252, 0)
FOREST = (0, 100, 0)
PLAYER_RED = (255, 0, 0)

TileColor = {'W': BLUE, 'S': SAND, 'G': GRASS, 'F': FOREST}

map1 = ["WWWWWWWWWWWWWWWWWWWWWWW",
        "WWWWWWWWWGGGWWWWWWWWWWW",
        "WWWWWGGGGGGGGGGGWWWWWWW", 
        "WWWWGGGGGFFFGGGGGGWWWWW",
        "WWWGGGGGFFFFFFGGGGGWWWW", 
        "WWWGGGGGGFFFFFGGGGGGWWW",
        "WWGGGGGGGGGFFGGGGGGGWWW", 
        "WWGGGGGGGGGGGGGGGGGGGWW",
        "WWGGGGGGSSSSSSSGGGGGGGW", 
        "WWGGGGSSSSSSSSSSGGGGGGW",
        "WGGGGGGGSSGGGGGGGGGGGSW", 
        "WGGGGGGGGGGGGGGGGGGGSSW",
        "WSGGGGGGGGFFGGGGGGGGSSW", 
        "WSSGGGGGGFFFGGGGGFFGGSW",
        "WSSGGGGGFFFFFFGGFFFFFGW", 
        "WSGGGGFFFFFFFFFFFFFFGGW",
        "WWGGGGGFFFFFFFFFFFFGGWW", 
        "WWGGGGGGGFFFFFFFFGGGWWW",
        "WWWWGGGGGGGGFFGGGGGWWWW", 
        "WWWWWWSSSSSGGGGSSSWWWWW",
        "WWWWWWWWWSSSSSSSSWWWWWW", 
        "WWWWWWWWWWWWWWSWWWWWWWW",
        "WWWWWWWWWWWWWWWWWWWWWWW"
        ]

TILESIZE = 22
MAPWIDTH = 23
MAPHEIGHT = 23

# 玩家配置
player_col = 11  # 初始列坐标(草地位置)
player_row = 11  # 初始行坐标(草地位置)
MOVE_COOLDOWN = 150  # 移动冷却时间(毫秒),控制移动速度
last_move_time = 0

pygame.init()
DISPLAY = pygame.display.set_mode((MAPWIDTH * TILESIZE, MAPHEIGHT * TILESIZE))
clock = pygame.time.Clock()

while True:
    current_time = pygame.time.get_ticks()
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

    # 检测键盘输入,冷却结束才响应移动
    if current_time - last_move_time >= MOVE_COOLDOWN:
        key_press = pygame.key.get_pressed()
        target_col, target_row = player_col, player_row
        if key_press[pygame.K_UP]:
            target_row -= 1
        elif key_press[pygame.K_DOWN]:
            target_row += 1
        elif key_press[pygame.K_LEFT]:
            target_col -= 1
        elif key_press[pygame.K_RIGHT]:
            target_col += 1
        
        # 碰撞检测:边界判断 + 非水域判断
        if 0 <= target_row < MAPHEIGHT and 0 <= target_col < MAPWIDTH:
            if map1[target_row][target_col] != 'W':
                player_col, player_row = target_col, target_row
                last_move_time = current_time

    # 绘制地图
    for row in range(MAPHEIGHT):
        for col in range(MAPWIDTH):
            pygame.draw.rect(
                DISPLAY, TileColor[map1[row][col]],
                (col * TILESIZE, row * TILESIZE, TILESIZE, TILESIZE))
    
    # 绘制玩家
    pygame.draw.rect(
        DISPLAY, PLAYER_RED,
        (player_col * TILESIZE, player_row * TILESIZE, TILESIZE, TILESIZE)
    )

    pygame.display.update()
    clock.tick(60)

效果说明

运行代码后,红色方块为玩家角色,通过键盘方向键即可控制角色在沙地、草地、森林瓦片上移动,尝试移动到蓝色水域时会被直接阻挡,不会进入水域瓦片。如果需要调整移动速度,修改MOVE_COOLDOWN的数值即可,数值越小移动速度越快。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 06:54:23