1. 程式人生 > >25.cocos2d-x物理引擎(每點選一次螢幕新增一個小球)

25.cocos2d-x物理引擎(每點選一次螢幕新增一個小球)

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(); //1.重寫進入時的方法 void onEnter(); //2.給世界新增PhysicsBody void addEdges(); //3.新增一個小球 void addBall(float positionX,float positionY); void addBall(cocos2d::Vec2 position); // implement the "static create()" method manually CREATE_FUNC(HelloWorld); private
: Size visiableSize; }; #endif // __HELLOWORLD_SCENE_H__

HelloWorldScene.cpp檔案:


#include "HelloWorldScene.h"
#include "cocostudio/CocoStudio.h"
#include "ui/CocosGUI.h"

USING_NS_CC;

using namespace cocostudio::timeline;

Scene* HelloWorld::createScene()
{
    //1.有物理引擎世界的Scene
    auto scene = Scene::createWithPhysics();
    //2.輸出全部的除錯資訊
scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL); // '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; } auto rootNode = CSLoader::createNode("MainScene.csb"); visiableSize = Director::getInstance()->getVisibleSize(); addChild(rootNode); return true; } void HelloWorld::onEnter() { Layer::onEnter(); addEdges(); //正中間放置一個小球 addBall(visiableSize.width / 2, visiableSize.height / 2); //3.新增點選監聽事件 auto listener = EventListenerTouchOneByOne::create(); listener->onTouchBegan = [this](Touch *t, Event *e) { //4.點選位置新增一個小球 this->addBall(t->getLocation()); return false; }; Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener,this); } void HelloWorld::addEdges() { //寬高、設定邊框大小、3 auto body = PhysicsBody::createEdgeBox(visiableSize,PHYSICSBODY_MATERIAL_DEFAULT,3); auto edgeShape = Node::create(); edgeShape->setPhysicsBody(body); edgeShape->setPosition(visiableSize.width/2, visiableSize.height/2); addChild(edgeShape); } void HelloWorld::addBall(float positionX, float positionY) { auto ball = Sprite::create("ball1.png"); ball->setPhysicsBody(PhysicsBody::createBox(ball->getContentSize())); ball->setPosition(positionX, positionY); addChild(ball); } void HelloWorld::addBall(cocos2d::Vec2 position) { addBall(position.x, position.y); }