Tiled自动化与脚本扩展能力

Tiled自动化与脚本扩展能力

【免费下载链接】tiled Flexible level editor 【免费下载链接】tiled 项目地址: https://gitcode.com/gh_mirrors/ti/tiled

Tiled提供了强大的自动化与脚本扩展能力,通过自动映射规则、JavaScript脚本API和Python插件系统,开发者可以大幅提升地图编辑效率。自动映射功能允许根据预定义规则自动放置或替换图块,特别适用于复杂地形边界和批量处理。JavaScript API支持创建自定义动作、工具和地图格式,而Python插件系统则提供了更深层次的扩展能力,支持自定义地图和图块集格式。命令行工具进一步增强了批量处理能力,使得Tiled能够完美集成到现代游戏开发工作流中。

自动映射(AutoMapping)规则配置与应用

Tiled的自动映射功能是地图编辑中的强大工具,它能够根据预定义的规则自动放置或替换图块。这一功能特别适用于创建复杂的地形边界、随机化图块分布以及批量处理重复性工作。通过精心设计的规则配置,开发者可以大幅提升地图制作效率。

规则文件结构与配置

自动映射的核心在于规则文件的组织。一个典型的自动映射项目包含以下结构:

project/
├── maps/
│   ├── level1.tmx
│   └── level2.tmx
├── rules.txt
└── automap_rules/
    ├── rule_cliffs.tmx
    ├── rule_transitions.tmx
    └── rule_objects.tmx

rules.txt 文件是指定规则映射的主要配置文件:

# 注释以 # 或 // 开头
[level1*]           # 仅对 level1 相关地图生效
./automap_rules/rule_cliffs.tmx
./automap_rules/rule_transitions.tmx

[level2*]           # 仅对 level2 相关地图生效  
./automap_rules/rule_objects.tmx

# 全局规则(对所有地图生效)
./automap_rules/common_rules.tmx

输入层配置详解

输入层定义了自动映射要寻找的模式。命名约定遵循特定格式:

层类型命名格式说明
标准输入input_目标层名匹配目标层上的特定图块
否定输入inputnot_目标层名匹配目标层上非指定的图块
带索引输入input1_目标层名允许同一规则有多个输入变体

输入层配置示例:

mermaid

输出层配置策略

输出层定义了匹配成功时要应用的内容。输出层支持随机化和概率控制:

输出类型命名格式概率控制说明
固定输出output_目标层名总是输出相同内容
随机输出output1_目标层名
output2_目标层名
Probability属性随机选择输出变体
概率输出output_目标层名Probability=0.3控制输出频率

输出概率配置示例:

<!-- 在输出层属性中设置概率 -->
<properties>
    <property name="Probability" value="0.2"/>  <!-- 20% 出现概率 -->
</properties>

特殊匹配图块的使用

Tiled提供了内置的特殊匹配图块来处理复杂场景:

特殊图块匹配类型用途说明
Empty空单元格匹配或创建空图块
Ignore忽略连接不连续区域
NonEmpty非空单元格匹配任何非空图块
Other不同图块匹配与当前规则不同的图块
Negate否定条件局部否定匹配条件

mermaid

地图级属性配置

规则映射支持多种地图级属性来调整自动映射行为:

<properties>
    <property name="DeleteTiles" value="true"/>      <!-- 先删除再应用 -->
    <property name="AutomappingRadius" value="2"/>   <!-- 映射半径 -->
    <property name="MatchOutsideMap" value="true"/>  <!-- 边界外匹配 -->
    <property name="MatchInOrder" value="true"/>     <!-- 顺序匹配 -->
</properties>

规则选项对象配置

通过 rule_options 对象层可以为单个规则设置特定参数:

<!-- 在 rule_options 层中的矩形对象 -->
<object id="1" x="48" y="48" width="24" height="24">
    <properties>
        <property name="ModX" value="2"/>           <!-- 每2个X单元格应用一次 -->
        <property name="ModY" value="2"/>           <!-- 每2个Y单元格应用一次 -->
        <property name="Probability" value="0.7"/>  <!-- 70% 应用概率 -->
        <property name="NoOverlappingOutput" value="true"/> <!-- 禁止输出重叠 -->
    </properties>
