青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 132  文章 - 51  trackbacks - 0
<2010年12月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

常用鏈接

留言簿(7)

隨筆分類

隨筆檔案

文章分類

文章檔案

cocos2d-x

OGRE

OPenGL

搜索

  •  

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

根據(jù)上一節(jié)的教程,我用C++更改了教程,我用的cocos2d-2.0-rc2-x-2.0.1版本,略微有些不同,都是小細(xì)節(jié),直接貼上代碼
HelloWorldScene.h

#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__

#include 
<Box2D/Box2D.h>
#include 
"cocos2d.h"
#include 
<list>
using std::list;

class MyContact
{
public:
  b2Fixture
* fixtureA;
  b2Fixture
* fixtureB;
}
;

// Contact listener
class MyContactListener : public b2ContactListener
{
  
// Callbacks for derived classes.
  virtual void BeginContact(b2Contact* contact) 
  

    
if (contact)
    
{
      MyContact mc;
      mc.fixtureA 
= contact->GetFixtureA();
      mc.fixtureB 
= contact->GetFixtureB();

      contact_list.push_back(mc);
    }

    B2_NOT_USED(contact); 
  }

  
virtual void EndContact(b2Contact* contact) 
  

    contact_list.clear();
    B2_NOT_USED(contact); 
  }

  
virtual void PreSolve(b2Contact* contact, const b2Manifold* oldManifold)
  
{
    B2_NOT_USED(contact);
    B2_NOT_USED(oldManifold);
  }

  
virtual void PostSolve(const b2Contact* contact, const b2ContactImpulse* impulse)
  
{
    B2_NOT_USED(contact);
    B2_NOT_USED(impulse);
  }


public:
  std::list
<MyContact> contact_list;
}
;

class HelloWorld : public cocos2d::CCLayer
{
public:
    HelloWorld();
    
~HelloWorld();
    
// Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone
    virtual bool init();  

    
// there's no 'id' in cpp, so we recommand to return the exactly class pointer
    static cocos2d::CCScene* scene();
    
    
// a selector callback
    void menuCloseCallback(CCObject* pSender);
        
    
virtual void ccTouchesBegan(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);
    
virtual void ccTouchesMoved(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);
    
virtual void ccTouchesEnded(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);
    
virtual void ccTouchesCancelled(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);

    cocos2d::CCTMXLayer 
*baseLayer;

    
// implement the "static node()" method manually
    LAYER_CREATE_FUNC(HelloWorld);

private:
  
// Update per second
  void secondUpdate(float dt)  
  
{  
    spawnCat();
  }

  
void tick(float dt);

  
// spawn a car
  void spawnCar();

  
// spawn a car
  void spawnCat();

  
// Sprite move over call back
  void spriteDone(cocos2d::CCNode* sender);

  
// Add contact b2box for sprite
  void addBoxBodyForSprite(cocos2d::CCSprite* sprite);

  b2World
* world;
  MyContactListener
* contactListener; // Contact event listener
}
;

#endif // __HELLOWORLD_SCENE_H__

 

 

HelloWorldScene.cpp

#include "HelloWorldScene.h"

USING_NS_CC;
USING_NS_CC_EXT;
using namespace std;

#define TILE_SIZE 32
#define PT_RATIO 32  // 這個(gè)數(shù)一般定義為: 32.0,在box 世界中 是以 米 為單位的,這里是將坐標(biāo)兌換為box世界中的米,即除以 PTM_RATIO

//--------------------------------------------

HelloWorld::HelloWorld()
{

}


HelloWorld::
~HelloWorld()
{
  
if(world)
    delete world;
}


CCScene
* HelloWorld::scene()
{
  
// 'scene' is an autorelease object
  CCScene *scene = CCScene::create();

  
// 'layer' is an autorelease object
  HelloWorld *layer = HelloWorld::create();

  
// add layer as a child to scene
  scene->addChild(layer);

  
// return the scene
  return scene;
}


enum 
{
    kTagTileMap 
= 1,
}
;

