在Cocos2d-x3.0里面如何使用物理引擎:d球

在Cocos2d-x3.0里面如何使用物理引擎:d球,第1张

概述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 w

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球所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1014445.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存