</object>

实际应用案例:悬崖边缘自动化

以下是一个完整的悬崖边缘自动映射规则示例:

<!-- rule_cliffs.tmx -->
<map version="1.0" orientation="orthogonal" width="5" height="5">
    <properties>
        <property name="DeleteTiles" value="false"/>
    </properties>
    
    <!-- 输入层:寻找悬崖顶部边缘 -->
    <layer name="input_Cliff" width="5" height="5">
        <data encoding="csv">
            0,0,0,0,0,
            0,1,1,1,0,  <!-- 悬崖顶部图块 -->
            0,1,0,1,0,
            0,1,1,1,0,
            0,0,0,0,0
        </data>
    </layer>
    
    <!-- 输出层:放置悬崖侧面图块 -->
    <layer name="output_Cliff" width="5" height="5">
        <data encoding="csv">
            0,0,0,0,0,
            0,0,0,0,0,
            0,2,0,3,0,  <!-- 悬崖侧面图块 -->
            0,0,0,0,0,
            0,0,0,0,0
        </data>
    </layer>
    
    <!-- 规则选项:控制应用频率 -->
    <objectgroup name="rule_options">
        <object id="1" x="72" y="72" width="24" height="24">
            <properties>
                <property name="Probability" value="1.0"/>
            </properties>
        </object>
    </objectgroup>
</map>

高级配置技巧

  1. 多层联合匹配:使用多个输入层组合复杂条件
  2. 条件否定:通过 inputnot 层排除特定图块
  3. 输出优先级:通过输出索引控制渲染顺序
  4. 边界处理:利用 MatchOutsideMap 处理地图边界情况
  5. 性能优化:合理设置 AutomappingRadius 减少计算量

通过精心设计的自动映射规则,开发者可以创建出高度可维护和可扩展的地图生成系统,大幅减少手动编辑工作量,同时确保地图元素的一致性和正确性。

JavaScript脚本扩展与API接口详解

Tiled编辑器提供了强大的JavaScript脚本扩展能力,允许开发者通过编写脚本来自定义地图格式、创建工具、注册动作以及实现自动化工作流。本节将深入探讨Tiled的JavaScript API接口,帮助开发者充分利用这一强大的扩展机制。

核心API模块结构

Tiled的JavaScript API采用模块化设计,通过全局对象tiled提供所有核心功能。以下是API的主要模块结构:

mermaid

注册自定义动作

通过tiled.registerAction方法可以注册自定义动作,这些动作会出现在Tiled的菜单和工具栏中:

tiled.registerAction('CustomAction', function(action) {
    action.text = "自定义动作";
    action.tooltip = "执行自定义功能";
    action.icon = ":/images/icon.png";
    action.checkable = false;
    
    action.triggered.connect(function() {
        // 获取当前活动文档
        var document = tiled.activeAsset;
        if (!document || !document.isMap) {
            tiled.alert("请先打开一个地图文档");
            return;
        }
        
        // 执行自定义逻辑
        processMap(document);
    });
});

function processMap(map) {
    // 遍历所有图层
    for (var i = 0; i < map.layerCount; ++i) {
        var layer = map.layerAt(i);
        if (layer.isTileLayer) {
            processTileLayer(layer);
        }
    }
    
    tiled.log("地图处理完成");
}

创建自定义工具

Tiled允许开发者创建自定义绘图和编辑工具,通过tiled.registerTool方法实现:

