cocos2d-x 基础系列 (02) 在项目中建立文件夹并且进行场景切换

在之前的例子中,我们都是把类放在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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值