Appdelegate.h
#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.m
#include "AppDelegate.h" #include "HelloWorldScene.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); static cocos2d::Size iphoneSixResolutionSize = cocos2d::Size(1334,750); AppDelegate::AppDelegate() { } AppDelegate::~AppDelegate() { } // if you want a different context,modify the value of glContextAttrs // it will affect all platforms void AppDelegate::initGLContextAttrs() { // set OpenGL context attributes: red,green,blue,alpha,depth,stencil GLContextAttrs glContextAttrs = {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("TestBox2",cocos2d::Rect(0,designResolutionSize.width,designResolutionSize.height)); #else glview = GLViewImpl::create("TestBox2"); #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(iphoneSixResolutionSize.width,iphoneSixResolutionSize.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/iphoneSixResolutionSize.height,largeResolutionSize.width/iphoneSixResolutionSize.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/iphoneSixResolutionSize.height,mediumResolutionSize.width/iphoneSixResolutionSize.width)); } // if the frame's height is smaller than the height of medium size. else { director->setContentScaleFactor(MIN(smallResolutionSize.height/iphoneSixResolutionSize.height,smallResolutionSize.width/iphoneSixResolutionSize.width)); } register_all_packages(); // create a scene. it's an autorelease object auto scene = HelloWorld::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(); }HelloWorldScene.h
#ifndef __HELLOWORLD_SCENE_H__ #define __HELLOWORLD_SCENE_H__ #include "cocos2d.h" #include "external/Box2D/Box2D.h" class HelloWorld : public cocos2d::Layer { protected: b2World *_world; cocos2d::Sprite *_ball; cocos2d::DrawNode *_graphics; cocos2d::Size _visibleSize; public: static cocos2d::Scene* createScene(); virtual bool init(); virtual void update(float delta); // a selector callback void menuCloseCallback(cocos2d::Ref* pSender); // implement the "static create()" method manually CREATE_FUNC(HelloWorld); //初始化球精灵 void initBall(float xdt,float ydt,b2Vec2 aVec2); //初始化四周墙壁 void initFence(); //初始化地面 void initGround(); //初始化左右墙 void initLeftRightWall(); // 初始化天花板 void initSky(); // virtual void onTouchesBegan (const std::vector< cocos2d::Touch * > &touches,cocos2d::Event *unused_event); // 触摸开始 virtual bool onTouchBegan(cocos2d::Touch* touch,cocos2d::Event *event); //触摸结束 virtual void onTouchEnded(cocos2d::Touch *touch,cocos2d::Event *unused_event); }; #endif // __HELLOWORLD_SCENE_H__HelloWorldScene.cpp
#include "HelloWorldScene.h" #include "SimpleAudioEngine.h" USING_NS_CC; #define RATIO 32 Scene* HelloWorld::createScene() { // 'scene' is an autorelease object auto scene = Scene::create(); // 'layer' is an autorelease object auto layer = HelloWorld::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 HelloWorld::init() { ////////////////////////////// // 1. super init first if ( !Layer::init() ) { return false; } _world = new b2World(b2Vec2(0,-8)); _visibleSize = Director::getInstance()->getVisibleSize(); //初始化四周墙壁 initFence(); // //初始化背景墙 // initGround(); // //初始化左右墙 // initLeftRightWall(); // //初始化天花板 // initSky(); //初始化球精灵1 initBall(300,400,b2Vec2(2,0)); //初始化球精灵2 initBall(100,200,b2Vec2(4,0)); //初始化球精灵3 initBall(100,b2Vec2(1,0)); //初始化球精灵4 initBall(200,600,15)); auto dispatcher = Director::getInstance()->getEventDispatcher(); auto listener = EventListenerTouchOneByOne::create(); listener->onTouchBegan = CC_CALLBACK_2(HelloWorld::onTouchBegan,this); listener->onTouchMoved = CC_CALLBACK_2(HelloWorld::onTouchMoved,this); listener->onTouchEnded = CC_CALLBACK_2(HelloWorld::onTouchEnded,this); listener->setSwallowTouches(true);//不向下传递触摸 dispatcher->addEventListenerWithSceneGraPHPriority(listener,this); //即时更新 scheduleUpdate(); return true; } void HelloWorld::initBall(float xdt,b2Vec2 aVec2) { Vec2 origin = Director::getInstance()->getVisibleOrigin(); //创建显示对象,小球 _ball = Sprite::create("smallBall.png"); addChild(_ball); // _ball->setPosition(Vec2(200,200)); // _ball->setAnchorPoint(Vec2(0,0)); // _ball->setScale(1,1); //声明b2BodyDef b2BodyDef bodyDef; bodyDef.type= b2_dynamicBody; bodyDef.position.Set(xdt/RATIO,ydt/RATIO); //创建刚体所需的形状 b2CircleShape circleShape; circleShape.m_radius = _ball->getContentSize().width/2/RATIO; //声明b2FixtureDef b2FixtureDef fixtureDef; fixtureDef.shape = &circleShape; fixtureDef.density= 10.0f; fixtureDef.friction= 1.8f; //创建刚体 auto circle = _world->CreateBody(&bodyDef); circle->CreateFixture(&fixtureDef); circle->SetLinearVelocity(aVec2); // circle->ApplyLinearImpulse(b2Vec2(2,0),circle->GetLocalCenter(),true); circle->SetUserData(_ball); } void HelloWorld::initFence() { //地板的位置和类型,(静态) b2BodyDef bodyDef; bodyDef.type = b2_staticBody; bodyDef.position = b2Vec2(0,0); b2Body *body = _world->CreateBody(&bodyDef); //指定形状,这一步骤必须有 //下 b2PolygonShape groundShape; groundShape.SetAsBox(_visibleSize.width/RATIO,0.1);//visibleSize.height/2.0/RATIO); b2FixtureDef fixture; // fixture.density = 1;//密度 // fixture.friction = 0;//摩擦力 // fixture.restitution = 0.8; fixture.shape = &groundShape; body->CreateFixture(&fixture); //上 b2PolygonShape upShape; upShape.SetAsBox(_visibleSize.width/RATIO,0.1,b2Vec2(0,_visibleSize.height/RATIO),0); b2FixtureDef upFixture; upFixture.shape = &upShape; body->CreateFixture(&upFixture); //左 b2PolygonShape leftShape; leftShape.SetAsBox(0.1,_visibleSize.height/RATIO,0); b2FixtureDef leftFixture; leftFixture.shape = &leftShape; body->CreateFixture(&leftFixture); //右 b2PolygonShape rightShape; rightShape.SetAsBox(0.1,b2Vec2(_visibleSize.width/RATIO,0); b2FixtureDef rightFixture; rightFixture.shape = &rightShape; body->CreateFixture(&rightFixture); //设置地板,这里用的是精灵,图片可以自己设定,也可以用UI 进行绘图: Sprite *sp = Sprite::create("ground.png"); sp->setAnchorPoint(Vec2(0,0)); sp->setPosition(Vec2(0,100)); sp->setScale(_visibleSize.width/(sp->getContentSize().width + 300),_visibleSize.height/sp->getContentSize().height); this->addChild(sp); body->SetUserData(sp); } void HelloWorld::initGround() { //地板的位置和类型,(静态) b2BodyDef bodyDef; bodyDef.type = b2_staticBody; bodyDef.position = b2Vec2(0,0); b2Body *body = _world->CreateBody(&bodyDef); //指定形状,这一步骤必须有 b2PolygonShape groundShape; groundShape.SetAsBox(_visibleSize.width/RATIO,0.1);//visibleSize.height/2.0/RATIO); b2FixtureDef fixture; fixture.density = 1;//密度 fixture.friction = 0;//摩擦力 fixture.restitution = 0.8; fixture.shape = &groundShape; body->CreateFixture(&fixture); //设置地板,这里用的是精灵,图片可以自己设定,也可以用UI 进行绘图: Sprite *sp = Sprite::create("ground.png"); sp->setAnchorPoint(Vec2(0,0)); sp->setScale(_visibleSize.width/sp->getContentSize().width,_visibleSize.height/sp->getContentSize().height); this->addChild(sp); body->SetUserData(sp); } void HelloWorld::initLeftRightWall() { //左墙=================================== //地板的位置和类型,(静态) b2BodyDef bodyDef; bodyDef.type = b2_staticBody; bodyDef.position = b2Vec2(0,0); b2Body *body = _world->CreateBody(&bodyDef); //指定形状,这一步骤必须有 b2PolygonShape groundShape; groundShape.SetAsBox(0.1,_visibleSize.height/RATIO);//visibleSize.height/2.0/RATIO); b2FixtureDef fixture; fixture.density = 1;//密度 fixture.friction = 0.8;//摩擦力 fixture.restitution = 0.8; fixture.shape = &groundShape; body->CreateFixture(&fixture); body->SetUserData(nullptr); //右墙=================================== //地板的位置和类型,(静态) b2BodyDef bodyRightDef; bodyRightDef.type = b2_staticBody; bodyRightDef.position = b2Vec2(_visibleSize.width/RATIO,0); b2Body *bodyRight = _world->CreateBody(&bodyRightDef); //指定形状,这一步骤必须有 b2PolygonShape groundRightShape; groundRightShape.SetAsBox(0.1,_visibleSize.height/RATIO);//visibleSize.height/2.0/RATIO); b2FixtureDef fixtureRight; fixtureRight.density = 1;//密度 fixtureRight.friction = 0.8;//摩擦力 fixtureRight.restitution = 0.8; fixtureRight.shape = &groundRightShape; bodyRight->CreateFixture(&fixtureRight); bodyRight->SetUserData(nullptr); } void HelloWorld::initSky() { //地板的位置和类型,(静态) b2BodyDef bodyDef; bodyDef.type = b2_staticBody; bodyDef.position = b2Vec2(0,_visibleSize.height/RATIO); b2Body *body = _world->CreateBody(&bodyDef); //指定形状,这一步骤必须有 b2PolygonShape groundShape; groundShape.SetAsBox(_visibleSize.width/RATIO,0.1);//visibleSize.height/2.0/RATIO); b2FixtureDef fixture; fixture.density = 1;//密度 fixture.friction = 0.8;//摩擦力 fixture.restitution = 0.8; fixture.shape = &groundShape; body->CreateFixture(&fixture); body->SetUserData(nullptr); } void HelloWorld::update(float dt) { _world->Step(dt,10,10); Sprite * bird; for (b2Body *body = _world->GetBodyList(); body; body = body->GetNext()) { if (body->GetType() == b2_dynamicBody) { bird = (Sprite*)body->GetUserData(); bird->setPosition(Vec2(body->GetPosition().x*RATIO,body->GetPosition().y*RATIO));//设置动态物体的位置 } else if (body->GetType() == b2_staticBody) { } } } //// 两种方式接受点击事件,一种 //void HelloWorld::onTouchesBegan (const std::vector< Touch * > &touches,Event *unused_event) //{ // CCLOG("touch this"); //} bool HelloWorld::onTouchBegan(Touch* touch,Event *event) { return true; } void HelloWorld::onTouchEnded(cocos2d::Touch *touch,cocos2d::Event *unused_event) { CCLOG("touch is:%f---%f",touch->getLocation().x,touch->getLocation().y); //初始化球精灵1 initBall(touch->getLocation().x,touch->getLocation().y,0)); } 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); #endif /*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); }
ground.png
smallBall.png