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
HelloWorldScene.h
- #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.cpp
- #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__
- #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