这两天重构了一遍代码,整体思路是使用信号输入输出去代替射线物理碰撞的检测,从而用更少的代码实现拖动卡牌等一系列基本操作。事实证明gui_input()确实可以大大减少代码量,在实现上也比较简单易懂。然而实际添加功能时还是遇到了几个问题,这其中最具代表性的是当一张卡牌拖动完毕后,如果鼠标没有移出卡牌的范围,卡牌是处于无法点选的状态的,并且也没有悬停时的高亮放大效果。这一问题是由于鼠标离开信号和卡牌状态重置进行了绑定。诸如这样的问题多如牛毛,由于笔者编程经验不足,实际花费了很长时间才解决这些问题。这时回顾物理检测方式,才终于感到物理检测方式也有其优势。
功能上,添加了简易的卡牌阴影效果,使卡牌在明亮背景下更具立体感;添加了当卡牌随鼠标拖动时轻微向拖动方向摆动的动画效果,可以提供一点拖动交互时的质感。
目前能够想到的优化点和待办有:
- 添加摆动幅度随鼠标拖动幅度改变的机制。鼠标拖动幅度越大,鼠标移动速度越快,卡牌的摆动幅度也更大。目前卡牌的摆动幅度是一个固定值。如果添加上述效果,交互感会更好。
- 添加手牌区和桌面卡位。手牌区实现基本的卡牌容器功能,设置固定的手牌数量上限,手牌展示于用户界面的最下方。桌面卡位可以放置并吸附卡牌,且一经放置,玩家将无法互动取出已放置的卡牌。