cocos 滑过选中

做扑克牌时碰到的需要按下滑过后选中所滑过的牌,

方法是记录按下的坐标,与滑动中的坐标进行计算,根据坐标,计算选中这两个坐标之间的牌

代码 如下:

cc.Class({
    extends: cc.Component,

    properties: {
        poker: {
            default: null,
            type: cc.Node
        },
        cardMask: {
            default: null,
            type: cc.Prefab
        },
    },

    // // use this for initialization
    onLoad: function () {

        //触摸选择到的牌
        this.touchedCards = [];

        //选中的牌
        this.selectedCards = [];

        this.addTouchEvent();
    },

    start: function () {},

    resetTouchData: function () {

        //触摸选择到的牌
        this.touchedCards = [];

        //选中的牌
        this.selectedCards = [];

    },

    refreshCurPoker: function (porkerCards, isNeedAddEvent = 0) {
        //牌
        this.cards = porkerCards;
        //牌初始位置
        if (this.cards.length > 0)
            this.cardInitY = this.cards[0].y;
        isNeedAddEvent && this.addPokerTouchEvent();
        this.clearTouchedCards();
        console.info(this.cards);
    },

    /**
     * 添加事件
     */
    addTouchEvent: function () {

        //父节点监听touch事件(直接子节点必须注册同样的事件方能触发)
        this.poker.on(cc.Node.EventType.TOUCH_START, function (event) {
            console.log('poker TOUCH_START');

            //牌
            var card = event.target;

            //起始触摸位置(和第一张card一样,相对于poker的位置)
            this.touchStartLocation = this.poker.convertToNodeSpaceAR(event.touch._startPoint);
            console.log('touch start Location:', this.touchStartLocation);
            //计算牌位置
            var index = 0;
            for (var i = 0; i < this.cards.length; i++) {
                var c = this.cards[i];
                if (c.name == card.name) {
                    index = i;
                    break;
                }
            }
            //暂存第一次触摸到的牌
            var touchedCard = {
                index: index,
                card: card
            };
            this.firstTouchedCard = touchedCard;
            //暂存
            this.pushTouchedCards(touchedCard.index, touchedCard.card);

        }, this, true);

        //父节点监听touch事件(直接子节点必须注册同样的事件方能触发)
        this.poker.on(cc.Node.EventType.TOUCH_MOVE, function (event) {
            console.log('poker TOUCH_MOVE');
            //先清除原先触摸到的牌
            this.clearTouchedCards();
            //保存第一张牌
            this.pushTouchedCards(this.firstTouchedCard.index, this.firstTouchedCard.card);
            //触摸点转换为card节点坐标
            var nodeLocation = this.poker.convertToNodeSpaceAR(event.touch._point);
            console.log('touch nodeLocation:', nodeLocation);
            var x = nodeLocation.x;
            var y = nodeLocation.y;

            //找到当前选中的牌
            var currentCard = null;
            for (var i = 0, length = this.cards.length; i < length; i++) {
                var card = this.cards[i];
                var cardX = card.x;
                var cardY = card.y;
                console.log('card x=' + cardX + ',y=' + cardY);


                //某张牌范围包括了鼠标位置,选中此牌与触摸开头的所有牌
                var cardWidth = i == (length - 1) ? card.width : 55;
                var cardHeight = card.height;
                if (cardX <= x && x <= cardX + cardWidth && cardY <= y && y <= cardY + cardHeight) {
                    currentCard = card;

                    //暂存触摸到的牌
                    this.pushTouchedCards(i, card);

                    break;
                }
            }

            //添加开头与此牌直接的所有牌
            var startTouchLocation = this.touchStartLocation;
            for (var i = 0, length = this.cards.length; i < length; i++) {
                var card = this.cards[i];
                var cardX = card.x;
                //框选的范围包括了的牌
                var min, max;
                if (startTouchLocation.x < nodeLocation.x) {
                    min = startTouchLocation.x;
                    max = nodeLocation.x;
                    // cardX = card.x - 70;
                } else {
                    min = nodeLocation.x;
                    max = startTouchLocation.x;
                    cardX = card.x + 55;
                }

                // console.log('min=' + min + ', max=' + max);

                if (min <= cardX && cardX <= max) {
                    //暂存触摸到的牌
                    this.pushTouchedCards(i, card);
                }
            }


        }, this, true);

        //父节点监听touch事件(直接子节点必须注册同样的事件方能触发)
        this.poker.on(cc.Node.EventType.TOUCH_END, function (event) {
            // console.log('poker TOUCH_END');
            this.doSelectCard();
        }, this, true);

        //父节点监听touch事件(直接子节点必须注册同样的事件方能触发)
        this.poker.on(cc.Node.EventType.TOUCH_CANCEL, function (event) {
            // console.log('poker TOUCH_CANCEL');
            this.doSelectCard();
        }, this, true);

        this.addPokerTouchEvent();
    },

    addPokerTouchEvent: function () {
        //给所有的牌注册事件,会自动冒泡到poker节点
        if (!this.cards) return;
        for (var i = 0; i < this.cards.length; i++) {
            var cards = this.cards;
            //闭包传递i值
            (function (i) {
                var card = cards[i];
                card.on(cc.Node.EventType.TOUCH_START, function (event) {
                    // console.log('card TOUCH_START');
                }, card);

                card.on(cc.Node.EventType.TOUCH_MOVE, function (event) {
                    // console.log('card TOUCH_MOVE');
                }, card);

                card.on(cc.Node.EventType.TOUCH_END, function (event) {
                    // console.log('card TOUCH_END');
                }, card);

                card.on(cc.Node.EventType.TOUCH_CANCEL, function (event) {
                    // console.log('card TOUCH_CANCEL');
                }, card);
            })(i)
        }
    },


    /**
     * 暂存触摸到的牌
     */
    pushTouchedCards: function (index, card) {
        var poker = card.getComponent("PrePoker");
        var value = poker.data % 16;
        cc.log("select poker=", value);
        //构造牌对象
        var cardObj = {
            index: index,
            name: poker.data,
            isSelected: card.y == this.cardInitY ? false : true //高度不一样,表示选中
        };

        //防止重复添加
        var existCard = this.touchedCards.find(function (obj) {
            if (obj.name == card.name) {
                return obj;
            } else {
                return null;
            }
        });
        if (!existCard) {
            //添加暂存
            this.touchedCards.push(cardObj);

            //包含提示
            this.addCardMask(card);
        }
    },

    /**
     * 清除原先暂存的触摸到的牌
     */
    clearTouchedCards: function () {
        for (var i = 0; i < this.touchedCards.length; i++) {
            var cardIndex = this.touchedCards[i].index;
            var card = this.cards[cardIndex];
            card.removeChild(card.children[card.childrenCount - 1]);
        }
        this.touchedCards = [];
    },

    /**
     * 选择牌
     */
    doSelectCard: function () {
        this.selectedCards = [];

        console.log(this.touchedCards);

        // //改变牌状态
        // for (var i = 0; i < this.touchedCards.length; i++) {
        //     var cardObj = this.touchedCards[i];
        //     var card = this.cards[cardObj.index];
        //     if (cardObj.isSelected) { //如果是选中改为不选中
        //         card.y = card.y - 30;
        //     } else { //不选中改为选中状态
        //         card.y = card.y + 30;
        //     }
        // }

        this.selectFun && this.selectFun(this.touchedCards);

        //重置
        this.clearTouchedCards();

        //显示选中的牌
        // this.showSelectedCards();
    },

    /**
     * 包含牌遮罩
     */
    addCardMask: function (card) {
        var cardMask = cc.instantiate(this.cardMask);
        cardMask.setPosition(cc.v2(73, 0));
        card.addChild(cardMask);
    },

    /**
     * 显示选中的牌
     */
    showSelectedCards: function () {
        this.selectedCards = [];
        for (var i = 0; i < this.cards.length; i++) {
            var card = this.cards[i];
            var isSelected = card.y == this.cardInitY ? false : true;
            if (isSelected) {
                this.selectedCards.push(card.name);
            }
        }
        //输出
        console.info("selected cards is: " + JSON.stringify(this.selectedCards));
    },


    // called every frame, uncomment this function to activate update callback
    // update: function (dt) {

    // },
});

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值