QT graphicsView复刻一款类似Inkarnate的跑团地图工具

在这里插入图片描述
在这里插入图片描述
自己倒腾漂亮的地图,像Fantansy Map (http://www.fantasticmaps.com/)用PS做地图教程太难学,于是乎果断放弃了。Inkarnate 是一个很好的选项
inkarnate
在这里插入图片描述

好在inkarnate艺术风格过硬,细节处理很好,十分钟就可以上手

**但是 ** free版本基本就是一个摆设

25美元的年费让我烦恼,虽可以导出图片,不能导出到自己的引擎

在这里插入图片描述
不愿花这笔钱,又想自己倒腾漂亮的地图,能不能用pyqt 实现基本的地图编辑功能,答案是,而且代码量非常少(小于500行)

要求如下:

  • 我要有一个可以自动缩放的大地图
  • 元素可以按照isometric 或者 tile的格式进行正确叠放
  • 界面上的任意sprite item都支持拖动,自定义显示顺序重排
  • 支持任意数量的sprite items
  • sprite item 分组预览等等

Sprite libraries素材按照用途分类
在这里插入图片描述

比如 decor small 包含的一些小部件,已经相当全面,如果自己有好的素材,亦可以自行添加,找这些图片已经要了我的老命了

在这里插入图片描述

sprite item 继承自 ImageGraphicItem,用于加载sprite item图片

class ImageGraphicItem(QGraphicsPixmapItem):
    def __init__(self, filename ="",parent=None):
        super().__init__(parent)
        self.filename = filename
        self.pix = QPixmap(filename)
        self.width = self.pix.width()
        self.height = self.pix.height()
        self.setPixmap(self.pix)  # 设置图元
        self.setFlag(QGraphicsItem.ItemIsSelectable)  # ***设置图元是可以被选择的
        self.setFlag(QGraphicsItem.ItemIsMovable)     # ***设置图元是可以被移动的
        self.setFlag(QGraphicsItem.ItemIsFocusable)

在继承一个Scene(QGraphicsScene),一个View(QGraphicsView)

View 要支持 drag&drop ,需要对dragEnterEvent,dragMoveEvent,dropEvent三个函数进行override

 def dragEnterEvent(self, event):
        if event.mimeData().hasFormat(
            "application/x-qabstractitemmodeldatalist"
        ):
            event.acceptProposedAction()

    def dragMoveEvent(self, event):
        if event.mimeData().hasFormat(
            "application/x-qabstractitemmodeldatalist"
        ):
            event.acceptProposedAction()

    def dropEvent(self, event):
        sp = self.mapToScene(event.pos())
        dummy_model = QStandardItemModel()
        dummy_model.dropMimeData(
            event.mimeData(), event.dropAction(), 0, 0, QModelIndex()
        )
        for r in range(dummy_model.rowCount()):
            for c in range(dummy_model.columnCount()):
                ix = dummy_model.index(r,c)
                filename = ix.data()
                item = ImageGraphicItem(filename)
                item.setPos(sp)
                self.scene().addItem(item)

        self.update()

界面如下
在这里插入图片描述

操作说明:

从tiles中加载sprite item库,
右键:移动sprite item
中键:移动画布
鼠标滚轮:缩放画布
菜单里导入/导出

出一张跑团地图,可以素材是黑白的,效果不太亮眼,不过一切都是free的
prg map

说明
为了能运行本案例,请自行安装python环境 和相关依赖包,具体配置和安装在本文中不涉及也无需涉及,本案例不支大部分智能设备
算法未经严格优化,只为了说明算法的使用方法
本案例应用于非严肃领域,数值结果和算法探讨请@我,如需转载请注明

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值