• cocos2dx for xna实现人物不同方向行走


    首先,在之前的一篇实现动画里已经提过一些内容,所这里就会有一些省略

    创建一个人类精灵的类:human,继承于CCNode,然后在构造函数里预处理一下人物精灵的动画

     public Human()
            {
                mode = CCTextureCache.sharedTextureCache().addImage("Images/Sprite/20011");
                frames = new List<CCSpriteFrame>();
                for (int i = 0; i < 4; i++)
                {
                    for (int j = 0; j < 4; j++)
                    {
                        CCSpriteFrame frame = CCSpriteFrame.frameWithTexture(mode, new CCRect(j * 318 / 4, i * 451 / 4, 318 / 4, 451 / 4));
                        frames.Add(frame);
                    }
                }
                human = CCSprite.spriteWithSpriteFrame(frames[8]);
                human.anchorPoint = new CCPoint(0.5f, 0.5f);
                human.position = ConvertViewPoint(new CCPoint(1, 3));
                addChild(human);
            }

    在这里,因为cocs2d -x for xna也是沿袭OpenGL坐标体系,以左下角为原点。而这里代码的位置是tmx地图上的位置,所以对它进行转化--ConvertViewPoint

    /// <summary>
            /// 将坐标转化为GL坐标
            /// </summary>
            /// <param name="p"></param>
            /// <returns></returns>
            public CCPoint ConvertViewPoint(CCPoint p)
            {
                return CCDirector.sharedDirector().convertToGL(new CCPoint(p.x * 60 + 30, p.y * 60 + 30));
            }

    运行,人物会出现在地图上,如图:

    接下来,添加根据方向实现人物移动

    首先,人物每次前进,都是前进一个地图单位即是前进60像素,这个像素大小跟你地图制作时定义的大小相关。

    所以先进行数据转化:

    View Code
    /// <summary>
            /// 根据方向获取角色移动目的地
            /// </summary>
            /// <param name="Direction"></param>
            public void RunWithDirection(int Direction)
            {
                CCPoint moveByPositon = new CCPoint(0, 0);
                switch (Direction)
                {
                    case 1:
                        moveByPositon = new CCPoint(0, 60);
                        break;
                    case 2:
                        moveByPositon = new CCPoint(0, -60);
                        break;
                    case 3:
                        moveByPositon = new CCPoint(-60, 0);
                        break;
                    case 4:
                        moveByPositon = new CCPoint(60, 0);
                        break;
                }
                //获取移动目的地的point
                targetPoistion = new CCPoint(human.position.x + moveByPositon.x, human.position.y + moveByPositon.y);
                Move(moveByPositon, Direction);
                //查看该移动目的地是否是墙壁
                     }
    View Code
    /// <summary>
            /// 根据方向进行移动
            /// </summary>
            /// <param name="p"></param>
            /// <param name="moveTag"></param>
            void Move(CCPoint p, object moveTag)
            {
                if (isEnemyWalking)
                    return;
                object tag = moveTag;
                isEnemyWalking = true;
                List<CCSpriteFrame> temp = new List<CCSpriteFrame>();
                switch ((int)moveTag)
                {
                    case 1:
                        for (int i = 12; i < 16; i++)
                        {
                            temp.Add(frames[i]);
                        }
                        break;
                    case 2:
                        for (int i = 0; i < 4; i++)
                        {
                            temp.Add(frames[i]);
                        }
                        break;
                    case 3:
                        for (int i = 4; i < 8; i++)
                        {
                            temp.Add(frames[i]);
                        }
                        break;
                    case 4:
                        for (int i = 8; i < 12; i++)
                        {
                            temp.Add(frames[i]);
                        }
                        break;
                }
                CCAnimation ani = new CCAnimation();
                ani.initWithFrames(temp, 0.1f);
                CCAction action = CCSequence.actions(
                    CCSpawn.actions(CCAnimate.actionWithAnimation(ani, false),
                                     CCMoveBy.actionWithDuration(0.28f, p),
                                     CCCallFuncND.actionWithTarget(this, onWalkDone, tag))
                                     );
                human.runAction(action);
            }

    在这里,我们需要执行的动作包括:人物完成行走动画、移动到目的位置、行走结束后人物面向行走方向3个不同的动作。所以,我们需要用到CCSequence(序列)和CCSpawn(同步)
    在CCSequence里是一个Action集合,而在CCSpawn里面也是一个Action集合。

    CCCallFuncND.actionWithTarget(this, onWalkDone, tag),这句代码是一个回调,实现人物面向。

    View Code
     /// <summary>
            /// 移动完成后角色面向
            /// </summary>
            /// <param name="pTarget"></param>
            /// <param name="date"></param>
            void onWalkDone(CCNode pTarget, object date)
            {
                int tag = (int)date;
                isEnemyWalking = false;
                human.setTextureRect(new CCRect(0, 451 / 4 * tag, 318 / 4, 451 / 4));
            }

    人物类的方法在这里算是高一个段落了。

    接下来,在游戏界面添加4个行进按钮:

    View Code
    tmxMap = new Classes.Map();
                human = new Classes.Human();
                addChild(tmxMap);
                addChild(human);
    
                CCMenuItem up = CCMenuItemFont.itemFromString("Up", this, CallBack);
                CCMenuItem down = CCMenuItemFont.itemFromString("Down", this, CallBack);
                CCMenuItem left = CCMenuItemFont.itemFromString("Left", this, CallBack);
                CCMenuItem right = CCMenuItemFont.itemFromString("Right", this, CallBack);
                up.tag = 1;
                down.tag = 2;
                left.tag = 3;
                right.tag = 4;
    
                CCMenu menus = CCMenu.menuWithItems(up, down, left, right);
                menus.alignItemsHorizontallyWithPadding(20);
                menus.position = new CCPoint(300, 400);
                addChild(menus);

    最后在回调函数里调用human类的行走方法就行了:

    void CallBack(CCObject sender)
            {
                CCNode node = (CCNode)sender;
                int tag = node.tag;
                human.RunWithDirection(tag);
            }

    这样运行之后就可以实现人物走动了。

  • 相关阅读:
    秦曾昌人工智能课程---6、Decision Tree Learning
    秦曾昌人工智能课程---5、KNN和朴素贝叶斯
    秦曾昌人工智能课程---4、梯度下降算法
    我和最小二乘法的二三事
    英语影视台词---The Professor
    秦曾昌人工智能课程---3、机器学习中的哲学
    python从入门到大神---1、初始化实例、类属性、方法
    秒懂神经网络---震惊!!!神经网络原来可以这么简单!
    秦曾昌人工智能课程---2、机器学习中的数学基础2
    linuxc_螺纹锁紧pthread_mutex_t
  • 原文地址:https://www.cnblogs.com/dieaz5/p/2951651.html
Copyright © 2020-2023  润新知