cocos2d-js 开发基础练习代码(1)——熟悉场景加载,精灵,动画使用等


cocos2d-js 开发基础练习代码(1)


个人入门练习敲代码例子:GameKernelScene.js 功能是加载个场景 layer界面随机添加些sprite从上往下掉落,超出屏幕则删除

代码涵盖内容包括:cocos2d-js场景的创建,layer的创建,sprite的创建,动画的使用,定时器的使用,以及JavaScript语法基础,对象的使用,方法的调用,数组Array的元素两种删除使用,Array添加自定义方法的方法,添加对象成员属性等。

新手一枚刚开始从c++转js,主要为了方便以后熟悉查阅,基本都是很基础的框架使用练习和js语法基础练习,看了一目了然,讲不出什么技术来,不懂欢迎评论交流

加载GameKernelScene.js方法,在入口cocos2d-js 工程下的main.js中添加启动代码:

 //load resources
 cc.LoaderScene.preload(images_res, function () {
     cc.director.runScene(new GameKernelScene());
 }, this);

下章练习敲:使用事件管理器创建用户交互以及cocos精灵帧动画的js使用


/* 添加Array自定义删除方法 */
Array.prototype.DeleteByIdx = function(n) {
    /* n表示索引第几项,索引从0开始计算 */
    /* prototype为对象原型,注意这里为对象增加自定义方法的方法,属于JavaScript语法 */

    if(n<0)
        return this;
    else
        return this.slice(0,n).concat(this.slice(n+1,this.length));

    /*  concat 方法:返回一个新数组,这个新数组是由两个或更多数组组合而成的。这里
        就是返回this.slice(0,n)+this.slice(n+1,this.length)组成的新数组,这中间,刚好
        去掉了被删除的第n项

        slice方法: 返回一个数组的一段,两个参数,分别指定开始和结束的位置。
    */
}

var GameKernelLayer = cc.Layer.extend({
    // members
    bgSprite:null,
    SushiSpritesMgr:null,
    ctor:function () {
        // 1. super init first
        this._super();

        // init vars 
        //不使用自定义删除方法的Array初始化
        //this.SushiSpritesMgr = [];

        //使用自定义删除方法的Array初始化
        this.SushiSpritesMgr = new Array();      

        // 2. add your contents

        var size = cc.winSize;

        // add btns
        var closeItem = new cc.MenuItemImage(
            images_res.CloseNormal_png,
            images_res.CloseSelected_png,
            function () {
                cc.log("Z.x: Menu is clicked!");
            },this);

        closeItem.attr({
            x:size.width - 20,
            y:20,
            anchorX:0.5,
            anchorY:0.5
        });

        var menu = new cc.Menu(closeItem);
        menu.x = 0;
        menu.y = 0;
        this.addChild(menu, 1);

        // add other codes below...
        // cocos label
        var helloLabel = new cc.LabelTTF("Hello World", "Arial", 38);
        // set position
        helloLabel.x = size.width / 2;
        helloLabel.y = 0;
        // add node
        this.addChild(helloLabel, 5);

        helloLabel.runAction(
            cc.spawn(
                cc.moveBy(2.5,cc.p(0, size.height - 40)),
                cc.tintTo(2.5, 255, 125, 0)
            )
        );

        // cocos sprite
        this.bgSprite = new cc.Sprite(images_res.GameKernel_Bg);
        this.bgSprite.attr({
            x: size.width / 2,
            y: size.height / 2,
            scale: 0.5,
            rotation: 180,
            anchorX: 0.5,
            anchorY: 0.5
        });
        this.addChild(this.bgSprite, 0);

        this.bgSprite.runAction(
            cc.sequence(
                cc.rotateTo(2, 0),
                cc.scaleTo(2, 1, 1)
            )
        );

        /* 启动定时器 */
        this.schedule(this.update,1,16*1024,1);

        return true;
    },

    addSushi: function() {

        var sushi = new cc.Sprite(images_res.GameFlyBody_Image);
        var size = cc.winSize;

        var posX = sushi.width/2 + size.width/2*cc.random0To1();

        sushi.attr({
            x: posX,
            y: size.height - 30
        });

        this .addChild(sushi, 5);
        this.SushiSpritesMgr.push(sushi);

        /* action */
        var dorpAction = cc.MoveTo.create(4,cc.p(sushi.x, -30));
        sushi.runAction(dorpAction);
    },

    removeSushi: function() {
        /* 移除到屏幕底部的sushi */
        for(var i = 0; i < this.SushiSpritesMgr.length; i++){
            cc.log("Z.x: remove Sushi......");
            if(0 >= this.SushiSpritesMgr[i].y){
                cc.log("Z.x: remove - "+i);
                this.SushiSpritesMgr[i].removeFromParent();
                this.SushiSpritesMgr[i] = undefined;

                //不使用自定义删除方法的Array初始化  对应上面初始化数组的语句
                //this.SushiSpritesMgr.splice(i,1);
                //i = i-1;

                //使用自定义删除方法的Array初始化
                this.SushiSpritesMgr = this.SushiSpritesMgr.DeleteByIdx(i);
            }
        }
    },

    update:function() {
        /* 添加一个掉落物体 放开则添加多个*/
        if(true/*0 == this.SushiSpritesMgr.length*/){
            this.addSushi();            
        }
      
        /* 检测掉落物体 是否超出屏幕之外 */
        this.removeSushi();
    }

});

