Cocos2dx 之 PhysicsHandler 简单实现

1.  类似于 AndEngine 里面的 PhysicsHandler,直接上代码

//
//  PhysicsHandler.h
//  Paopao_Game
//
//  Created by user on 13-2-19.
//
//

#ifndef __Paopao_Game__PhysicsHandler__
#define __Paopao_Game__PhysicsHandler__

#include <iostream>
#include "cocos2d.h"
using namespace cocos2d;


class PhysicsHandler : public CCNode
{
protected:
    
    // 速度
    float m_velocityX;
    float m_velocityY;
    
    // 加速度
    float m_accelerationX;
    float m_accelerationY;
    
    CCSprite* m_sprite;
    
public:
    
    PhysicsHandler(CCSprite* tSprite);
    virtual ~PhysicsHandler();
    
    void registUpdateHandler(SEL_SCHEDULE tPhysicsUpdate);
    void unregistUpdateHandler(SEL_SCHEDULE tPhysicsUpdate);
    
    void myupdate(float dt);
    
    
    
    //******************************//
    //   Geter & Setter
    //******************************//
    void setVelocityX(float vx);
    float getVelocityX();
    
    void setVelocityY(float vy);
    float getVelocityY();
    
    void setAccelerationX(float ax);
    float getAccelerationX();
    
    void setAccelerationY(float ay);
    float getAccelerationY();
    
    CCSprite* getSprite();
};



#endif /* defined(__Paopao_Game__PhysicsHandler__) */

//
//  PhysicsHandler.cpp
//  Paopao_Game
//
//  Created by user on 13-2-19.
//
//

#include "PhysicsHandler.h"

// 常量
static const float kUpdateInterval = 0.03;

PhysicsHandler::PhysicsHandler(CCSprite* tSprite)
{
    m_sprite = tSprite;
    m_velocityX = 0;
    m_velocityY = 0;
    m_accelerationX = 0;
    m_accelerationY = 0;
}
PhysicsHandler::~PhysicsHandler(){
    

}

void PhysicsHandler::registUpdateHandler(SEL_SCHEDULE tPhysicsUpdate)
{
    schedule(schedule_selector(PhysicsHandler::myupdate));
    m_sprite->schedule(tPhysicsUpdate, kUpdateInterval);
}
void PhysicsHandler::unregistUpdateHandler(SEL_SCHEDULE tPhysicsUpdate)
{
    unschedule(schedule_selector(PhysicsHandler::myupdate));
    m_sprite->unschedule(tPhysicsUpdate);
}

void PhysicsHandler::myupdate(float pSecondsElapsed)
{
    if (m_sprite) {
        
        //  先根据加速度计算速度
        if(m_accelerationX != 0 || m_accelerationY != 0) {
            this->m_velocityX += m_accelerationX * pSecondsElapsed;
            this->m_velocityY += m_accelerationY * pSecondsElapsed;
        }
        
        // 再根据速度调整位置
        if(m_velocityX != 0 || m_velocityY != 0) {
            CCPoint tPoint = m_sprite->getPosition();
            m_sprite->setPosition(ccp(tPoint.x + m_velocityX*pSecondsElapsed, tPoint.y + m_velocityY*pSecondsElapsed));
        }
    }
}

//-------------------------------------------//
//   Getter & Setter
//------------------------------------------.//
void PhysicsHandler::setVelocityX(float vx)
{
    m_velocityX = vx;
}
float PhysicsHandler::getVelocityX(){
    return m_velocityX;
}

void PhysicsHandler::setVelocityY(float vy){
    m_velocityY = vy;
}
float PhysicsHandler::getVelocityY(){
    return m_velocityY;
}

void PhysicsHandler::setAccelerationX(float ax){
    m_accelerationX = ax;
}
float PhysicsHandler::getAccelerationX(){
    return m_accelerationX;
}

void PhysicsHandler::setAccelerationY(float ay){
    m_accelerationY = ay;
}
float PhysicsHandler::getAccelerationY(){
    return m_accelerationY;
}

CCSprite* PhysicsHandler::getSprite()
{
    return m_sprite;
}


一个简单的应用

 ButtonSprite* playBtn = ButtonSprite::createButtonSprite("play.png");
    playBtn->setPosition(ccp(240, 400));
    playBtn->setOnClickListener(click_selector(MainMenu::btnCall));
    addChild(playBtn);
    
    PhysicsHandler* handler = new PhysicsHandler(playBtn);
    handler->autorelease();
    handler->setVelocityX(50);
    handler->setVelocityY(50);
    handler->registUpdateHandler(schedule_selector(MainMenu::phyUpdate));
    addChild(handler,0,kHanlder);

void MainMenu::phyUpdate(float dt)
{
    //
    //
    //  记住,谁注册这个,这里面的this就是谁.
     CCNode* parent = this->getParent();
    
    PhysicsHandler* handler = (PhysicsHandler*)parent->getChildByTag(kHanlder);
    CCPoint point = handler->getSprite()->getPosition();
    if (point.x >= G_width) {
        handler->setVelocityX(-handler->getVelocityX());
    }
    
    if (point.x <= 0) {
         handler->setVelocityX(-handler->getVelocityX());
    }
    
    if (point.y >= G_heigt) {
        handler->setVelocityY(-handler->getVelocityY());
    }
    
    if (point.y <= 0) {
        handler->setVelocityY(-handler->getVelocityY());
    }
}



你可能感兴趣的:(Cocos2dx 之 PhysicsHandler 简单实现)