tiled.registerTool('CustomBrushTool', {
    name: "自定义笔刷工具",
    icon: ":/images/brush.png",
    
    mousePressed: function(button, x, y, modifiers) {
        if (button !== Qt.LeftButton) return;
        
        var map = tiled.activeAsset;
        if (!map || !map.isMap) return;
        
        var currentLayer = map.currentLayer;
        if (!currentLayer || !currentLayer.isTileLayer) return;
        
        this.startDrawing(x, y);
    },
    
    mouseMoved: function(x, y, modifiers) {
        if (!this.drawing) return;
        
        this.continueDrawing(x, y);
    },
    
    mouseReleased: function(button, x, y, modifiers) {
        if (button !== Qt.LeftButton) return;
        
        this.finishDrawing();
    },
    
    startDrawing: function(x, y) {
        this.drawing = true;
        this.lastX = x;
        this.lastY = y;
        this.affectedRegion = tiled.region();
    },
    
    continueDrawing: function(x, y) {
        var map = tiled.activeAsset;
        var layer = map.currentLayer;
        
        // 实现笔刷绘制逻辑
        var tileX = Math.floor(x / map.tileWidth);
        var tileY = Math.floor(y / map.tileHeight);
        
        if (this.isValidPosition(tileX, tileY)) {
            this.drawTile(layer, tileX, tileY);
            this.affectedRegion.add(Qt.rect(tileX, tileY, 1, 1));
        }
        
        this.lastX = x;
        this.lastY = y;
    },
    
    finishDrawing: function() {
        this.drawing = false;
        tiled.log(`绘制完成,影响了 ${this.affectedRegion.rects.length} 个区域`);
    }
});

自定义地图格式支持

通过实现自定义地图格式,可以扩展Tiled支持的游戏引擎或文件格式:

tiled.registerMapFormat("CustomFormat", {
    name: "自定义地图格式",
    extension: "custom",
    
    read: function(fileName) {
        try {
            var file = tiled.readFile(fileName);
            var data = JSON.parse(file);
            
            // 解析自定义格式数据
            var map = new tiled.Map();
            map.width = data.width;
            map.height = data.height;
            map.tileWidth = data.tileSize;
            map.tileHeight = data.tileSize;
            
            // 创建图层
            var tileLayer = new tiled.TileLayer();
            tileLayer.name = "Main Layer";
            
            // 填充图层数据
            for (var y = 0; y < data.height; y++) {
                for (var x = 0; x < data.width; x++) {
                    var tileId = data.tiles[y * data.width + x];
                    if (tileId > 0) {
                        tileLayer.setTile(x, y, tileId);
                    }
                }
            }
            
            map.addLayer(tileLayer);
            return map;
            
        } catch (error) {
            tiled.alert("读取文件失败: " + error.message);
            return null;
        }
    },
    
    write: function(map, fileName) {
        try {
            var output = {
                width: map.width,
                height: map.height,
                tileSize: map.tileWidth,
                tiles: []
            };
            
            // 获取第一个瓦片图层
            var tileLayer = null;
            for (var i = 0; i < map.layerCount; i++) {
                var layer = map.layerAt(i);
                if (layer.isTileLayer) {
                    tileLayer = layer;
                    break;
                }
            }
            
            if (!tileLayer) {
                throw new Error("地图中没有瓦片图层");
            }
            
            // 生成瓦片数据
            for (var y = 0; y < map.height; y++) {
                for (var x = 0; x < map.width; x++) {
                    var tile = tileLayer.tileAt(x, y);
                    output.tiles.push(tile ? tile.id : 0);
                }
            }
            
            tiled.writeFile(fileName, JSON.stringify(output, null, 2));
            return true;
            
        } catch (error) {
            tiled.alert("写入文件失败: " + error.message);
            return false;
        }
    }
});

事件信号系统

Tiled提供了丰富的事件信号系统,允许脚本响应编辑器状态变化:

// 连接文档相关信号
tiled.documentCreated.connect(function(document) {
    tiled.log("文档创建: " + document.fileName);
});

tiled.documentSaved.connect(function(document) {
    tiled.log("文档保存: " + document.fileName);
});

tiled.documentClosed.connect(function(document) {
    tiled.log("文档关闭: " + document.fileName);
});

// 连接当前文档变化信号
tiled.activeAssetChanged.connect(function() {
    var asset = tiled.activeAsset;
    if (asset) {
        tiled.log("激活资源: " + (asset.fileName || "未保存"));
    }
});

// 连接选择变化信号
tiled.selectedAreaChanged.connect(function() {
    var region = tiled.selectedArea;
    if (region) {
        tiled.log(`选择区域变化: ${region.boundingRect.width}x${region.boundingRect.height}`);
    }
});

实用工具函数

Tiled API提供了多个实用工具函数来简化开发:

