`
445822357
  • 浏览: 742784 次
文章分类
社区版块
存档分类
最新评论

cocos2d-x 之 CCPhysicsSprite 基于物理引擎的Sprite

 
阅读更多

勤奋努力,持之以恒!

box2d简单介绍可参阅:http://blog.csdn.net/song_hui_xiang/article/details/34116399

写这篇文章主要是说明:对一个刚体施加一个力,用 GetWorldVector() 与不用的区别。刚开始学习box2d,因为这个问题被虐了好几天,贴出来一是分享,二是备忘。下面直接上代码:

.h

//
//  Game.h
//  HeroJump
//
//  Created by XiangZi on 14-6-27.
//
//

#ifndef __HeroJump__Game__
#define __HeroJump__Game__

#include "cocos2d.h"
#include "Box2D.h"
#include "cocos-ext.h"//用CCPhysicsSprite类需要导入此头文件
using namespace std;
USING_NS_CC_EXT;
USING_NS_CC;

enum GameTag{
    kTag,
};
enum MenuTag{
    
};
enum GamezOrder{
    zOrder,
};

class Game : public CCLayer {
public:
    ~Game();
    Game();
    static CCScene* scene();
    void initPhysics();
    virtual void draw();
    void update(float dt);
    CCPhysicsSprite* createNewPhysicsSprite(const char *imageName);
    
    virtual void onEnter();
    virtual void onExit();
    virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
    virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);
    virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);
private:
    b2World* world;
    CCSize size;
};

#endif /* defined(__HeroJump__Game__) */


.cpp

//
//  Game.cpp
//  HeroJump
//
//  Created by XiangZi on 14-6-27.
//
//

#include "Game.h"

#define PTM_RATIO 32

Game::Game()
{
    setAccelerometerEnabled( true );
    size = CCDirector::sharedDirector()->getWinSize();
    //创建物理世界
    b2Vec2 gravity;
    gravity.Set(0.0f, -10.0f);
    world = new b2World(gravity);
    world->SetAllowSleeping(true);
    world->SetContinuousPhysics(true);
    
    b2BodyDef groundBodyDef;
    groundBodyDef.position.Set(0, 0);
    b2Body* groundBody = world->CreateBody(&groundBodyDef);
    b2EdgeShape groundBox;
    // bottom
    groundBox.Set(b2Vec2(0,0), b2Vec2(size.width/PTM_RATIO,0));
    groundBody->CreateFixture(&groundBox,0);
    // top
    groundBox.Set(b2Vec2(0,size.height/PTM_RATIO), b2Vec2(size.width/PTM_RATIO,size.height/PTM_RATIO));
    groundBody->CreateFixture(&groundBox,0);
    // left
    groundBox.Set(b2Vec2(0,size.height/PTM_RATIO), b2Vec2(0,0));
    groundBody->CreateFixture(&groundBox,0);
    // right
    groundBox.Set(b2Vec2(size.width/PTM_RATIO,size.height/PTM_RATIO), b2Vec2(size.width/PTM_RATIO,0));
    groundBody->CreateFixture(&groundBox,0);
    
    this->initPhysics();
    scheduleUpdate();
}
Game::~Game()
{
    delete world;
    world = NULL;
}

void Game::initPhysics()
{
    CCPhysicsSprite* sprite = createNewPhysicsSprite("Icon.png");
    sprite->setPosition(ccp(size.width/2, size.height/2));
    this->addChild(sprite,1,1234);
}

//封装此方法用于创建一物理精灵
CCPhysicsSprite* Game::createNewPhysicsSprite(const char *imageName)
{
    CCPhysicsSprite* physicsSprite = CCPhysicsSprite::create(imageName);
    
    b2BodyDef bodyDef;
    bodyDef.type = b2_dynamicBody;
    
    b2Body* body = world->CreateBody(&bodyDef);
    
    b2PolygonShape polygonShape;
    polygonShape.SetAsBox(physicsSprite->getContentSize().width/PTM_RATIO/2, physicsSprite->getContentSize().height/PTM_RATIO/2);
    
    b2FixtureDef fixtureDef;
    fixtureDef.shape = &polygonShape;
    fixtureDef.density = 5.5f;
    fixtureDef.friction = 0.3f;
    fixtureDef.restitution = 0.1f;
    body->CreateFixture(&fixtureDef);
    
    physicsSprite->setPTMRatio(PTM_RATIO);
    physicsSprite->setB2Body(body);
    
    return physicsSprite;
}


bool Game::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
{
    CCPoint point = pTouch->getLocation();
    CCPhysicsSprite* sprite = (CCPhysicsSprite*)this->getChildByTag(1234);
    b2Body* body = sprite->getB2Body();
    
    float gravityX = 5.0f;
    float gravityY = 10.0f;
    
    //给body施加一个力。 GetWorldCenter()方法用来获取刚体的重心。
    //b2Vec2 force = body->GetWorldVector(b2Vec2(-gravityX,gravityY));  以此body的坐标系计算向量,body有转动向量方向也会随之转动。
    b2Vec2 force = b2Vec2(-gravityX,gravityY); //以整个wrold世界的坐标系计算向量,不随单个body装动而转动。
    
    if (point.x < size.width/2) {//点击屏幕左半边给予一个左上的速度
        force.x = -gravityX;
    }else{//点击屏幕右半边给予一个右上的速度
        force.x = gravityX;
    }
    //直接影响刚体的速度。setLinearVelocity添加的速度会覆盖刚体原有的速度。
    body->SetLinearVelocity(b2Vec2_zero);
    body->SetAngularVelocity(0);
    body->SetAwake(true);
    body->SetLinearVelocity(force);
    
    return true;
}
void Game::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent){}
void Game::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent){}

void Game::onEnter()
{
    CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, false);
    CCLayer::onEnter();
}
void Game::onExit()
{
    CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
    CCLayer::onExit();
}
void Game::update(float dt)
{
    int velocityIterations = 8;
    int positionIterations = 1;
    world->Step(1.0f/60.0f, velocityIterations, positionIterations);
}
void Game::draw()
{
    CCLayer::draw();
    ccGLEnableVertexAttribs( kCCVertexAttribFlag_Position );
    kmGLPushMatrix();
    world->DrawDebugData();
    kmGLPopMatrix();
}
CCScene* Game::scene()
{
    CCScene *scene = CCScene::create();
    CCLayer* layer = new Game();
    scene->addChild(layer);
    layer->release();
    return scene;
}


分享到:
评论

相关推荐

    Cocos2d-x实战:JS卷——Cocos2d-JS开发

    资源名称:Cocos2d-x实战:JS卷——Cocos2d-JS开发内容简介:本书是介绍Cocos2d-x游戏编程和开发技术书籍,介绍了使用Cocos2d-JS中核心类、瓦片地图、物理引擎、音乐音效、数据持久化、网络通信、性能优化、多平台...

    大富翁手机游戏开发实战基于Cocos2d-x3.2引擎

    资源名称:大富翁手机游戏开发实战基于Cocos2d-x3.2引擎内容简介:李德国编著的《大富翁手机游戏开发实战(基于 Cocos2d-x3.2引擎)》使用Cocos2d-x游戏引擎技术,带领读者一步一步从零开始进行大富翁移动游戏的开发...

    cocos2d-x-3.2旧版引擎下载

    cocos2d-x-3.2下载,不多说。或者可以下载另一个资源 cocos引擎老版本集合(cocos2d-x-2.2.1 - 3.5) http://download.csdn.net/download/crazymagicdc/9982656

    cocos2d-x-2.1.5

    cocos2d-x-2.1.5

    cocos2d-x事件类

    在使用cocos2d-x开发游戏的过程中,为了实现逻辑和显示相分离。 在下通宵了一个晚上,写出了该事件类。 谨记,该事件只能用于cocos2d-x中。 事件发送者需要继承EventDispatcher类 事件接收者需要继承EventHandle类...

    Cocos2d-x高级开发教程

    Cocos2d-x是移动跨平台开发最流行的游戏引擎,而本书是一本很全面的、比较‘接地气’的游戏开发教程。书中汇聚了热门手机游戏《捕鱼达人》开发的实战经验,作者从最基础的内容开始,逐步深入地介绍了Cocos2d-x的相关...

    Cocos2D-X游戏开发技术精解.pdf

    《Cocos2D-X游戏开发技术精解》详细介绍如何使用Cocos2D-X引擎开发自己的移动平台游戏。全书共15章,主要内容包括:Cocos2D-X引擎简介;如何建立跨平台的开发环境;引擎的核心模块——渲染框架;如何实现动态画面和...

    Cocos2D-X游戏开发技术精解

    资源名称:Cocos2D-X游戏开发技术精解内容简介:Cocos2D-X是一款支持多平台的 2D手机游戏引擎,支持iOS、Android、BlackBerry等众多平台。当前,很多移动平台流行的游戏,都是基于Cocos2D-X开发的。 《Cocos2D-X...

    大富翁手机游戏开发实战 基于Cocos2d-x3.2引擎

    李德国编著的《大富翁手机游戏开发实战(基于 Cocos2d-x3.2引擎)》使用Cocos2d-x游戏引擎技术,带领读者一步一步从零开始进行大富翁移动游戏的开发。本书根据大富翁项目一一展开讲解游戏开发过程中涉及的各方面内容...

    cocos2d-x实战项目

    cocos2d-x实战项目 01.cocos2d-x原理及环境配置.rar 03.cocostudio使用方法及UI控制.rar 04.XML文件读取与骨骼动画.rarcocos2d-x实战项目 01.cocos2d-x原理及环境配置.rar 03.cocostudio使用方法及UI控制.rar 04.XML...

    经典版本 方便下载 源码 旧版本 3.8 官网找不到了 cocos2d-x-3.8.zip

    经典版本 方便下载 源码 旧版本 3.8 官网找不到了 cocos2d-x-3.8.zip

    精通COCOS2D-X游戏开发 基础卷_2016.4-P399-13961841.pdf

    精通COCOS2D-X游戏开发 精通COCOS2D-X游戏开发 精通COCOS2D-X游戏开发 精通COCOS2D-X游戏开发 精通COCOS2D-X游戏开发

    cocos2d-x-3.4旧版引擎下载

    cocos2d-x-3.4下载,不多说。或者可以下载另一个资源 cocos引擎老版本集合(cocos2d-x-2.2.1 - 3.5) http://download.csdn.net/download/crazymagicdc/9982656

    cocos2d-x for xna 2D游戏引擎源码

    xna cocos2d-x是一个用C#编写的2D游戏引擎,基于[cocos2d-x][1]和使用MIT 协议。 引擎由 [cocos2d-x][1] 和 [OpenXLive][2] 联合开发。 cocos2d-x for xna is a 2D game engine in C#, based on [cocos2d-x][1] and ...

    cocos2d-x-3.0 类图

    这是我重新弄的cocos2d-x-3.0的类图.之前别人兄台弄的,有些不全面,有些地方错误.我这个可以说是最新的了.每个类添加了中文的详细注解,同时也添加了中文的类名称翻译.这样对cocos2d-x-3.0的框架比较好上手. 有兴趣的...

    Cocos2d-x 3.x游戏开发实战pdf含目录

    Cocos2d-x 3.x游戏开发实战pdf含目录,内容详细,强烈推荐给大家。

    Cocos2d-x-3.x游戏开发之旅

    Cocos2d-x-3.x游戏开发之旅-钟迪龙著 全新pdf版和附书代码(代码为工程文件,可复制) 附带目录标签

    cocos2d-x windows vs2010配置

    Cocos2d-x windows vs2010 配置图文详解

    Cocos2d-x游戏编程——C++篇 .iso

    Cocos2d-x游戏编程——C++篇(电子工业出版社,徐飞 著)书本配套的光盘代码,

    Cocos2d-x实战 JS卷 Cocos2d-JS开发

    Cocos2d-x实战 JS卷 Cocos2d-JS开发 PDF 电子书完整版本

Global site tag (gtag.js) - Google Analytics