CCLabelTTF
* pLabel;
// on "init" you need to initialize your instance
bool HelloWorld::init()
{
  
//////////////////////////////
  // 1. super init first
  if ( !CCLayer::init() )
  
{
    
return false;
  }


  pLabel 
= CCLabelTTF::create("Collsion""Arial"24);
  CCSize size 
= CCDirector::sharedDirector()->getWinSize();

  
// position the label on the center of the screen
  pLabel->setPosition( ccp(size.width / 2, size.height - 50) );

  
// add the label as a child to this layer
  this->addChild(pLabel, 10);

  
// create physic world
  b2Vec2 gravity(0,0);
  world 
= new b2World(gravity);
  world
->SetAllowSleeping(false);

  contactListener 
= new MyContactListener();
  world
->SetContactListener(contactListener);

  spawnCar();
    
  schedule(schedule_selector(HelloWorld::tick));
  schedule(schedule_selector(HelloWorld::secondUpdate), 
1.f);
  setTouchEnabled(
true);
  
return true;
}



void HelloWorld::tick(float dt)
{
  
if (world)
    world
->Step(dt, 1010);

  
// 基于cocos2d的精靈位置來(lái)更新box2d的body位置
  for(b2Body* b = world->GetBodyList(); b; b = b->GetNext())
  
{
    
if (b->GetUserData() != NULL)
    
{
      CCSprite
* sprite = (CCSprite*)b->GetUserData();
      
if (sprite)
      
{
        b2Vec2 pt 
= b2Vec2((float)(sprite->getPosition().x / PT_RATIO), (float)(sprite->getPosition().y / PT_RATIO));
        
float angle = (CCFloat)CC_DEGREES_TO_RADIANS(sprite->getRotation());
        b
->SetTransform(pt, angle);
      }

    }

  }


  std::list
<b2Body*> toDestroy_list;

  
for( std::list<MyContact>::iterator it = contactListener->contact_list.begin(); 
                              it 
!= contactListener->contact_list.end();
                              
++it)
  
{
    MyContact
& contact = *it;

    b2Body
* bodyA = contact.fixtureA->GetBody();
    b2Body
* bodyB = contact.fixtureB->GetBody();

    CCSprite
* sa = (CCSprite*)bodyA->GetUserData();
    CCSprite
* sb = (CCSprite*)bodyB->GetUserData();
    
if (sa && sb)
    
{
      
if (sa->getTag() == 1 && sb->getTag() == 2)
        toDestroy_list.push_back(bodyB);
      
else if (sa->getTag() == 2 && sa->getTag() == 1)
        toDestroy_list.push_back(bodyA);
    }

  }

  
  
// Destroy contact item.
  std::list<b2Body*>::iterator it = toDestroy_list.begin();
  
while(it != toDestroy_list.end())
  
{
    
if ((*it)->GetUserData() != NULL)
    
{
      CCSprite
* sprite = (CCSprite*)((*it)->GetUserData());
      
if (sprite)
      
{
        removeChild(sprite, 
true);
      }

      world
->DestroyBody(*it);
    }


    
++it;
  }


  toDestroy_list.clear();
  
}


void HelloWorld::spawnCar()
{
  CCSprite
* car = CCSprite::spriteWithFile("images/car.png");
  car
->setPosition(ccp(100,100));

  car
->runAction(CCRepeatForever::actionWithAction((CCActionInterval*)CCSequence::actions(
    CCMoveTo::actionWithDuration(
1.0f, ccp(300,100)),
    CCMoveTo::actionWithDuration(
1.0f, ccp(200,200)),
    CCMoveTo::actionWithDuration(
1.0f, ccp(100,100)),
    NULL
    )));

  addBoxBodyForSprite(car);
  
this->addChild(car, 11);
}