// 文件操作工具
var filePath = tiled.promptOpenFile("选择地图文件", "Tiled Maps (*.tmx *.json)");
if (filePath) {
    var map = tiled.open(filePath);
    tiled.log("已打开地图: " + map.width + "x" + map.height);
}

// 属性操作工具
var properties = {
    difficulty: "hard",
    author: "开发者",
    version: 1.0
};

tiled.setProperty("customProperty", properties);

// 调试工具
tiled.log("信息级别日志");
tiled.warning("警告级别日志");
tiled.error("错误级别日志");

// 进度指示器
tiled.progress("处理中...", 0);
for (var i = 0; i < 100; i++) {
    processItem(i);
    tiled.progress("处理中...", i / 100);
}
tiled.progress("", -1); // 隐藏进度条

扩展菜单系统

可以通过脚本扩展Tiled的菜单系统,添加自定义菜单项:

// 扩展文件菜单
tiled.extendMenu("File", [
    { separator: true },
    { action: "CustomAction", before: "Exit" }
]);

// 扩展编辑菜单
tiled.extendMenu("Edit", [
    { separator: true },
    { action: "CustomToolAction" }
]);

// 创建完整的新菜单
tiled.registerAction("MenuAction1", function(action) {
    action.text = "菜单项1";
    action.triggered.connect(function() {
        tiled.log("菜单项1被点击");
    });
});

tiled.registerAction("MenuAction2", function(action) {
    action.text = "菜单项2";
    action.triggered.connect(function() {
        tiled.log("菜单项2被点击");
    });
});

tiled.extendMenu("CustomMenu", [
    { action: "MenuAction1" },
    { action: "MenuAction2" },
    { separator: true }
]);

错误处理与调试

健壮的脚本需要良好的错误处理机制:

try {
    // 可能出错的代码
    var result = riskyOperation();
    tiled.log("操作成功: " + result);
    
} catch (error) {
    tiled.error("操作失败: " + error.message);
    
    // 显示详细错误信息
    tiled.alert(
        "脚本执行错误\n\n" +
        "消息: " + error.message + "\n" +
        "文件: " + error.fileName + "\n" +
        "行号: " + error.lineNumber
    );
}

// 使用断言进行调试
function assert(condition, message) {
    if (!condition) {
        throw new Error("断言失败: " + (message || ""));
    }
}

// 使用日志级别控制
var DEBUG = true;

function debugLog(message) {
    if (DEBUG) {
        tiled.log("[DEBUG] " + message);
    }
}

通过掌握这些JavaScript API接口,开发者可以创建强大的Tiled扩展,自动化重复任务,集成自定义工具,以及支持特定的游戏引擎格式。Tiled的脚本系统为地图编辑工作流提供了极大的灵活性和可扩展性。

Python插件开发与自定义工具创建

Tiled的Python插件系统为开发者提供了强大的扩展能力,允许通过Python脚本创建自定义地图格式、图块集格式以及各种自动化工具。Python插件在Tiled中扮演着桥梁角色,连接了Tiled的核心功能与开发者的自定义需求。

Python插件架构概述

Tiled的Python插件系统基于PyBindGen构建,提供了完整的C++到Python的绑定机制。整个架构可以分为三个主要层次:

mermaid

插件开发基础

要开发Tiled Python插件,首先需要创建一个继承自tiled.Plugintiled.TilesetPlugin的类。插件脚本必须放置在~/.tiled目录中,Tiled会自动监视该目录的变化并重新加载插件。

基本插件结构
from tiled import *

class CustomMapFormat(Plugin):
    @classmethod
    def nameFilter(cls):
        return "Custom Format (*.custom)"
    
    @classmethod
    def shortName(cls):
        return "custom"
    
    @classmethod
    def write(cls, tileMap, fileName):
        # 实现地图导出逻辑
        with open(fileName, 'w') as f:
            # 处理地图数据
            pass
        return True
    
    @classmethod
    def read(cls, fileName):
        # 实现地图导入逻辑
        map = Map(Map.Orthogonal, 100, 100, 32, 32)
        return map

核心API功能

Tiled Python API提供了丰富的类和方法来操作地图数据:

地图操作类
类名功能描述主要方法
Map地图容器layerCount(), addLayer(), addTileset()
TileLayer图块层width(), height(), cellAt(), setCell()
ObjectGroup对象组addObject(), objectCount(), objectAt()
Tileset图块集create(), tileAt(), loadFromImage()
Tile单个图块id(), image(), properties()
实用函数
# 图层类型检查函数
isTileLayerAt(map, index)      # 检查是否为图块层
isObjectGroupAt(map, index)    # 检查是否为对象组
isImageLayerAt(map, index)     # 检查是否为图像层
isGroupLayerAt(map, index)     # 检查是否为组层

# 图层获取函数
tileLayerAt(map, index)        # 获取图块层
objectGroupAt(map, index)      # 获取对象组
imageLayerAt(map, index)       # 获取图像层
groupLayerAt(map, index)       # 获取组层

高级插件开发技巧

1. 处理复杂地图结构

对于包含多层和组的地图,需要递归处理:

def process_layer(layer, parent_name=""):
    layer_name = f"{parent_name}/{layer.name()}" if parent_name else layer.name()
    
    if isinstance(layer, TileLayer):
        process_tile_layer(layer, layer_name)
    elif isinstance(layer, ObjectGroup):
        process_object_group(layer, layer_name)
    elif isinstance(layer, GroupLayer):
        for i in range(layer.layerCount()):
            process_layer(layer.layerAt(i), layer_name)

# 处理整个地图
for i in range(map.layerCount()):
    process_layer(map.layerAt(i))
2. 自定义属性处理

Tiled支持为地图、图层、图块和对象添加自定义属性:

def export_properties(obj, file_handle):
    properties = obj.properties()
    for key in properties.keys():
        value = obj.propertyAsString(key)
        prop_type = obj.propertyType(key)
        
        # 根据类型进行不同的处理
        if prop_type == "string":
            file_handle.write(f"{key}=\"{value}\"\n")
        elif prop_type == "int":
            file_handle.write(f"{key}={int(value)}\n")
        elif prop_type == "bool":
            file_handle.write(f"{key}={value.lower()}\n")
3. 图块集管理

处理外部和嵌入式图块集:

def handle_tilesets(map, export_dir):
    for i in range(map.tilesetCount()):
        tileset = map.tilesetAt(i).data()
        
        if tileset.isExternal():
            # 外部图块集,只需记录路径
            external_path = tileset.fileName()
            # 处理外部图块集引用
        else:
            # 嵌入式图块集,需要导出图像
            image = tileset.image()
            if not image.isNull():
                image_path = f"{export_dir}/tileset_{i}.png"
                image.save(image_path)

实际案例:创建自定义导出格式

以下是一个完整的自定义导出插件示例,将地图导出为简单的CSV格式:

from tiled import *

class CSVExport(Plugin):
    @classmethod
    def nameFilter(cls):
        return "CSV Map Format (*.csv)"
    
    @classmethod
    def shortName(cls):
        return "csv"
    
    @classmethod
    def write(cls, tileMap, fileName):
        try:
            with open(fileName, 'w', encoding='utf-8') as file:
                # 写入地图基本信息
                file.write(f"width,{tileMap.width()}\n")
                file.write(f"height,{tileMap.height()}\n")
                file.write(f"tilewidth,{tileMap.tileWidth()}\n")
                file.write(f"tileheight,{tileMap.tileHeight()}\n")
                file.write("\n")
                
                # 处理每个图层
                for layer_index in range(tileMap.layerCount()):
                    if isTileLayerAt(tileMap, layer_index):
                        layer = tileLayerAt(tileMap, layer_index)
                        file.write(f"[Layer: {layer.name()}]\n")
                        
                        # 导出图层数据
                        for y in range(layer.height()):
                            row = []
                            for x in range(layer.width()):
                                cell = layer.cellAt(x, y)
                                if not cell.isEmpty() and cell.tile():
                                    row.append(str(cell.tile().id()))
                                else:
                                    row.append("-1")
                            file.write(",".join(row) + "\n")
                        file.write("\n")
            
            return True
        except Exception as e:
            print(f"Export error: {str(e)}")
            return False

