2018-09-07 16:50:33 xie1xiao1jun 阅读数 0

1:GLViewImpl::initWithRect 中 glfwSetWindowIconifyCallback 下面 添加

glfwSetWindowCloseCallback(_mainWindow, GLFWEventHandler::onGLFWCloseCallback);// add by xxj 2018/09/07  16:38:55  窗口关闭事件

 

2:GLFWEventHandler 中添加函数 onGLFWCloseCallback

	// add by xxj 2014/12/17  14:07:22 
	static void onGLFWCloseCallback(GLFWwindow* window)
	{
		// add by xxj 2014/12/17  13:54:47 
		glfwSetWindowShouldClose(window, GLView::isClose);
	}

 

GLView::isClose 设置为false就行

 

获取更多帮主请关注小程序

 

2016-05-18 19:44:29 potato47 阅读数 7976

cc.director.end();

2017-03-24 22:51:36 WAN_EXE 阅读数 672

在之前的文章中已经熟悉了coco2d-x的基本用法,这个系列主要分析它的一些类,结合官网提供coco2d-x Programmers Guide v3.12.pdf

pdf下载地址

https://pan.baidu.com/s/1bp3UDP1

看完了一大半左右,感觉没有实际写代码好,所以只是走马观花匆匆地扫过去。另外在github上提供更适合新手学习的代码,programmers-guide-samples-3.10.zip,操作性比coco2d-x源文件自带的CppTest强一点,因为都是一些基本操作的。看它的名字应该是基于version 3.12的。

里面的内容分成十几个章节,这个系列就是学习这些小代码的,可能会分得更细一些,一下子给太多容易掌握不住,每次进步一点点,累积起来就是巨大的进步。

很多的地方会加上自己的注释,或者查看官网提供的API手册,不懂的地方还希望见谅,毕竟在游戏上我也是新手。

源码demo下载地址

https://pan.baidu.com/s/1pKWwjcJ

第一篇创建只有一个退出按钮的demo,代替原来提供的HelloWorldScene.cpp类。

先把那四个类的源码粘贴出来

AppDelegate.h

Delegate的字面的意思就是代表的意思,现在我们需要知道的大概是applicationDidFinishLaunching, applicationDidEnterBackground, applicationWillEnterForeground

根据字面意思就可以推断出来,第一个表示程序需要完成的内容,第二个表示程序进入后台,第三个表示程序讲进入前台。

这几个大概意思知道就可以了,写coco2d-x engine的人都替我们写好了。

#ifndef  _APP_DELEGATE_H_
#define  _APP_DELEGATE_H_

#include "cocos2d.h"

/**
@brief    The cocos2d Application.

Private inheritance here hides part of interface from Director.
*/
class  AppDelegate : private cocos2d::Application
{
public:
    AppDelegate();
    virtual ~AppDelegate();

    virtual void initGLContextAttrs();

    /**
    @brief    Implement Director and Scene init code here.
    @return true    Initialize success, app continue.
    @return false   Initialize failed, app terminate.
    */
    virtual bool applicationDidFinishLaunching();

    /**
    @brief  Called when the application moves to the background
    @param  the pointer of the application
    */
    virtual void applicationDidEnterBackground();

    /**
    @brief  Called when the application reenters the foreground
    @param  the pointer of the application
    */
    virtual void applicationWillEnterForeground();
};

#endif // _APP_DELEGATE_H_

AppDelegate.cpp

这里对新手来说比较疑惑的是GL是什么,就是一组图像渲染的接口,还没到学习OpenGL的地步,有兴趣可以自己查阅资料。

需要弄清楚几个尺寸,这里选用的是mediumResolutionSize 1024 × 768

后面还有对象的尺寸,基点等,对我们计算物体的位置十分重要。

真正需要关注的是auto scene = MainScene::createScene(); 创建一个场景,大概可以翻译成场景,

编程手册上打了一个比方说Driector类似于拍电影的导演,Scene类似于场景。

Animation就是动画吧,英语都比较直白,比较好理解。

#include "AppDelegate.h"
#include "MainScene.h"

USING_NS_CC;

static cocos2d::Size designResolutionSize = cocos2d::Size(480, 320);
static cocos2d::Size smallResolutionSize = cocos2d::Size(480, 320);
static cocos2d::Size mediumResolutionSize = cocos2d::Size(1024, 768);
static cocos2d::Size largeResolutionSize = cocos2d::Size(2048, 1536);

AppDelegate::AppDelegate()
{
}

AppDelegate::~AppDelegate() 
{
}

// if you want a different context, modify the value of glContextAttrs
// it will affect all platforms
void AppDelegate::initGLContextAttrs()
{    
	/* GLContextAttrs Struct
	 * set OpenGL context attributes:
	 * redBits, greenBits, blueBits, alphaBits, depthBits, stencilBits
	 * /SourceCode/cocos/platform/CCLView.h
	 */
    GLContextAttrs glContextAttrs = {8, 8, 8, 8, 24, 8};

    GLView::setGLContextAttrs(glContextAttrs);
}

