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());
}
}