小试牛刀--cocos 2dx 初试成果

前几天一直在尝试cocos游戏开发,遇到了很多挫折,在本大侠的坚持努力下,成功做成了一个简单的界面。
主要步骤是在官网:COCOS中找到的。按照他们的步骤,你就可以完成初步的环境搭配。我建议初学者在linux环境下搭建,因为我在windows下搭建,很不顺利,到后面都没有成功过,主要在windows环境下,按照cocos creator很麻烦,比如屏幕分辨率必须大于1280×760,还有就是必须按照windows的.net环境,这个软件特别大,简直不敢想象,要10G .
所以我们初学者,就是要简单点,能快速的调试看效果。


首先看我的调试效果,很简单,请不要喷
最开始的效果:
这里写图片描述
经过补充后的效果:
这里写图片描述
上面的图片中,圆点触摸后放大一倍,可以拖动,手指离开后恢复原大小。

实现代码如下:

/****************************************************************************

 http://www.cocos2d-x.org
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
 in the Software without restriction, including without limitation the rights
 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 copies of the Software, and to permit persons to whom the Software is
 furnished to do so, subject to the following conditions:
 
 The above copyright notice and this permission notice shall be included in
 all copies or substantial portions of the Software.
 
 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 THE SOFTWARE.
 ****************************************************************************/

#include "HelloWorldScene.h"
#include "SimpleAudioEngine.h"

USING_NS_CC;

Scene* HelloWorld::createScene()
{
    return HelloWorld::create();
}

// Print useful error message instead of segfaulting when files are not there.
static void problemLoading(const char* filename)
{
    printf("Error while loading: %s\n", filename);
    printf("Depending on how you compiled you might have to add 'Resources/' in front of filenames in HelloWorldScene.cpp\n");
}

// on "init" you need to initialize your instance
bool HelloWorld::init()
{
    //
    // 1. super init first
    if ( !Scene::init() )
    {
        return false;
    }

    auto visibleSize = Director::getInstance()->getVisibleSize();
    Vec2 origin = Director::getInstance()->getVisibleOrigin();

    /
    // 2. add a menu item with "X" image, which is clicked to quit the program
    //    you may modify it.

    // add a "close" icon to exit the progress. it's an autorelease object
    auto closeItem = MenuItemImage::create(
                                           "CloseNormal.png",
                                           "CloseSelected.png",
                                           CC_CALLBACK_1(HelloWorld::menuCloseCallback, this));

    if (closeItem == nullptr ||
        closeItem->getContentSize().width <= 0 ||
        closeItem->getContentSize().height <= 0)
    {
        problemLoading("'CloseNormal.png' and 'CloseSelected.png'");
    }
    else
    {
        float x = origin.x + visibleSize.width - closeItem->getContentSize().width/2;
        float y = origin.y + closeItem->getContentSize().height/2;
        closeItem->setPosition(Vec2(x,y));
    }

    // create menu, it's an autorelease object
    auto menu = Menu::create(closeItem, NULL);
    menu->setPosition(Vec2::ZERO);
    this->addChild(menu, 1);

    /
    // 3. add your codes below...

    // add a label shows "Hello World"
    // create and initialize a label

    auto label = Label::createWithTTF("Hello baby", "fonts/Marker Felt.ttf", 24);
    if (label == nullptr)
    {
        problemLoading("'fonts/Marker Felt.ttf'");
    }
    else
    {
        // position the label on the center of the screen
        label->setPosition(Vec2(origin.x + visibleSize.width/2,
                                origin.y + visibleSize.height - label->getContentSize().height));

        // add the label as a child to this layer
        this->addChild(label, 1);
    }

    // add "HelloWorld" splash screen"
    //auto sprite = Sprite::create("CloseNormal.png");
    /*if (sprite == nullptr)
    {
        problemLoading("'HelloWorld.png'");
    }
    else
    {
        // position the sprite on the center of the screen
        sprite->setPosition(Vec2(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));

        // add the sprite as a child to this layer
        this->addChild(sprite, 0);
    }*/
    auto listener = EventListenerTouchOneByOne::create();
    listener->setSwallowTouches(true);
    listener->onTouchBegan = [](Touch* touch, Event* event){
        // your code
//        auto point = Sprite::create("CloseNormal.png");
//        auto vec2 = touch->getLocation();
//        vec2.add(origin);
//        point->setPosition(vec2);
//        this->addChild(point,0);
        auto currentSprite = static_cast<Sprite*>(event->getCurrentTarget());
        Point pos = Director::getInstance()->convertToGL(touch->getLocationInView());
        if(currentSprite->getBoundingBox().containsPoint(pos)) {
            currentSprite->setOpacity(100);
            currentSprite->setScale(3,3);
            return true;
        }
        log("onTouch");
        return false;
    };
    /*listener->onTouchMoved = [](Touch * touch , Event* event){
        auto currentSprite = static_cast<Sprite*>(event->getCurrentTarget());
        currentSprite->setPosition(touch->getLocation());
    };*/
    listener->onTouchEnded = [](Touch * touch , Event* event){
        auto currentSprite = static_cast<Sprite*>(event->getCurrentTarget());
        currentSprite->setOpacity(0xff);
        currentSprite->setScale(1,1);
    };

    //_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, sprite);

    auto note_wid = visibleSize.width/19;//sprite->getContentSize().width;
    auto note_heg = visibleSize.height/13;//sprite->getContentSize().height;
    for (int i = note_wid/2; i < visibleSize.width; i+=note_wid) {
        for (int j = note_heg/2; j < visibleSize.height; j+=note_heg) {
            auto polygon = AutoPolygon::generatePolygon("CloseNormal.png");
            auto note = Sprite::create(polygon);
            note->setPosition(Vec2(i +origin.x, j + origin.y));
            //note->setRotation(i+j);
            //note->setAnchorPoint(Vec2(i/note_wid,j/note_heg));
            //note->setScale(2,2);
            //note->setColor(Color3B(i%0xff,j%0xff,(i+j)%0xff));
            _eventDispatcher->addEventListenerWithSceneGraphPriority(listener->clone(), note);
            this->addChild(note);
        }
    }
    auto texture = TextureAtlas::create("light.bmp",56);

    return true;
}

void HelloWorld::menuCloseCallback(Ref* pSender)
{
    //Close the cocos2d-x game scene and quit the application
    Director::getInstance()->end();

    #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    exit(0);
#endiftop


    /*To navigate back to native iOS screen(if present) without quitting the application  ,do not use Director::getInstance()->end() and exit(0) as given above,instead trigger a custom event created in RootViewController.mm as below*/

    //EventCustom customEndEvent("game_scene_close_event");
    //_eventDispatcher->dispatchEvent(&customEndEvent);


}

因为本人主要是做java,所以对c++代码熟悉。上面的代码是通过搜索而来的,关键是如果给精灵注册监听事件:

_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, sprite);

如果没有上面的这句代码,是没有事件相应的。
还有就是cpp中有一个lamda表达式,这个东西在java中是没有的,所以我也不怎么了解,据我估计,应该是编译器对代码进行了补充优化。
另外listener,进行clone,这个东西比java好,创建对象比较快。

这里写图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值