HelloWorldScene.h
#ifndef __HELLOWORLD_SCENE_H__#define __HELLOWORLD_SCENE_H__#include "cocos2d.h"USING_NS_CC;class HelloWorld : public cocos2d::Layer{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 returns bool,instead of returning 'ID' in cocos2d-iphone virtual bool init(); // a selector callback voID menuCloseCallback(Object* pSender); // implement the "static create()" method manually CREATE_FUNC(HelloWorld); voID setPhyWorld(PhysicsWorld* world){m_world = world;} virtual bool ontouchBegan(touch *touch,Event *unused_event); virtual voID ontouchended(touch *touch,Event *unused_event); voID addNewSpriteAtposition(Point p);private: PhysicsWorld* m_world; //bool onContactBegin(EventCustom* event,const PhysicsContact& contact); bool onContactBegin(PhysicsContact& contact);};#endif // __HELLOWORLD_SCENE_H__
HelloWorldScene.cpp
#include "HelloWorldScene.h"USING_NS_CC;Scene* HelloWorld::createScene(){ // 'scene' is an autorelease object //add physicals auto scene = Scene::createWithPhysics(); //DrawMask参数可以选择打开绘制哪些部分比如,Joint、Shape、Contact等等 scene->getPhysicsWorld()->setDeBUGDrawMask(PhysicsWorld::DEBUGDRAW_ALL); //创建一个边界 Size visibleSize = Director::getInstance()->getVisibleSize(); //使用PhysicalsBody的create方法创建自己想要的物体。 //PHYSICSBODY_MATERIAL_DEFAulT宏表示的是创建的Body的默认材质,3是边线宽度。编译运行我们会看到场景边上有红色的边界。 auto body = PhysicsBody::createEdgeBox(visibleSize,PHYSICSBODY_MATERIAL_DEFAulT,3); auto edgeNode = Node::create(); edgeNode->setposition(Point(visibleSize.wIDth/2,visibleSize.height/2)); edgeNode->setPhysicsBody(body); scene->addChild(edgeNode); // 'layer' is an autorelease object auto layer = HelloWorld::create(); //将这个World传到Layer中。所以我们在HelloWorld类中加入一个函数。将这个world存起来。 layer->setPhyWorld(scene->getPhysicsWorld()); // add layer as a child to scene scene->addChild(layer); // return the scene return scene;}// on "init" you need to initialize your instancebool HelloWorld::init(){ ////////////////////////////// // 1. super init first if ( !Layer::init() ) { return false; } Size visibleSize = Director::getInstance()->getVisibleSize(); Point origin = Director::getInstance()->getVisibleOrigin(); ///////////////////////////// // 2. add a menu item with "X" image,which is clicked to quit the program // you may modify it. // add a "close" icon to exit the progress. it's an autorelease object auto closeItem = MenuItemImage::create( "Closenormal.png","CloseSelected.png",CC_CALLBACK_1(HelloWorld::menuCloseCallback,this)); closeItem->setposition(Point(origin.x + visibleSize.wIDth - closeItem->getContentSize().wIDth/2,origin.y + closeItem->getContentSize().height/2)); // create menu,it's an autorelease object auto menu = Menu::create(closeItem,NulL); menu->setposition(Point::ZERO); this->addChild(menu,1); ///////////////////////////// // 3. add your codes below... // add a label shows "Hello World" // create and initialize a label auto label = LabelTTF::create("Hello World","Arial",24); // position the label on the center of the screen label->setposition(Point(origin.x + visibleSize.wIDth/2,origin.y + visibleSize.height - label->getContentSize().height)); // add the label as a child to this layer this->addChild(label,1); // new way to enable touch auto touchListener = EventListenertouchOneByOne::create(); touchListener->ontouchBegan = CC_CALLBACK_2(HelloWorld::ontouchBegan,this); touchListener->ontouchended = CC_CALLBACK_2(HelloWorld::ontouchended,this); _eventdispatcher->addEventListenerWithSceneGraPHPriority(touchListener,this); // 碰撞检测回调 auto contactListener = EventListenerPhysicsContact::create(); contactListener->onContactBegin = CC_CALLBACK_1(HelloWorld::onContactBegin,this); _eventdispatcher->addEventListenerWithSceneGraPHPriority(contactListener,this); return true;}bool HelloWorld::onContactBegin(PhysicsContact& contact){ auto sp = (Sprite*)contact.getShapeA()->getbody()->getNode(); int tag = sp->getTag(); cclOG("onContactBegin: %d",tag); return true;}bool HelloWorld::ontouchBegan(touch *touch,Event *unused_event){ return true;}voID HelloWorld::ontouchended(touch *touch,Event *unused_event){ auto location = touch->getLocation(); addNewSpriteAtposition(location);}//然后我们来实现addNewSpriteAtposition函数。//关联body与sprite从未如此简单,我们只需创建一个body,创建一个sprite然后将body设置为sprite的body即可。voID HelloWorld::addNewSpriteAtposition(Point p){ auto sprite = Sprite::create("ball.png"); sprite->setTag(1); auto body = PhysicsBody::createCircle(sprite->getContentSize().wIDth / 2); sprite->setPhysicsBody(body); sprite->setposition(p); this->addChild(sprite);}voID HelloWorld::menuCloseCallback(Object* pSender){ //控制PhysicsWorld deBUGDraw的绘制 if(m_world->getDeBUGDrawMask() != PhysicsWorld::DEBUGDRAW_NONE) { m_world->setDeBUGDrawMask(PhysicsWorld::DEBUGDRAW_NONE); } else { m_world->setDeBUGDrawMask(PhysicsWorld::DEBUGDRAW_ALL); }}
AppDelegate.h
#ifndef _APP_DELEGATE_H_#define _APP_DELEGATE_H_#include "cocos2d.h"/**@brIEf The cocos2d Application.The reason for implement as private inheritance is to hIDe some interface call by Director.*/class AppDelegate : private cocos2d::Application{public: AppDelegate(); virtual ~AppDelegate(); /** @brIEf Implement Director and Scene init code here. @return true Initialize success,app continue. @return false Initialize Failed,app terminate. */ virtual bool applicationDIDFinishLaunching(); /** @brIEf The function be called when the application enter background @param the pointer of the application */ virtual voID applicationDIDEnterBackground(); /** @brIEf The function be called when the application enter foreground @param the pointer of the application */ virtual voID applicationWillEnterForeground();};#endif // _APP_DELEGATE_H_
AppDelegate.cpp
#include "AppDelegate.h"#include "HelloWorldScene.h"USING_NS_CC;AppDelegate::AppDelegate() {}AppDelegate::~AppDelegate() {}bool AppDelegate::applicationDIDFinishLaunching() { // initialize director // initialize director auto director = Director::getInstance(); auto glvIEw = director->getopenGLVIEw(); if(!glvIEw) { glvIEw = GLVIEwImpl::create("My Game"); 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.0 / 60); glvIEw->setDesignResolutionSize(800,600,ResolutionPolicy::EXACT_FIT); // 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. When comes a phone call,it's be invoked toovoID AppDelegate::applicationDIDEnterBackground() { Director::getInstance()->stopAnimation(); // if you use SimpleAudioEngine,it must be pause // SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic();}// this function will be called when the app is active againvoID AppDelegate::applicationWillEnterForeground() { Director::getInstance()->startAnimation(); // if you use SimpleAudioEngine,it must resume here // SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic();}
用到的图片
总结
以上是内存溢出为你收集整理的在Cocos2d-x3.0里面如何使用物理引擎:d球全部内容,希望文章能够帮你解决在Cocos2d-x3.0里面如何使用物理引擎:d球所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)