void HelloWorld::spawnCat()
{
  CCSize winSize 
= CCDirector::sharedDirector()->getWinSize();
  CCSprite
* cat = CCSprite::spriteWithFile("images/cat.png");

  
float minY = cat->getContentSize().height/2;
  
float maxY = winSize.height - cat->getContentSize().height/2;
  
float y = minY + rand() % (int)(maxY - minY);

  
float startX = winSize.width + cat->getContentSize().width/2;
  
float endX = -cat->getContentSize().width/2;

  CCPoint startPos 
= ccp(startX, y);
  CCPoint endPos 
= ccp(endX, y);

  cat
->setPosition(startPos);

  cat
->runAction(CCSequence::actions(CCMoveTo::actionWithDuration(10.f, endPos), 
    CCCallFuncN::actionWithTarget(
this, callfuncN_selector(HelloWorld::spriteDone)), NULL));


  addBoxBodyForSprite(cat);
  addChild(cat, 
12);
}


void HelloWorld::addBoxBodyForSprite(cocos2d::CCSprite* sprite)
{
  
//PTM_RATIO  ,這個(gè)數(shù)一般定義為: 32.0,在box 世界中 是以 米 為單位的,這里是將坐標(biāo)兌換為box世界中的米,即除以 PTM_RATIO

  
// Create physic body for cat
  b2PolygonShape polygon;
  polygon.SetAsBox((
float)sprite->getContentSize().width/PT_RATIO/2, (float)sprite->getContentSize().height/PT_RATIO/2);

  b2FixtureDef spriteShapeDef;
  spriteShapeDef.shape 
= &polygon;
  spriteShapeDef.density 
= 10.f;
  spriteShapeDef.isSensor 
= true;   // 對(duì)象之間有碰撞檢測(cè)但是又不想讓它們有碰撞反應(yīng)

  b2BodyDef bd;
  bd.type 
= b2_dynamicBody;
  bd.position 
= b2Vec2((float)(sprite->getPosition().x / PT_RATIO),
    (
float)(sprite->getPosition().y /PT_RATIO));
  bd.userData 
= sprite;

  b2Body
* spriteBody = world->CreateBody(&bd);
  spriteBody
->CreateFixture(&spriteShapeDef);
}




void HelloWorld::spriteDone(CCNode* sender)
{
  
// sprites被銷毀的時(shí)候,我們需要銷毀Box2d的body
  CCSprite* sprite = dynamic_cast<CCSprite*>(sender);
  
if (sprite)
  
{
    b2Body
* spriteBody = NULL;
    
for(b2Body* b = world->GetBodyList(); b; b=b->GetNext())
    
{
      
if (b->GetUserData() != NULL)
      
{
        CCSprite
* curSprite = (CCSprite*)b->GetUserData();
        
if (curSprite == sprite)
        
{
          spriteBody 
= b;

          removeChild(sprite, 
true);
          world
->DestroyBody(spriteBody);
          
break;
        }

      }


      
//if (spriteBody)
      
//{
      
//  world->DestroyBody(spriteBody);
      
//}

      
// removeChild(sprite, true);
    }

  }

}


void HelloWorld::ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent)
{
  CCSetIterator iter 
= pTouches->begin();
  
for (; iter != pTouches->end(); iter++)
  
{
    CCTouch
* pTouch = (CCTouch*)(*iter);
    CCPoint pos 
= pTouch->locationInView();
    pos 
= CCDirector::sharedDirector()->convertToGL(pos);

  }

}


void HelloWorld::ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent)
{
  CCSetIterator iter 
= pTouches->begin();
  
for (; iter != pTouches->end(); iter++)
  
{
    CCTouch
* pTouch = (CCTouch*)(*iter);
    CCPoint pos 
= pTouch->locationInView();

    CCPoint touchLocation 
= pTouch->locationInView();    
    CCPoint prevLocation 
= pTouch->previousLocationInView();    
    
/*    touchLocation = CCDirector::sharedDirector()->convertToGL( touchLocation );
    prevLocation = CCDirector::sharedDirector()->convertToGL( prevLocation );
    
    CCPoint diff = ccpSub(touchLocation, prevLocation);
    
    CCNode *node = getChildByTag(kTagTileMap);
    CCPoint currentPos = node->getPosition();

    node->setPosition( ccpAdd(currentPos, diff) )
*/
;
  }

}


