在之前的例子中,我们都是把类放在Classes文件夹中,把资源放在Resources文件夹中,并没有进行更小的分类。一旦项目比较大之后,不分类的难以管理,所以在这篇文章中我们会在Classes文件夹中新建立一个场景的文件夹,根据官网的手册的章节,命名为Sprites文件夹,
创建一个新类
可以看到这个场景非常简单,只有一个必须的创建场景的函数,场景中就只包含一个Sprite
Sprites.h
#ifndef SPRITES_H
#define SPRITES_H
#include "cocos2d.h"
#include <iostream>
USING_NS_CC;
class Sprites {
public:
static cocos2d::Scene *createScene();
};
#endif
Sprites.cpp
#include "Sprites.h"
USING_NS_CC;
Scene *Sprites::createScene() {
// some upfront itmes that we need
Size visibleSize = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin();
// actual playing size to work with
Size playingSize = Size(visibleSize.width, visibleSize.height / 8 * 7);
// create a scene for our game to hold everything
// 'scene' is an autorelease object
auto scene = Scene::create();
// create a sprite
auto sprite1 = Sprite::create("Blue_Front1.png");
sprite1->setPosition(playingSize.width/2, playingSize.height/2);
scene->addChild(sprite1);
return scene;
}
修改MainScene.cpp文件
记得添加头文件
#include "Sprites/Sprites.h"
在init函数中添加,创建一个mainMenu, mainMenu中包含一个MenuItemLabel,设置位置,设置回调函数。
addChild很重要,关系到遍历的问题,从下图中可以看到它是怎么遍历所有的对象的。
// create menu, it's an autorelease object
auto closeMenu = Menu::create(closeItem, NULL);
closeMenu->setPosition(Vec2::ZERO);
this->addChild(closeMenu, 1);
// Add main menu
auto mainMenu = Menu::create();
auto itemLabel = LabelTTF::create("Sprites", "Arial", 32);
auto menuItemLabel = MenuItemLabel::create(itemLabel);
menuItemLabel->setPosition(origin.x + visibleSize.width/2,
origin.y + visibleSize.height/2);
menuItemLabel->setCallback([&](cocos2d::Ref *sender) {
Director::getInstance()->replaceScene(Sprites::createScene());
});
mainMenu->addChild(menuItemLabel, 2);
mainMenu->setPosition(Vec2::ZERO);
this->addChild(mainMenu, 1);
return true;
接着修改CMakeLists.txt文件,编译Unbuntu游戏需要
set(GAME_SRC
Classes/AppDelegate.cpp
Classes/MainScene.cpp
Classes/Sprites/Sprites.cpp
${PLATFORM_SPECIFIC_SRC}
)
set(GAME_HEADERS
Classes/AppDelegate.h
Classes/MainScene.h
Classes/Sprites/Sprites.h
${PLATFORM_SPECIFIC_HEADERS}
)
改法和之前只改类很相似。
修改Android.mk文件编译生成apk文件
14 LOCAL_SRC_FILES := hellocpp/main.cpp \
15 ../../Classes/AppDelegate.cpp \
16 ../../Classes/MainScene.cpp \
17 ../../Classes/Sprites/Sprites.cpp
18
19 LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes \
20 $(LOCAL_PATH)/../../Classes/Sprites
记得在调试的编译apk的时候怎么都编不够,查看那里错误,网上查也没有答案。对照提供的项目也没有什么问题。
最后还是得看编译哪里出错
make: Entering directory '/home/wang/workspace/cocos2dx/MyCompany/GameDemo/proj.android'
Android NDK: WARNING: APP_PLATFORM android-13 is larger than android:minSdkVersion 9 in ./AndroidManifest.xml
make: *** No rule to make target 'jni/../../Classes/HelloWorldScene.cpp', needed by 'obj/local/armeabi/objs-debug/MyGame_shared/__/__/Classes/HelloWorldScene.o'. Stop.
make: *** Waiting for unfinished jobs....
make: Leaving directory '/home/wang/workspace/cocos2dx/MyCompany/GameDemo/proj.android'
Error running command, return code: 2.
╮(╯▽╰)╭,还是要认真看看编译状况的,提醒得很清楚了。没有HelloWorldScene.cpp这个文件,原来我在Classes不需要它就把它删除了,但是在Android.mk中仍然保留
../../Classes/HelloWorldScene.cpp,所以导致出错,删除之后编译成功。
debug:
BUILD SUCCESSFUL
Total time: 12 seconds
Move apk to /home/wang/workspace/cocos2dx/MyCompany/GameDemo/bin
Build succeed.
运行效果:
点击文字会弹出图片的场景,但是没有办法返回 :-P