zoukankan      html  css  js  c++  java
  • [模拟炉石](三)使用卡牌

    在上一篇中,了解了cocos2d中的collision manage, 它的作用不仅可以实现选中,利用它的碰撞检测可以实现很多其它的东西。

    这一篇要解决的问题就是如何将自己的手牌打出以及让场上的仆从进攻。

    1.给卡牌添加拖拽效果。

        def on_mouse_press(self, x, y, buttons, modifiers):
            self.startDraggin = True
            under_mouse = self.model.collman.objs_touching_point(x, y)
            if len(under_mouse) != 0:
                self.model.selected = under_mouse.pop()
                if hasattr(self.model.selected,"field"):
                    self.model.selected = None
                else:
                    self.model.selected.changeColor()
            buttons = self.model.collmanForButton.objs_touching_point(x, y)
            if len(buttons) != 0:
                print("button is clicked, {}, {}".format(x, y))
                self.nextStep()

    这里使用了.objs_touching_point(x,y)来获得被点击的东西,但是有可能获得了field(Layer), 所以需要进行一个判断。

    后面的button,是我在右下角放了一个结束回合的按钮,但是为了和卡牌分开,我使用了另外一个collision manage。

        def on_mouse_drag(self, x, y, dx, dy, buttons, modifiers):
            if self.startDraggin:
                if self.model.selected:
                    self.oPostion = self.model.selected.position
                    self.model.selected.updatePosition(x, y)

    拖拽的时候更新被选中的卡牌的位置。注意要同时更新卡牌的cshape位置。

    2.为了实现使用卡牌的效果,其实就是当卡牌被拖拽到场上的时候,进行使用。所以将field加入cm中管理,

        def on_mouse_release(self, x, y, button, modifiers):
            #back to orginal position
            if self.model.selected:
                #is card put on field?
                if self.model.collman.they_collide(self.model.selected,self.model.field1Shape):
                    self.putCardToField()
                else:
                    for other in self.model.collman.iter_colliding(self.model.selected):
                        if hasattr(other, "card"):
                            self.attackEnemy(other.card)
                            break
                self.putCardBack()
            self.model.draw_hand()
            self.model.draw_field()
            self.startDraggin = False

    首先they_collide(self.model.selected,self.model.field1Shape)判断是否是和场地碰撞了。如果是就触发self.putCardToField(),这个方法就是使用卡牌。

    3.仆从进攻,接着上面,如果是两个卡牌碰撞了,那么久触发self.attackEnemy(other.card)

    上面就已经基本实现了。

    需要改进的是:

    1.如果卡牌有目标,那么应该不触发拖拽卡牌效果而是拖出一个箭头。

    2.在卡牌碰撞的时候,如果出现了多张卡牌,那么使用目标应该选择最近的一张。

    3.当鼠标拖拽到目标上面的时候,目标应该有响应效果。

    这些就不单独再写成博客了。

  • 相关阅读:
    静态邻接表dijkstra
    最短路径系列【最短路径、哈密顿路等】
    python 给多人发送邮件,且将结果添加为附件
    Excel调换数据位置
    try ... except...,好处是执行失败后,仍然可以继续运行
    制作表头,2种方式
    工资表变工资条,2种方式
    C言语教程第一章: C言语概论 (4)
    从红旗5.0说起——看Linux的内存解决
    红旗Linux桌面4.1文本安装历程图解(二)
  • 原文地址:https://www.cnblogs.com/wenning/p/5104053.html
Copyright © 2011-2022 走看看