调试与错误处理

Python插件在运行时的输出会显示在Tiled的控制台中(可通过View > Views and Toolbars > Console启用)。建议在开发时添加详细的日志输出:

import traceback

class DebuggablePlugin(Plugin):
    @classmethod
    def write(cls, tileMap, fileName):
        try:
            # 插件逻辑
            print(f"开始导出地图: {fileName}")
            print(f"地图尺寸: {tileMap.width()}x{tileMap.height()}")
            print(f"图层数量: {tileMap.layerCount()}")
            
            # 实际导出代码
            return True
            
        except Exception as e:
            print(f"导出过程中发生错误: {str(e)}")
            print(traceback.format_exc())
            return False

性能优化建议

处理大型地图时,需要注意性能优化:

  1. 批量操作:尽量减少Python和C++之间的调用次数
  2. 内存管理:及时释放不再需要的对象引用
  3. 缓存重用:对频繁访问的数据进行缓存
  4. 流式处理:对于大型地图,采用流式处理而非一次性加载
# 优化后的图层处理示例
def optimized_layer_export(layer, file_handle):
    height = layer.height()
    width = layer.width()
    
    # 预分配缓冲区
    buffer = []
    
    for y in range(height):
        row = []
        for x in range(width):
            cell = layer.cellAt(x, y)
            if not cell.isEmpty():
                row.append(str(cell.tile().id()))
            else:
                row.append("-1")
        buffer.append(",".join(row))
    
    # 一次性写入所有行
    file_handle.write("\n".join(buffer))

插件部署与分发

开发完成的Python插件可以通过以下方式分发:

  1. 直接复制:将.py文件复制到用户的~/.tiled目录
  2. 打包分发:创建包含多个相关脚本的压缩包
  3. 版本管理:使用Git等工具管理插件版本

建议为插件添加适当的文档头:

"""
Custom CSV Export Plugin for Tiled
版本: 1.0.0
作者: Your Name
描述: 将Tiled地图导出为CSV格式,支持多层导出和自定义属性

使用方法:
1. 将本文件放置于 ~/.tiled 目录
2. 在Tiled中启用Python插件(Edit > Preferences > Plugins)
3. 使用 File > Export 选择 CSV Map Format

依赖: 无
许可证: MIT
"""

通过Python插件系统,开发者可以极大地扩展Tiled的功能,创建适合特定项目需求的定制化工具和工作流程。这种扩展能力使得Tiled不仅是一个地图编辑器,更成为一个可高度定制的地图处理平台。

命令行工具与批量处理功能

Tiled提供了一套强大的命令行工具,使得地图编辑工作能够实现自动化处理和批量操作,极大地提升了开发效率。这些工具不仅支持基本的文件转换和导出,还提供了丰富的参数选项来满足各种复杂的处理需求。

核心命令行工具

Tiled主要包含三个命令行工具,每个工具都有其特定的用途:

工具名称主要功能适用场景
tiled主程序的命令行接口批量导出、脚本执行、项目管理
tmxrasterizer地图栅格化工具生成地图预览图、缩略图、小地图
tmxviewer地图查看器快速预览地图文件

tiled 主程序命令行功能

主程序提供了丰富的命令行选项,支持批量导出和自动化处理:

# 显示版本信息
tiled --version

# 导出地图文件
tiled --export-map [格式] 源文件.tmx 目标文件

# 导出图块集文件  
tiled --export-tileset [格式] 源文件.tsx 目标文件

# 查看支持的导出格式
tiled --export-formats

# 执行JavaScript脚本
tiled --evaluate script.js

# 加载项目文件
tiled --project myproject.tiled-project
批量导出示例
# 批量导出所有TMX文件为JSON格式
for file in *.tmx; do
    tiled --export-map json "$file" "${file%.tmx}.json"
done

# 批量导出图块集为PNG格式
for file in *.tsx; do
    tiled --export-tileset json "$file" "${file%.tsx}.json"
done

tmxrasterizer 栅格化工具

tmxrasterizer 是一个专门用于将Tiled地图转换为图像文件的工具,支持多种输出选项:

# 基本用法
tmxrasterizer input.tmx output.png

