请问如何通过卡牌实现精灵的移动?
-
嗯嗯,您的意思我理解了,那请问怎样把不同卡牌的效果融合呢?比如:要出“*2”牌与“↑3”牌,在出牌区把“*2”放在“↑3”左边就无法出牌(无效)把“↑3”放在“*2”前面出牌就能让角色一次向上移动6格
出牌区举例:
-
你的举例
1、是指前一张牌打出时如果是有实际效果的牌,会先生效一次,然后接在它后面打出的如果是算式牌(例如你说的*2牌,可能还有+3牌?),就会把前一张牌的效果进行运算后,再结算一次效果吗?
2、还是指所有可打出的牌打完后,再按序统一结算每张牌的效果?
这两者的结算逻辑有些不一样,不过存在出牌区这个设定的话,为了方便结算出牌的先后顺序,是要用到数组来存放打牌的次序的,甚至是直接存放卡牌效果的作为数组的数据,以便更有序的处理。
-
是第二个意思,先都打出牌再统计所有牌的效果。然后技能牌(例如“*2”)放在基础牌右边就表示对前面基础牌施加技能
-
@繁华4231 那如果打出的牌是:基础牌↑3,技能牌*2,再技能牌*2,会变成↑12吗?
还是说技能牌只会对前一张是基础牌的情况下生效?
如果是后者的话,处理起来比较简单,把出牌的顺序记录到数组后,直接循环数组的内容,如果当前牌为基础牌,则检查后一张牌是什么类型的牌,如果是技能牌,就把技能牌的效果参与到当前牌的计算中,再结算效果,如果是基础牌,则直接结算当前牌的效果。
关于如何混合起来结算这一点其实也有一些难点,但主要是要看你的卡牌构成,如果你的基础卡牌效果都是明确为“功能”+“数字”这样的结构,而技能牌的结构都明确为“运算符”+“数字”这样的结构的话,那通用处理上就可以把基础牌的数字提取出来,然后把它跟技能牌产生运算得到一个最终值,然后结合基础牌的“功能”部分去结算最终效果。不过这个就有点深了,只有你的卡牌类型很多时这么做的便利性才会高,如果卡牌类型不多,那直接把所有可能的组合写在条件里去结算对应的效果反而会更便利一些。
当如果上面说到的结算卡牌效果的规则是前者的话,就会复杂很多,我也没信心能讲得清楚
-
对对,是技能牌只会对前一张是基础牌的情况下生效。那请问在您说的这段程序中,要怎样区分基础牌跟技能牌呢?把它们分在不同的同类组里?
-
@繁华4231 怎么区分基础牌和技能牌这一点,其实可以给同类组加一个实例变量,然后各个具体的卡牌对象中这个变量的初始值分别设置成“基础牌”和“技能牌”就好,这样方便作为一个处理逻辑时要用到的数据存放在数组中,例如我先打出一张基础牌,效果是"↑3",那我可以在出牌数组x轴的尾部,添加两个数据,分别放在y=0的位置和y=1的位置,1个是卡牌效果"↑3",另一个是实例变量的值"基础牌",这两个数据都可以从卡牌中获取,假设我本轮打出的牌是“↑3”、“*2”、“*2”、“↑3”、“*2”
那么数组里的数据排序就是:
↑3|基础牌
*2|技能牌
*2|技能牌
↑3|基础牌
*2|技能牌
这样就可以通过获取每一个x中y=1的值是“基础牌”还是“技能牌”来做出不同的处理,因为每张牌都只是需要判断当前牌和下一张牌,所以如果当前牌是“基础牌”才检查下一张牌,然后下一张牌是“技能牌”才执行融合效果的操作,否则就只执行“基础牌”本身的效果;而如果当前牌是“技能牌”,就直接跳过不处理即可。
-
嗯嗯,前面的我明白了,那么请问如何实现您说的
“通过获取每一个x中y=1的值是“基础牌”还是“技能牌”来做出不同的处理,因为每张牌都只是需要判断当前牌和下一张牌,所以如果当前牌是“基础牌”才检查下一张牌,然后下一张牌是“技能牌”才执行融合效果的操作,否则就只执行“基础牌”本身的效果;而如果当前牌是“技能牌”,就直接跳过不处理即可。”
这一部分的操作呢?
-
@繁华4231
循环 出牌数组.width 次|||
子事件-当出牌数组.at(loopindex,1)等于“基础牌”时|||
子事件的子事件1-当出牌数组.at(loopindex+1,1)等于“基础牌”时|||只执行出牌数组.at(loopindex,0)的效果[实际上没有这样的动作,这里是简写表明结构上这里该做什么内容]
子事件的子事件2-当出牌数组.at(loopindex+1,1)等于“技能牌”时|||执行出牌数组.at(loopindex,0)和出牌数组.at(loopindex+1,0)混合的效果[实际上没有这样的动作,这里是简写表明结构上这里该做什么内容]
差不多就是上面这个结构,当前是技能牌的情况因为是没有可以处理的点的,所以直接不写即可,另外卡牌效果的具体结算我这里没细写,一来是我不太清楚你的数据目前是怎么存放的,是通过卡牌名称直接结算效果,还是像我很上面之前说的那样,分成了“功能”字段和“数值”字段,但建议可以用动作组,把功能的具体结算放到动作组去写,而这里只是调用,这样分成两块的话看起来也好改起来也好,其实都会清晰一点。
-
嗯嗯,大概理解了。我现在的想法是:
在7个出牌格子中,从左至右(数组里是从0-6),按顺序识别,当都是基础牌时则直接按顺序实现所有牌的功能。当识别到技能牌1时则实现技能牌1与其左边的基础牌的组合功能(如↑2*2即向上4格)。
如果一组牌里有几张技能牌1,就需要判断其前面有没有基础牌,如果没有则显示“出牌错误”,如果有就需要识别其前面有多少张基础牌然后相对应的实现其功能。
那,请问要如何实现上述的识别功能呢? (我现在是想着先把识别功能做出来,再做卡牌功能的实现)
-
您好,为了比较容易实现,我改变了一下想法,以下是现在的想法:
在7个出牌格子中,从左至右(数组里是从0-6),按顺序识别,当都是基础牌时则直接按顺序实现所有牌的功能。
当识别到技能牌1时则实现技能牌1与其右边的基础牌的组合功能(如*2(↑2)即向上4格)。如果一组牌里有几张技能牌1,就需要判断其后面有没有基础牌,如果没有则显示“出牌错误”,如果有就需要识别其后面有多少张基础牌然后相对应的实现其功能。
请问这样要如何实现上述的识别功能呢? (我现在是想着先把识别功能做出来,再做卡牌功能的实现)
-
您好,现在我需要用”↑1“让主角精灵向
【当前y坐标+1倍tilemap格子高度】的位置移动
以下是我现在写的程序:
但是这个现在实现的是角色移动后就返回原处 请问要怎样编写相应的程序呢?
-
@繁华4231 是基础牌技能牌还是技能牌基础牌,这两种顺序的结算规则差别不大的,都是判断当前这一卡牌和后一个卡牌的关系,所以思路不变,如果是当前是技能牌,然后后面没有基础牌时,就判断为出牌错误,那在之前的给你的基础结构上改动一下就行了,下面我按你的意思把它换成 先技能牌后基础牌这样的组合方式(其实就是检测loopindex+1改成loopindex-1的情况而已,没大的改动,这里主要是加多一个判断是否出牌失误)
这里加一个局部变量-是否能出牌=1
循环 出牌数组.width 次|||
子事件-当出牌数组.at(loopindex,1)等于“技能牌”时|||
子事件的子事件1-当出牌数组.at(loopindex+1,1)等于“技能牌”时|||说明不符合出牌规则,把是否能出牌设置为0,表示之后不去结算效果
当是否能出牌等于1时(符合出牌规则)
子事件-循环 出牌数组.width 次|||
子事件的子事件-当出牌数组.at(loopindex,1)等于“基础牌”时|||
子事件的子事件的子事件1-当出牌数组.at(loopindex-1,1)等于“基础牌”时|||只执行出牌数组.at(loopindex,0)的效果[实际上没有这样的动作,这里是简写表明结构上这里该做什么内容]
子事件的子事件的子事件2-当出牌数组.at(loopindex-1,1)等于“技能牌”时|||执行出牌数组.at(loopindex,0)和出牌数组.at(loopindex+1,0)混合的效果[实际上没有这样的动作,这里是简写表明结构上这里该做什么内容]
当是否能出牌等于0时(不符合出牌规则)|||结算出牌不符合规则的情况[实际上没有这样的动作,这里是简写表明结构上这里该做什么内容]
至于你提到的移动问题,你截图没成功放上来,所以我啥也看不到,但从结果描述大概能猜出你是用网格移动自带的移动动作以外的能力或者动作,去执行这个移动效果的,对于网格移动能力来说,是无效移动,因为没有改变网格移动能力的目标格子,目标格子依旧停留在原地,所以人物会跑回去,这是网格移动能力的特点——按网格移动的方式,不断移动到最终的目标格子,这个目标格子只能通过自带的键盘操作控制和该能力的移动动作来改变。
-
嗯嗯,您好,现在我弄了一个”基础牌“的动作组,请问这个之后要怎样设置让卡牌的功能为控制角色上下左右移动呢?
以下是我现在写的程序
但是现在实现的效果却不是理想的效果,请问这一块的程序,要怎么编写呢?
-
@繁华4231 你这个事件写得有点微妙 ,出牌库是数组,应该用不上遍历实例,整个事件应该基本上出不来什么效果,具体事件要怎么写还真不太好直接说明,需要了解你希望用什么能力或动作来控制人物移动,需要了解你目前把数组处理到什么程度了,还需要了解你对数组的理解程度,毕竟不同方法的难易度、工作量和理解门槛等都不太一样。