void HelloWorld::ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent)
{
  CCSetIterator iter 
= pTouches->begin();
  
for (; iter != pTouches->end(); iter++)
  
{
    CCTouch
* pTouch = (CCTouch*)(*iter);
  }

}


void HelloWorld::ccTouchesCancelled(CCSet *pTouches, CCEvent *pEvent)
{
  ccTouchesEnded(pTouches, pEvent);
}



查看源代碼

posted on 2012-07-12 15:21 風(fēng)輕云淡 閱讀(9708) 評(píng)論(3)  編輯 收藏 引用

FeedBack:
# re: cocos2d-x 使用box2d來(lái)做碰撞檢測(cè)(且僅用來(lái)做碰撞檢測(cè))(二) 2012-09-22 11:01 jasonllinux
你好,請(qǐng)問(wèn)box2d的include如何設(shè)置的
我在 eclipse的include里面add了box2d的路徑
但是發(fā)現(xiàn)編譯的時(shí)候時(shí)好時(shí)壞的  回復(fù)  更多評(píng)論
  
# re: cocos2d-x 使用box2d來(lái)做碰撞檢測(cè)(且僅用來(lái)做碰撞檢測(cè))(二) 2014-04-01 16:32 zngto
為什么我把這段執(zhí)行后監(jiān)聽(tīng)不到剛體碰撞呢?  回復(fù)  更多評(píng)論
  