# 指定缩放比例
tmxrasterizer -s 2.0 input.tmx output.png

# 指定输出尺寸
tmxrasterizer --size 512 input.tmx output.png

# 忽略图层可见性设置
tmxrasterizer --ignore-visibility input.tmx output.png

# 隐藏特定图层
tmxrasterizer --hide-layer collision --hide-layer debug input.tmx output.png

# 导出动画地图的多帧
tmxrasterizer --frames 10 --frame-duration 100 input.tmx output_#.png
高级栅格化选项

mermaid

tmxviewer 地图查看器

tmxviewer 提供了一个轻量级的地图查看解决方案:

# 查看单个地图文件
tmxviewer map.tmx

# 查看多个地图文件(支持切换)
tmxviewer map1.tmx map2.tmx map3.tmx

脚本自动化集成

Tiled支持通过命令行执行JavaScript脚本,实现复杂的自动化任务:

// example.js - 批量处理脚本
var maps = tiled.open("level1.tmx", "level2.tmx", "level3.tmx");

maps.forEach(function(map) {
    // 为每个地图添加自定义属性
    map.setProperty("processed", true);
    map.setProperty("processDate", new Date().toISOString());
    
    // 保存修改
    tiled.save(map, map.fileName);
});

tiled.alert("批量处理完成!");

执行脚本:

tiled --evaluate example.js

批量处理工作流示例

以下是一个完整的批量处理工作流,展示了如何结合使用这些工具:

mermaid

实际应用场景

游戏构建流水线集成
#!/bin/bash
# build_pipeline.sh - 游戏构建自动化脚本

# 导出所有地图为JSON格式
echo "导出地图文件..."
tiled --export-map json maps/*.tmx build/maps/

# 导出图块集
echo "导出图块集..."
tiled --export-tileset json tilesets/*.tsx build/tilesets/

# 生成地图预览图
echo "生成预览图..."
for map in build/maps/*.json; do
    base=$(basename "$map" .json)
    tmxrasterizer --size 256 "maps/${base}.tmx" "previews/${base}.png"
done

echo "构建完成!"
持续集成环境配置

在CI/CD环境中,可以使用这些命令行工具来自动验证地图文件的正确性并生成必要的资源文件。

# CI配置示例
- name: Validate Tiled Maps
  run: |
    # 检查地图文件是否能正常加载
    for map in $(find . -name "*.tmx"); do
        tiled --quit "$map" || exit 1
    done
    
    # 生成测试用的预览图
    tmxrasterizer --size 128 test_map.tmx test_preview.png

性能优化技巧

对于大量地图文件的处理,可以采用并行处理来提升效率:

# 使用GNU Parallel进行并行处理
parallel -j 4 tiled --export-map json {} build/maps/{.}.json ::: maps/*.tmx

# 并行生成预览图
parallel -j 4 tmxrasterizer --size 256 {} previews/{.}.png ::: maps/*.tmx

错误处理与日志记录

命令行工具提供了详细的错误信息和日志输出,便于调试和自动化处理:

# 重定向输出到日志文件
tiled --export-map json input.tmx output.json 2>> error.log

# 检查导出是否成功
if tiled --export-map json "$file" "${file%.tmx}.json"; then
    echo "成功导出: $file"
else
    echo "导出失败: $file" >&2
    exit 1
fi

通过这些命令行工具,Tiled能够完美地集成到现代游戏开发工作流中,实现地图资源的自动化处理、批量转换和持续集成,显著提升开发效率和代码质量。

总结

Tiled的自动化与脚本扩展能力为地图编辑提供了极大的灵活性和效率提升。通过自动映射规则,开发者可以快速创建复杂的地形和边界;JavaScript和Python API允许深度定制编辑器功能,支持自定义工具、格式和自动化工作流;命令行工具则实现了批量处理和持续集成支持。这些功能共同使Tiled不仅是一个强大的地图编辑器,更成为一个可高度定制的地图处理平台,能够适应各种复杂的游戏开发需求和工作流程。

【免费下载链接】tiled Flexible level editor 【免费下载链接】tiled 项目地址: https://gitcode.com/gh_mirrors/ti/tiled

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值