// if you want to use the package manager to install more packages,  
// don't modify or remove this function
static int register_all_packages()
{
    return 0; //flag for packages manager
}

bool AppDelegate::applicationDidFinishLaunching() {
    // initialize director
    auto director = Director::getInstance();
    auto glview = director->getOpenGLView();
    if(!glview) {
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) || (CC_TARGET_PLATFORM == CC_PLATFORM_MAC) || (CC_TARGET_PLATFORM == CC_PLATFORM_LINUX)
        glview = GLViewImpl::createWithRect("GameDemo", cocos2d::Rect(0, 0, mediumResolutionSize.width, mediumResolutionSize.height));
#else
        glview = GLViewImpl::create("GameDemo");
#endif
        director->setOpenGLView(glview);
    }

    // turn on display FPS
    // director->setDisplayStats(true);

    // set FPS. the default value is 1.0/60 if you don't call this
    // director->setAnimationInterval(1.0f / 60);

    // Set the design resolution
    glview->setDesignResolutionSize(designResolutionSize.width, designResolutionSize.height, ResolutionPolicy::NO_BORDER);
    auto frameSize = glview->getFrameSize();
    // if the frame's height is larger than the height of medium size.
    if (frameSize.height > mediumResolutionSize.height)
    {        
        director->setContentScaleFactor(MIN(largeResolutionSize.height/designResolutionSize.height, largeResolutionSize.width/designResolutionSize.width));
    }
    // if the frame's height is larger than the height of small size.
    else if (frameSize.height > smallResolutionSize.height)
    {        
        director->setContentScaleFactor(MIN(mediumResolutionSize.height/designResolutionSize.height, mediumResolutionSize.width/designResolutionSize.width));
    }
    // if the frame's height is smaller than the height of medium size.
    else
    {        
        director->setContentScaleFactor(MIN(smallResolutionSize.height/designResolutionSize.height, smallResolutionSize.width/designResolutionSize.width));
    }

    register_all_packages();

    // create a scene. it's an autorelease object
    auto scene = MainScene::createScene();

    // run
    director->runWithScene(scene);

    return true;
}

// This function will be called when the app is inactive. Note, when receiving a phone call it is invoked.
void AppDelegate::applicationDidEnterBackground() {
    Director::getInstance()->stopAnimation();

    // if you use SimpleAudioEngine, it must be paused
    // SimpleAudioEngine::getInstance()->pauseBackgroundMusic();
}

// this function will be called when the app is active again
void AppDelegate::applicationWillEnterForeground() {
    Director::getInstance()->startAnimation();

    // if you use SimpleAudioEngine, it must resume here
    // SimpleAudioEngine::getInstance()->resumeBackgroundMusic();
}

开始创建我们自己的场景,命名为

MainScene.h

英文注释已经说的很清楚了,CREATE_FUNC是一个宏,我觉得没有必要在现在就进行深入理解,除非你的C++功底特别深厚。

我猜大概的意思是向系统注册这个MainScene.

#ifndef MAINSCENE_H
#define MAINSCENE_H

#include "cocos2d.h"

class MainScene : public cocos2d::Node {
public:
	// There's no 'id' in cpp, so we recommend returning the class
	// instance pointer
	static cocos2d::Scene *createScene();

	// Here's a difference. Method 'init' in cocos2d-x return bool,
	// instead of returning 'id' in cocos2d-iphone
	virtual bool init();
	
	// a selector callback
	void onMenuCloseCallback(cocos2d::Ref *sender);
	CREATE_FUNC(MainScene);
};
#endif

MainScene.cpp

MenuItemImage和Menu是应该是被包含的关系,一个Menu中可以创建好多的Item,最后以NULL结尾,C++11是用nullptr,不过表达的意思是一样的。

origin.x指的是可见尺寸的原点,在坐下角,visibleSize.width是指屏幕的宽度,closeItem->getContentSize()是指物体的尺寸。

Item的原点是在图片的正中间(0.5, 0.5),那么根据这么计算就可以得出是把Item放在右下角了。

点按钮回调相应的函数安卓中很多,知道怎么注册怎么用就可以了。

MenuItemImage的继承关系图


#include "MainScene.h"

USING_NS_CC;

Scene *MainScene::createScene() {
	// 'scene' is an autorelease object
	
	auto scene = Scene::create();

	// 'layer' is an autorelease object
	auto layer = MainScene::create();

	// add layer as a child to scene
	scene->addChild(layer);

	// return the scene
	return scene;
}

// On "init" you need to initialize your instance
bool MainScene::init()
{
	// Super init first
	if (!Node::init())
		return false;
	
	Size visibleSize = Director::getInstance()->getVisibleSize();
	// Return visible origin coordinate of the OpenGL view in points
	Vec2 origin = Director::getInstance()->getVisibleOrigin();
	
	// Add a menu item with "X" image, which is clicked to quit the program
	// Add a "close" icon to exit the progress, it's an autorelease object
	auto closeItem = MenuItemImage::create("CloseNormal.png",
			"CloseSelected.png", CC_CALLBACK_1(MainScene::onMenuCloseCallback, this));
	
	// getContentsSize()
	// Returns the untransoformed size of the node
	
	// default value (0.5, 0.5)
	closeItem->setPosition(Vec2(origin.x + visibleSize.width - closeItem->getContentSize().width/2,
		origin.y + closeItem->getContentSize().height/2));
	
	// create menu, it's an autorelease object
	auto closeMenu = Menu::create(closeItem, NULL);
	closeMenu->setPosition(Vec2::ZERO);
	this->addChild(closeMenu, 1);

	return true;
}