只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
      <noscript id="pjuwb"></noscript>
            <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
              <dd id="pjuwb"></dd>
              <abbr id="pjuwb"></abbr>
              亚洲日本在线视频观看| 99国产精品国产精品久久| 久久免费视频网| 午夜精品久久久久影视| 亚洲性色视频| 欧美中文在线视频| 免播放器亚洲| 欧美日韩1080p| 国产精品久久久久久福利一牛影视| 国产精品狠色婷| 国内成人自拍视频| 亚洲欧洲精品一区二区三区| 在线视频亚洲一区| 久久精品国产亚洲aⅴ| 久久综合中文| 99av国产精品欲麻豆| 亚洲伊人伊色伊影伊综合网| 久久精品动漫| 欧美全黄视频| 国产欧美欧美| 妖精视频成人观看www| 久久精品久久99精品久久| 欧美激情在线播放| 欧美精品亚洲一区二区在线播放| 亚洲一区二区三区精品视频| 欧美在线在线| 欧美大香线蕉线伊人久久国产精品| 一区二区三区国产| 久久久天天操| 国产精品国产三级国产专播精品人| 黄色成人在线| 亚洲欧美日韩精品一区二区| 欧美大胆成人| 欧美在线欧美在线| 国产精品蜜臀在线观看| 最新亚洲激情| 国产精品乱码妇女bbbb| 国产精品一区二区你懂得| 亚洲黄色成人久久久| 亚洲一区二区黄| 欧美国产激情| 久久精品在线视频| 国产乱人伦精品一区二区| 一本色道久久综合一区| 久久久久女教师免费一区| 亚洲一区二区四区| 欧美日一区二区在线观看| 亚洲欧洲一区二区在线观看 | 欧美激情一区二区三区全黄| 一区二区三区在线看| 亚洲欧洲av一区二区三区久久| 亚洲激情一区二区| 欧美成人免费网| 亚洲国产精品va在线观看黑人| 久久久欧美精品sm网站| 午夜国产精品影院在线观看| 国产精品久久久久影院亚瑟| 欧美激情精品久久久| 一个人看的www久久| 亚洲黄色片网站| 久久露脸国产精品| 国产亚洲观看| 久久久精品网| 久久久久久久一区二区三区| 精品999网站| 久久一区二区精品| 久久久人成影片一区二区三区| 国产一区自拍视频| 久久综合网络一区二区| 久久综合九色欧美综合狠狠| 亚洲国产综合91精品麻豆| 欧美粗暴jizz性欧美20| 欧美激情一区二区| 亚洲午夜电影| 午夜久久黄色| 在线电影国产精品| 亚洲精品久久久久久久久| 欧美日韩一区二区三区免费| 亚洲综合成人在线| 久久大逼视频| 亚洲国产成人av好男人在线观看| 亚洲高清视频一区二区| 欧美日本一区| 欧美一区二区三区视频在线观看| 欧美亚洲三级| 亚洲精品看片| 亚洲欧美资源在线| 亚洲清纯自拍| 亚洲无线视频| 在线国产欧美| 欧美成人在线免费视频| 欧美成在线观看| 午夜精品久久99蜜桃的功能介绍| 欧美一区二区福利在线| 男女精品视频| 国产日韩欧美另类| 欧美成人伊人久久综合网| 欧美阿v一级看视频| 亚洲一区二区免费看| 午夜国产不卡在线观看视频| 亚洲国产精品欧美一二99| 99国产精品国产精品久久| 黄色精品一区| 一本综合精品| 亚洲激情视频在线| 羞羞答答国产精品www一本| 日韩一级黄色片| 午夜久久电影网| 一区二区不卡在线视频 午夜欧美不卡在| 一区二区三区四区蜜桃| 亚洲欧洲另类国产综合| 亚洲欧美怡红院| avtt综合网| 免费成人高清视频| 久久久久天天天天| 国产精品综合不卡av| 亚洲免费播放| 亚洲日本久久| 久久久国产精彩视频美女艺术照福利| 亚洲四色影视在线观看| 欧美mv日韩mv亚洲| 免费欧美日韩国产三级电影| 国产欧美短视频| 一区二区免费看| 亚洲人成免费| 亚洲一区二区综合| 一区二区三区久久| 欧美激情bt| 亚洲高清一区二区三区| 伊大人香蕉综合8在线视| 欧美一级免费视频| 亚洲欧美在线另类| 国产精品激情| 亚洲五月六月| 亚洲网站啪啪| 欧美视频一区二区| 日韩一区二区精品在线观看| 中日韩视频在线观看| 欧美精品一线| 亚洲巨乳在线| 亚洲午夜国产成人av电影男同| 美日韩免费视频| 亚洲高清资源| 在线视频欧美日韩精品| 国产精品久久久久久久久动漫| 亚洲国产精品99久久久久久久久| 亚洲精品日韩精品| 欧美日韩亚洲免费| 亚洲一区二区综合| 久久五月激情| 亚洲国产精品成人一区二区| 蜜臀久久久99精品久久久久久| 亚洲国产视频直播| 在线视频你懂得一区| 国产麻豆一精品一av一免费| 久久爱www.| 亚洲高清视频中文字幕| 一区二区三区视频观看| 国产精品亚洲片夜色在线| 欧美在线观看天堂一区二区三区| 久久久噜久噜久久综合| 亚洲视频成人| 久久综合九色九九| 国模私拍一区二区三区| 久久男女视频| 日韩视频二区| 欧美一区二区三区免费大片| 一区在线影院| 欧美日韩午夜剧场| 欧美亚洲综合久久| 久久精品二区亚洲w码| 在线欧美小视频| 欧美日韩亚洲视频| 欧美一区在线看| 亚洲国产日韩一区| 久久成人18免费观看| 亚洲精品美女久久7777777| 国产精品嫩草久久久久| 免费亚洲视频| 亚洲欧美成aⅴ人在线观看| 免费日韩成人| 欧美一级视频| 日韩午夜三级在线| 黄色日韩在线| 国产精品女主播| 欧美噜噜久久久xxx| 久久成人久久爱| 亚洲一区精品电影| 日韩午夜在线观看视频| 免费精品视频| 久久精品论坛| 亚洲欧美网站| 亚洲性av在线| 中文av一区特黄| 亚洲高清免费在线| 激情久久久久久久| 国产日韩欧美一区| 国产精品av久久久久久麻豆网| 欧美成人免费在线| 久久久亚洲影院你懂的|