var GameKernelScene = cc.Scene.extend({
    onEnter:function () {
        this._super();

        var layer = new GameKernelLayer();
        this.addChild(layer);
    }
});

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是用 C++ 和 cocos2d-x 开发贪吃蛇的代码示例: 首先,我们需要创建一个 Snake 类,用于管理贪吃蛇的运动和状态: ```c++ class Snake : public cocos2d::Node { public: virtual bool init() override; CREATE_FUNC(Snake); void move(); // 移动 void turn(Direction direction); // 转向 bool isDead() const; // 是否死亡 private: std::vector<cocos2d::Sprite*> m_body; // 身体 Direction m_direction; // 运动方向 bool m_isDead; // 是否死亡 int m_gridWidth; // 网格宽度 }; ``` 在 Snake 类中,我们定义了以下成员变量: - m_body:存储贪吃蛇身体的精灵数组; - m_direction:表示当前的运动方向; - m_isDead:表示是否已经死亡; - m_gridWidth:网格宽度,即每个格子的大小。 接下来,我们需要实现 Snake 类的成员函数: ```c++ bool Snake::init() { if (!Node::init()) { return false; } // 初始化 m_direction = Direction::RIGHT; m_isDead = false; m_gridWidth = 10; // 添加蛇头 auto head = cocos2d::Sprite::create("snake_head.png"); head->setPosition(cocos2d::Vec2(0, 0)); addChild(head); m_body.push_back(head); // 添加蛇身 for (int i = 1; i < 4; i++) { auto body = cocos2d::Sprite::create("snake_body.png"); body->setPosition(cocos2d::Vec2(-i * m_gridWidth, 0)); addChild(body); m_body.push_back(body); } return true; } void Snake::move() { if (m_isDead) { return; } // 移动身体 for (int i = m_body.size() - 1; i > 0; i--) { auto prevPos = m_body[i - 1]->getPosition(); m_body[i]->setPosition(prevPos); } // 移动头部 auto headPos = m_body[0]->getPosition(); switch (m_direction) { case Direction::UP: headPos.y += m_gridWidth; break; case Direction::DOWN: headPos.y -= m_gridWidth; break; case Direction::LEFT: headPos.x -= m_gridWidth; break; case Direction::RIGHT: headPos.x += m_gridWidth; break; } m_body[0]->setPosition(headPos); } void Snake::turn(Direction direction) { if (m_isDead) { return; } if ((int)direction + (int)m_direction == 0) { return; } m_direction = direction; } bool Snake::isDead() const { return m_isDead; } ``` 在 init 函数中,我们初始化了贪吃蛇的状态,并添加了蛇头和蛇身。 在 move 函数中,我们首先移动了蛇身,然后根据当前的运动方向移动了蛇头。 在 turn 函数中,我们检查了新的方向是否与当前方向相反,如果是,则不做任何操作。 在 isDead 函数中,我们简单地返回 m_isDead 的值。 接下来,我们需要创建一个 GameLayer 类,用于管理游戏的逻辑和界面: ```c++ class GameLayer : public cocos2d::Layer { public: virtual bool init() override; CREATE_FUNC(GameLayer); void update(float delta) override; // 帧更新函数 private: void createFood(); // 创建食物 bool checkCollision(); // 检查碰撞 Snake* m_snake; // 贪吃蛇 cocos2d::Sprite* m_food; // 食物 int m_gridWidth; // 网格宽度 float m_interval; // 更新间隔 }; ``` 在 GameLayer 类中,我们定义了以下成员变量: - m_snake:贪吃蛇对象; - m_food:食物对象; - m_gridWidth:网格宽度,即每个格子的大小; - m_interval:更新间隔,即每隔多少秒更新一次贪吃蛇的状态。 接下来,我们需要实现 GameLayer 类的成员函数: ```c++ bool GameLayer::init() { if (!Layer::init()) { return false; } // 初始化 m_gridWidth = 10; m_interval = 0.1f; // 添加贪吃蛇 m_snake = Snake::create(); m_snake->setPosition(cocos2d::Vec2(0, 0)); addChild(m_snake); // 创建食物 createFood(); // 注册键盘事件 auto listener = cocos2d::EventListenerKeyboard::create(); listener->onKeyPressed = [=](cocos2d::EventKeyboard::KeyCode keyCode, cocos2d::Event* event) { switch (keyCode) { case cocos2d::EventKeyboard::KeyCode::KEY_UP_ARROW: m_snake->turn(Direction::UP); break; case cocos2d::EventKeyboard::KeyCode::KEY_DOWN_ARROW: m_snake->turn(Direction::DOWN); break; case cocos2d::EventKeyboard::KeyCode::KEY_LEFT_ARROW: m_snake->turn(Direction::LEFT); break; case cocos2d::EventKeyboard::KeyCode::KEY_RIGHT_ARROW: m_snake->turn(Direction::RIGHT); break; default: break; } }; _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this); // 开始更新 scheduleUpdate(); return true; } void GameLayer::update(float delta) { m_interval -= delta; if (m_interval <= 0) { m_snake->move(); // 检查碰撞 if (checkCollision()) { m_snake->stopAllActions(); m_snake->setScale(1.0f); m_snake->runAction(cocos2d::Blink::create(2, 5)); m_snake->setIsDead(true); return; } // 检查是否吃到食物 auto headPos = m_snake->getPosition(); auto foodPos = m_food->getPosition(); if (headPos.distance(foodPos) < m_gridWidth) { m_food->removeFromParent(); createFood(); auto body = cocos2d::Sprite::create("snake_body.png"); body->setPosition(m_snake->getChildByName("tail")->getPosition()); m_snake->addChild(body); } m_interval = 0.1f; } } void GameLayer::createFood() { // 随机创建食物 auto visibleSize = cocos2d::Director::getInstance()->getVisibleSize(); auto origin = cocos2d::Director::getInstance()->getVisibleOrigin(); int x = (int)origin.x + m_gridWidth + rand() % ((int)visibleSize.width - 2 * m_gridWidth); int y = (int)origin.y + m_gridWidth + rand() % ((int)visibleSize.height - 2 * m_gridWidth); m_food = cocos2d::Sprite::create("snake_food.png"); m_food->setPosition(cocos2d::Vec2(x, y)); addChild(m_food); } bool GameLayer::checkCollision() { // 检查是否碰到边界 auto visibleSize = cocos2d::Director::getInstance()->getVisibleSize(); auto origin = cocos2d::Director::getInstance()->getVisibleOrigin(); auto headPos = m_snake->getPosition(); if (headPos.x < origin.x || headPos.y < origin.y || headPos.x > origin.x + visibleSize.width || headPos.y > origin.y + visibleSize.height) { return true; } // 检查是否碰到自己 for (int i = 1; i < m_snake->getChildrenCount() - 1; i++) { auto bodyPos = m_snake->getChildByTag(i)->getPosition(); if (headPos.distance(bodyPos) < m_gridWidth) { return true; } } return false; } ``` 在 init 函数中,我们初始化了游戏状态,并添加了贪吃蛇和食物。此外,我们还注册了键盘事件,并开始更新。 在 update 函数中,我们首先检查更新间隔是否已经到达,然后移动贪吃蛇,并检查是否碰到边界或自己。如果碰到了,则设置贪吃蛇为死亡状态,并返回。如果贪吃蛇吃到了食物,则创建一个新的身体部分,并重新生成食物。最后,重置更新间隔。 在 createFood 函数中,我们随机生成一个食物,并添加到场景中。 在 checkCollision 函数中,我们检查贪吃蛇是否碰到了边界或自己。如果碰到了,则返回 true,否则返回 false。 最后,在场景中添加 GameLayer 类的实例,即可运行贪吃蛇游戏。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值