void MainScene::onMenuCloseCallback(Ref *sender) {
	Director::getInstance()->end();
}

差不多就可以编译运行。

手机上运行也是相同的效果,点击按钮会退出。

2016-07-15 17:57:35 yjsowsk 阅读数 5418

最近做了一个项目,需要将游戏内置在ios/android的内部,就类似于游戏大厅的模式,所以其实整个应用是一个app,只是其中某个功能点进去,就进入了我们熟悉的界面。

因为cocos2d-x本身就是基于双平台的应用去实现游戏的逻辑,所以其实要改的只是一些配置而已,但是虽然如此,在开发过程中还是遇到了很多问题,现在将此问题记录下来,希望各位道友以后做此类游戏时有此方面的准备。


本篇只写android篇,ios的嵌入请看下一篇 (本篇编译平台为MAC,不过和windows的步骤差不多)


首先cocos2d-x 和android的环境搭建一键略过。

本示例是以cocos2d-x 3.0为例子


第一步: 创建工程

创建好你的cocos2d-x工程,然后用eclipse创建一个空的android工程(工程名暂定为 TestAndroid)


第二步:编译 

编译 cocos2d-x 下的 pro-android项目, 打开终端,cd 到cocos2d-x的android目录下 ,编译执行 ./build_native.py ,等一小段时间编译生成后,就会在libs/armeabi目录生成 libcocos2dcpp.so


第三步: 资源复制

1、 把刚刚编译成功的so文件的目录复制,即 libs/armeabi/libcocos2dcpp.so,然后粘贴到TestAndroid目录下

2、把cocos2d-x的资源目录的所有文件拷贝到TestAndrodi/assets目录下

3、把cocos2d-x目录下的 cocos2d/cocos/2d/platform/android/java/src 的org目录拷贝到TestAndroid/src目录下


第四步:配置 ( 本步骤的所有操作都在TestAndroid工程中)

1、在MainActivity.java的同级目录创建一个新Activity文件,暂定为GameActivity,并且继承Cocos2dxActivity

2、在AndroidManifest.xml 添加对新Activity的配置,添加注册新的GameActivity,下面是添加后的文件





    

    
        
            
                

                
            
        
        
        
        
    


3、在activity_main.xml布局里添加一个button,然后在MainActivity里添加事件的跳转

void GotoGameActivity(){

Intent intent = new Intent(this,GameActivity.class);

startActivity(intent);

}

到这里,基本上已经完成,能够正常进入游戏了,那么问题来了,cocos2d-x工程里的HelloWolrd里的那个退出按钮原来是退出游戏,怎么才能让它仍然返回当前应用呢,接着看


第五步:结束游戏时返回到应用

有点安卓基础的会发现,游戏内部点退出后,是返回到安卓里的一个方法了,经过层层调用,最终来到了Cocos2dxHelper.java下的terminateProcess方法,于是我们将方法内容换成 ((Activity)sContext).finish(); 即

public static void terminateProcess() {
	((Activity)sContext).finish();
}

大功告成,已经能正常返回界面。

如果留言的人多的话,我就将源码地址帖出来

ios的嵌入请浏览下一篇




2013-06-12 20:49:27 cen616899547 阅读数 0

转自:http://blog.csdn.net/software_lichaojie/article/details/8718777

在win32下,当点击退出按钮退出cocos2d-x程序时,调用的是

voidHelloWorld::menuCloseCallback(CCObject* pSender)

{

    // "close" menu item clicked

    CCDirector::sharedDirector()->end();

}

即可成功退出。今天移植代码到Xcode中,退出时总是抛异常,百思不得其解。后来,在Xcode下新建coco2d-x应用,点击退出按钮,没有任何错。然后查看代码,发现是这样写的。

voidHelloWorld::menuCloseCallback(CCObject* pSender)

{

    // "close" menu item clicked

    CCDirector::sharedDirector()->end();

    #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)

       exit(0);

    #endif

}

多了三行预处理命令。恍然大悟!原来如果为iOS平台,则需另外执行exit(0).cocos2d-x的移植性真是没有想象的那么简单啊,花费了数日,才真正移植成功。其中遇到了

1.头文件路径问题(解决方案,使用绝对路径)

2.资源文件读取不到(解决方案,参考:http://www.cnblogs.com/wt616/archive/2012/12/04/2800729.html,正确移植vs代码和资源到Xcode下)

3.横屏竖屏问题(解决方案见我之前博客);

再就是这个异常退出问题了,这几天搞的头都大了。总算现在有点眉目了。

lua 退出APP

阅读数 1566