当前位置: 首页 > news >正文

python+pygame+pytmx+map editor开发一个tiled游戏demo 05使用object层初始化player位置

在这里插入图片描述

代码

import mathimport pygame# 限制物体在屏幕内
import pytmxdef limit_position_to_screen(x, y, width, height):"""限制物体在屏幕内"""x = max(0, min(x, SCREEN_WIDTH - width))  # 限制x坐标y = max(0, min(y, SCREEN_HEIGHT - height))  # 限制y坐标return x, ypygame.init()# 设置窗口大小
SCREEN_WIDTH = 640
SCREEN_HEIGHT = 640
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("Pytmx Demo")# 加载 .tmx 地图文件
tmx_data = pytmx.load_pygame("demo2.tmx")  # 将 'your_map.tmx' 替换为你的文件路径# player.x = 50
# player.y = 50
player_speed = 3  # 玩家速度
# 设置玩家的初始位置
player = None
# 找到玩家对象(在 Object Layer 中)
for obj in tmx_data.objects:if obj.name == "player":player = objbreakif player is None:raise ValueError("Player object not found in the Object Layer")# 检查某个位置是否有墙体
def check_collision(x, y):# 获取该位置的瓦片 IDdic = Nonetry:x_pos = math.floor(x / tmx_data.tilewidth)y_pos = math.floor(y / tmx_data.tileheight)# print(x, y)print(x_pos, y_pos)dic = tmx_data.get_tile_properties(x_pos, y_pos, layer=1)except Exception as e:pass# print(gid)if dic:return dic['Collidable'] == Trueelse:return False# 创建一个地图渲染函数
def draw_map():for layer in tmx_data.visible_layers:if isinstance(layer, pytmx.TiledTileLayer):if layer.name == 'wall':continuefor x, y, gid in layer:tile = tmx_data.get_tile_image_by_gid(gid)if tile:screen.blit(tile, (x * tmx_data.tilewidth, y * tmx_data.tileheight))# 游戏主循环
running = True
while running:clock = pygame.time.Clock()draw_map()  # 绘制地图for event in pygame.event.get():if event.type == pygame.QUIT:running = False# 处理键盘输入来移动玩家keys = pygame.key.get_pressed()new_x, new_y = player.x, player.yif keys[pygame.K_LEFT]:new_x -= player_speed  # 向左移动if not check_collision(new_x, new_y):player.x = new_xif keys[pygame.K_RIGHT]:new_x += player_speed  # 向右移动if not check_collision(new_x, new_y):player.x = new_xif keys[pygame.K_UP]:new_y -= player_speed  # 向上移动if not check_collision(new_x, new_y):player.y = new_yif keys[pygame.K_DOWN]:new_y += player_speed  # 向下移动if not check_collision(new_x, new_y):player.y = new_y# 限制玩家位置在屏幕内player.x, player.y = limit_position_to_screen(player.x, player.y, 32, 32)pygame.draw.rect(screen, (255, 0, 0), pygame.Rect(player.x, player.y, 32, 32))  # 32x32 是玩家的大小pygame.display.flip()  # 更新显示# 控制帧率clock.tick(30)pygame.quit()
http://www.lryc.cn/news/523792.html

相关文章:

  • Git实用指南:忽略文件、命令别名、版本控制、撤销修改与标签管理
  • wordpress安装完后台无格式解决方法(样式加载不出来)
  • 数据库管理-第285期 Oracle 23ai:深入浅出向量索引(20250117)
  • 日志(elk stack)基础语法学习,零基础学习
  • Mysql InnoDB B+Tree是什么?
  • Java基础(二)
  • 【网络协议】【http】【https】TLS1.3
  • K8S中Pod控制器之Job控制器
  • macOS安装Gradle环境
  • 2024年美赛C题评委文章及O奖论文解读 | AI工具如何影响数学建模?从评委和O奖论文出发-O奖论文做对了什么?
  • LDD3学习9--数据类型和定时器
  • 一文夯实垃圾收集的理论基础
  • OpenWRT Conserver 共享串口服务实现
  • 第12章:Python TDD完善货币加法运算(一)
  • Springboot项目Jackson支持多种接收多种时间格式
  • 两台电脑互PING不通的解决办法
  • No. 34 笔记 | Python知识架构与数据类型相关内容 | 实操
  • 【2024年华为OD机试】 (B卷,100分)- 字符串分割(Java JS PythonC/C++)
  • Pix2Pix :用于图像到图像转换的条件生成对抗网络
  • 基于VSCODE+GDB+GDBSERVER远程单步调试设备篇(可视化界面)
  • CamemBERT:一款出色的法语语言模型
  • 0基础跟德姆(dom)一起学AI 自然语言处理18-解码器部分实现
  • 我的创作纪念日——我与CSDN一起走过的365天
  • C++:bfs解决多源最短路与拓扑排序问题习题
  • 【面试题】JVM部分[2025/1/13 ~ 2025/1/19]
  • 文献综述相关ChatGPT提示词分享
  • Excel 技巧14 - 如何批量删除表格中的空行(★)
  • 图片生成Prompt编写技巧
  • 【STM32-学习笔记-4-】PWM、输入捕获(PWMI)
  • TOSUN同星TsMaster使用入门——3、使用系统变量及c小程序结合panel面板发送报文