一直以为Cocos2d-x中只有事件队列,只有一个主线程。。。
首先设置头文件
E:\Cocos2d-X\cocos2d-2.1rc0-x-2.1.2\cocos2dx\platform\third_party\win32\pthread
pthreadVCE2.lib
pthread_mutex_init(&mutex,NULL);
pthread_create(&pidgo,NULL,thread_go,0);
pthread_mutex_lock(&mutex);
pthread_mutex_unlock(&mutex);
下面是源代码:
HelloWorldScene.h
#pragma once #include "cocos2d.h" #include "Box2D/Box2D.h" #include "SimpleAudioEngine.h" #include "pthread.h" #include<string> class HelloWorld : public cocos2d::CCLayer { public: // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone virtual bool init(); // there's no 'id' in cpp, so we recommand to return the exactly class pointer static cocos2d::CCScene* scene(); // a selector callback void menuCloseCallback(CCObject* pSender); // implement the "static node()" method manually CREATE_FUNC(HelloWorld); //Create two function and two tag of thread pthread_t pidrun,pidgo; static void* thread_run(void *r); static void* thread_go(void* r); }; class Student { public : Student(void){}; Student(std::string name,int age,std::string sex) { this->m_age=age; this->m_name=name; this->m_sex=sex; } ~Student() { cocos2d::CCLog("delete data"); } std::string m_name; std::string m_sex; int m_age; };
HelloWorldScene.cpp
#include "HelloWorldScene.h" #include<windows.h> using namespace cocos2d; static int ticket=100; static pthread_mutex_t mutex; CCScene* HelloWorld::scene() { CCScene * scene = NULL; do { // 'scene' is an autorelease object scene = CCScene::create(); CC_BREAK_IF(! scene); // 'layer' is an autorelease object HelloWorld *layer = HelloWorld::create(); CC_BREAK_IF(! layer); // add layer as a child to scene scene->addChild(layer); } while (0); // return the scene return scene; } // on "init" you need to initialize your instance bool HelloWorld::init() { bool bRet = false; do { ////////////////////////////////////////////////////////////////////////// // super init first ////////////////////////////////////////////////////////////////////////// CC_BREAK_IF(! CCLayer::init()); ////////////////////////////////////////////////////////////////////////// // add your codes below... ////////////////////////////////////////////////////////////////////////// // 1. Add a menu item with "X" image, which is clicked to quit the program. // Create a "close" menu item with close icon, it's an auto release object. CCMenuItemImage *pCloseItem = CCMenuItemImage::create( "CloseNormal.png", "CloseSelected.png", this, menu_selector(HelloWorld::menuCloseCallback)); CC_BREAK_IF(! pCloseItem); // Place the menu item bottom-right conner. pCloseItem->setPosition(ccp(CCDirector::sharedDirector()->getWinSize().width - 20, 20)); // Create a menu with the "close" menu item, it's an auto release object. CCMenu* pMenu = CCMenu::create(pCloseItem, NULL); pMenu->setPosition(CCPointZero); CC_BREAK_IF(! pMenu); // Add the menu to HelloWorld layer as a child layer. this->addChild(pMenu, 1); // 2. Add a label shows "Hello World". // Create a label and initialize with string "Hello World". CCLabelTTF* pLabel = CCLabelTTF::create("Hello World", "Arial", 24); CC_BREAK_IF(! pLabel); // Get window size and place the label upper. CCSize size = CCDirector::sharedDirector()->getWinSize(); pLabel->setPosition(ccp(size.width / 2, size.height - 50)); // Add the label to HelloWorld layer as a child layer. this->addChild(pLabel, 1); // 3. Add add a splash screen, show the cocos2d splash image. CCSprite* pSprite = CCSprite::create("HelloWorld.png"); CC_BREAK_IF(! pSprite); // Place the sprite on the center of the screen pSprite->setPosition(ccp(size.width/2, size.height/2)); // Add the sprite to HelloWorld layer as a child layer. this->addChild(pSprite, 0); bRet = true; } while (0); return bRet; } void HelloWorld::menuCloseCallback(CCObject* pSender) { // "close" menu item clicked //CCDirector::sharedDirector()->end(); Student *temp=new Student(std::string("ThisisGame"),22,std::string("Boy")); pthread_mutex_init(&mutex,NULL); pthread_create(&pidrun,NULL,thread_run,temp); pthread_create(&pidgo,NULL,thread_go,0); } void* HelloWorld::thread_run(void* r) { Student* s=(Student*)(r); CCLog("Student age=%d,name=%s,sex=%s",s->m_age,s->m_name.c_str(),s->m_sex.c_str()); //delete s; while (true) { pthread_mutex_lock(&mutex); if(ticket>0) { CCLog("thread run sell %d",ticket); ticket--; pthread_mutex_unlock(&mutex); } else { pthread_mutex_unlock(&mutex); return NULL; } #ifdef WIN32 Sleep(1000); #else Usleep(1); #endif } return NULL; } void* HelloWorld::thread_go(void* r) { while (true) { pthread_mutex_lock(&mutex); if(ticket>0) { CCLog("thread go sell %d",ticket); ticket--; pthread_mutex_unlock(&mutex); } else { pthread_mutex_unlock(&mutex); return NULL; } #ifdef WIN32 Sleep(1000); #else Usleep(1); #endif } return NULL; }
程序运行结果:
然后是工程打包:
http://download.csdn.net/detail/cp790621656/5905699