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
相关产品推荐
相关产品推荐

