效果图:
.h文件:
#ifndef __HELLOWORLD_SCENE_H__ #define __HELLOWORLD_SCENE_H__ #include "cocos2d.h" class HelloWorld : public cocos2d::Layer { public: static cocos2d::Scene* createScene(); virtual bool init(); // 设置世界 void setPhyWorld(cocos2d::PhysicsWorld* world){ m_world = world; } // a selector callback void menuCloseCallback(cocos2d::Ref* pSender); // implement the "static create()" method manually CREATE_FUNC(HelloWorld); private: // 世界 cocos2d::PhysicsWorld* m_world; }; #endif // __HELLOWORLD_SCENE_H__
.cpp文件:
#include "HelloWorldScene.h" USING_NS_CC; Scene* HelloWorld::createScene() { auto scene = Scene::createWithPhysics(); // 设置调试模式 scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL); // 创建图层 PhysicsWorld* phyWorld = scene->getPhysicsWorld(); phyWorld->setGravity(Vec2(0, 0)); auto layer = HelloWorld::create(); // 为图层指定世界 layer->setPhyWorld(scene->getPhysicsWorld()); // 添加图层到场景 scene->addChild(layer); // 返回场景 return scene; } // on "init" you need to initialize your instance bool HelloWorld::init() { ////////////////////////////// // 1. super init first if ( !Layer::init() ) { return false; } Size visibleSize = Director::getInstance()->getVisibleSize(); Vec2 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(Vec2(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(Vec2::ZERO); this->addChild(menu, 1); ///////// auto triangle01 = Sprite::create("02.png"); triangle01->setPosition(visibleSize.width / 2, visibleSize.height / 2); triangle01->setScale(0.18); auto polygonBody = PhysicsBody::create(); Vec2 vec[3] = { Vec2(-39.00000, 814.50000), Vec2(15.00000, 742.50000), Vec2(-291.00000, 668.00000), }; polygonBody->addShape(PhysicsShapePolygon::create(vec, 3)); Vec2 vec01[3] = { Vec2(-39.00000, 814.50000), Vec2(15.00000, 742.50000), Vec2(-291.00000, 668.00000), }; polygonBody->addShape(PhysicsShapePolygon::create(vec01, 3)); Vec2 vec02[3] = { Vec2(-723.50000, -165.00000), Vec2(-812.50000, -61.00000), Vec2(-658.00000, 420.00000), }; polygonBody->addShape(PhysicsShapePolygon::create(vec02, 3)); Vec2 vec03[4] = { Vec2(-723.50000, -165.00000), Vec2(-460.50000, -581.00000), Vec2(-559.00000, -592.50000), Vec2(-812.50000, -61.00000), }; polygonBody->addShape(PhysicsShapePolygon::create(vec03, 4)); Vec2 vec04[4] = { Vec2(5.00000, -741.50000), Vec2(86.00000, -809.50000), Vec2(-559.00000, -592.50000), Vec2(-460.50000, -581.00000), }; polygonBody->addShape(PhysicsShapePolygon::create(vec04, 4)); Vec2 vec05[4] = { Vec2(542.00000, -505.50000), Vec2(609.50000, -540.00000), Vec2(86.00000, -809.50000), Vec2(5.00000, -741.50000), }; polygonBody->addShape(PhysicsShapePolygon::create(vec05, 4)); Vec2 vec06[3] = { Vec2(739.50000, -54.00000), Vec2(609.50000, -540.00000), Vec2(542.00000, -505.50000), }; polygonBody->addShape(PhysicsShapePolygon::create(vec06, 3)); Vec2 vec07[5] = { Vec2(-39.00000, 814.50000), Vec2(-38.00000, 814.50000), Vec2(520.50000, 627.00000), Vec2(548.00000, 499.50000), Vec2(15.00000, 742.50000), }; polygonBody->addShape(PhysicsShapePolygon::create(vec07, 5)); Vec2 vec08[3] = { Vec2(739.50000, -54.00000), Vec2(806.50000, 112.00000), Vec2(609.50000, -540.00000), }; polygonBody->addShape(PhysicsShapePolygon::create(vec08, 3)); Vec2 vec09[4] = { Vec2(548.00000, 499.50000), Vec2(520.50000, 627.00000), Vec2(806.50000, 112.00000), Vec2(739.50000, -54.00000) }; polygonBody->addShape(PhysicsShapePolygon::create(vec09, 4)); triangle->setPhysicsBody(polygonBody); //ActionInterval* cc01 = (ActionInterval*)triangle->runAction(RotateBy::create(6, -360)); //triangle->runAction(RepeatForever::create(cc01)); addChild(triangle); /////////////////// auto polygonBody01 = PhysicsBody::create(); Vec2 veca[3] = { Vec2(-39.00000, 814.50000), Vec2(15.00000, 742.50000), Vec2(-291.00000, 668.00000), }; polygonBody01->addShape(PhysicsShapePolygon::create(veca, 3)); Vec2 vec01a[3] = { Vec2(-39.00000, 814.50000), Vec2(15.00000, 742.50000), Vec2(-291.00000, 668.00000), }; polygonBody01->addShape(PhysicsShapePolygon::create(vec01a, 3)); Vec2 vec02a[3] = { Vec2(-723.50000, -165.00000), Vec2(-812.50000, -61.00000), Vec2(-658.00000, 420.00000), }; polygonBody01->addShape(PhysicsShapePolygon::create(vec02a, 3)); Vec2 vec03a[4] = { Vec2(-723.50000, -165.00000), Vec2(-460.50000, -581.00000), Vec2(-559.00000, -592.50000), Vec2(-812.50000, -61.00000), }; polygonBody01->addShape(PhysicsShapePolygon::create(vec03a, 4)); Vec2 vec04a[4] = { Vec2(5.00000, -741.50000), Vec2(86.00000, -809.50000), Vec2(-559.00000, -592.50000), Vec2(-460.50000, -581.00000), }; polygonBody01->addShape(PhysicsShapePolygon::create(vec04a, 4)); Vec2 vec05a[4] = { Vec2(542.00000, -505.50000), Vec2(609.50000, -540.00000), Vec2(86.00000, -809.50000), Vec2(5.00000, -741.50000), }; polygonBody01->addShape(PhysicsShapePolygon::create(vec05a, 4)); Vec2 vec06a[3] = { Vec2(739.50000, -54.00000), Vec2(609.50000, -540.00000), Vec2(542.00000, -505.50000), }; polygonBody01->addShape(PhysicsShapePolygon::create(vec06a, 3)); Vec2 vec07a[5] = { Vec2(-39.00000, 814.50000), Vec2(-38.00000, 814.50000), Vec2(520.50000, 627.00000), Vec2(548.00000, 499.50000), Vec2(15.00000, 742.50000), }; polygonBody01->addShape(PhysicsShapePolygon::create(vec07a, 5)); Vec2 vec08a[3] = { Vec2(739.50000, -54.00000), Vec2(806.50000, 112.00000), Vec2(609.50000, -540.00000), }; polygonBody01->addShape(PhysicsShapePolygon::create(vec08a, 3)); Vec2 vec09a[4] = { Vec2(548.00000, 499.50000), Vec2(520.50000, 627.00000), Vec2(806.50000, 112.00000), Vec2(739.50000, -54.00000) }; polygonBody01->addShape(PhysicsShapePolygon::create(vec09a, 4)); triangle01->setPhysicsBody(polygonBody01); ActionInterval* cc02 = (ActionInterval*)triangle01->runAction(RotateBy::create(1.5, -360)); triangle01->runAction(RepeatForever::create(cc02)); addChild(triangle01); return true; } void HelloWorld::menuCloseCallback(Ref* pSender) { Director::getInstance()->end(); #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) exit(0); #endif }