2010-09-14 16:23:50 +08:00
|
|
|
#include "Box2dView.h"
|
|
|
|
#include "GLES-Render.h"
|
|
|
|
#include "Test.h"
|
|
|
|
|
|
|
|
//#pragma comment(lib, "libgles_cm.lib")
|
|
|
|
//#pragma comment(lib, "libEGL.lib")
|
|
|
|
|
|
|
|
#define kAccelerometerFrequency 30
|
|
|
|
#define FRAMES_BETWEEN_PRESSES_FOR_DOUBLE_CLICK 10
|
|
|
|
|
|
|
|
extern int g_totalEntries;
|
|
|
|
|
|
|
|
Settings settings;
|
|
|
|
|
|
|
|
enum
|
|
|
|
{
|
|
|
|
kTagBox2DNode,
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
//------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
// MenuLayer
|
|
|
|
//
|
|
|
|
//------------------------------------------------------------------
|
|
|
|
enum
|
|
|
|
{
|
|
|
|
IDC_NEXT = 100,
|
|
|
|
IDC_BACK,
|
|
|
|
IDC_RESTART
|
|
|
|
};
|
|
|
|
|
|
|
|
MenuLayer::MenuLayer(void)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
MenuLayer::~MenuLayer(void)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
MenuLayer* MenuLayer::menuWithEntryID(int entryId)
|
|
|
|
{
|
|
|
|
MenuLayer* pLayer = new MenuLayer();
|
|
|
|
pLayer->initWithEntryID(entryId);
|
|
|
|
pLayer->autorelease();
|
|
|
|
|
|
|
|
return pLayer;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool MenuLayer::initWithEntryID(int entryId)
|
|
|
|
{
|
|
|
|
CGSize s = CCDirector::getSharedDirector()->getWinSize();
|
|
|
|
|
|
|
|
m_entryID = entryId;
|
|
|
|
|
|
|
|
setIsTouchEnabled( true );
|
|
|
|
|
|
|
|
Box2DView* view = Box2DView::viewWithEntryID( entryId );
|
|
|
|
addChild(view, 0, kTagBox2DNode);
|
|
|
|
view->setScale(15);
|
|
|
|
view->setAnchorPoint( ccp(0,0) );
|
|
|
|
view->setPosition( ccp(s.width/2, s.height/3) );
|
|
|
|
|
|
|
|
CCLabel* label = CCLabel::labelWithString(view->title().c_str(), "Arial", 28);
|
|
|
|
addChild(label, 1);
|
|
|
|
label->setPosition( ccp(s.width/2, s.height-50) );
|
|
|
|
|
2010-09-16 11:35:58 +08:00
|
|
|
CCMenuItemImage *item1 = CCMenuItemImage::itemFromNormalImage("Images/b1.png", "Images/b2.png", this, menu_selector(MenuLayer::backCallback) );
|
|
|
|
CCMenuItemImage *item2 = CCMenuItemImage::itemFromNormalImage("Images/r1.png","Images/r2.png", this, menu_selector(MenuLayer::restartCallback) );
|
|
|
|
CCMenuItemImage *item3 = CCMenuItemImage::itemFromNormalImage("Images/f1.png", "Images/f2.png", this, menu_selector(MenuLayer::nextCallback) );
|
2010-09-14 16:23:50 +08:00
|
|
|
|
|
|
|
CCMenu *menu = CCMenu::menuWithItems(item1, item2, item3, NULL);
|
|
|
|
|
|
|
|
menu->setPosition( CGPointZero );
|
|
|
|
item1->setPosition( ccp( s.width/2 - 100,30) );
|
|
|
|
item2->setPosition( ccp( s.width/2, 30) );
|
|
|
|
item3->setPosition( ccp( s.width/2 + 100,30) );
|
|
|
|
|
|
|
|
addChild(menu, 1);
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
void MenuLayer::restartCallback(NSObject* sender)
|
|
|
|
{
|
|
|
|
CCScene* s = new Box2dTestBedScene();
|
|
|
|
MenuLayer* box = MenuLayer::menuWithEntryID(m_entryID);
|
|
|
|
s->addChild( box );
|
|
|
|
CCDirector::getSharedDirector()->replaceScene( s );
|
|
|
|
s->release();
|
|
|
|
}
|
|
|
|
|
|
|
|
void MenuLayer::nextCallback(NSObject* sender)
|
|
|
|
{
|
|
|
|
CCScene* s = new Box2dTestBedScene();
|
|
|
|
int next = m_entryID + 1;
|
|
|
|
if( next >= g_totalEntries)
|
|
|
|
next = 0;
|
|
|
|
MenuLayer* box = MenuLayer::menuWithEntryID(next);
|
|
|
|
s->addChild( box );
|
|
|
|
CCDirector::getSharedDirector()->replaceScene( s );
|
|
|
|
s->release();
|
|
|
|
}
|
|
|
|
|
|
|
|
void MenuLayer::backCallback(NSObject* sender)
|
|
|
|
{
|
|
|
|
CCScene* s = new Box2dTestBedScene();
|
|
|
|
int next = m_entryID - 1;
|
|
|
|
if( next < 0 ) {
|
|
|
|
next = g_totalEntries - 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
MenuLayer* box = MenuLayer::menuWithEntryID(next);
|
|
|
|
|
|
|
|
s->addChild( box );
|
|
|
|
CCDirector::getSharedDirector()->replaceScene( s );
|
|
|
|
s->release();
|
|
|
|
}
|
|
|
|
|
|
|
|
void MenuLayer::registerWithTouchDispatcher()
|
|
|
|
{
|
|
|
|
CCTouchDispatcher::getSharedDispatcher()->addTargetedDelegate(this, 0, true);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool MenuLayer::ccTouchBegan(CCTouch* touch, UIEvent* event)
|
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
//-(void) MenuLayer::ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event
|
|
|
|
//{
|
|
|
|
//}
|
|
|
|
//
|
|
|
|
//-(void) MenuLayer::ccTouchCancelled:(UITouch *)touch withEvent:(UIEvent *)event
|
|
|
|
//{
|
|
|
|
//}
|
|
|
|
|
|
|
|
void MenuLayer::ccTouchMoved(CCTouch* touch, UIEvent* event)
|
|
|
|
{
|
|
|
|
CGPoint touchLocation = touch->locationInView( touch->view() );
|
|
|
|
CGPoint prevLocation = touch->previousLocationInView( touch->view() );
|
|
|
|
|
|
|
|
touchLocation = CCDirector::getSharedDirector()->convertToGL( touchLocation );
|
|
|
|
prevLocation = CCDirector::getSharedDirector()->convertToGL( prevLocation );
|
|
|
|
|
|
|
|
CGPoint diff = ccpSub(touchLocation,prevLocation);
|
|
|
|
|
|
|
|
CCNode *node = getChildByTag( kTagBox2DNode );
|
|
|
|
CGPoint currentPos = node->getPosition();
|
|
|
|
node->setPosition( ccpAdd(currentPos, diff) );
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
// Box2DView
|
|
|
|
//
|
|
|
|
//------------------------------------------------------------------
|
|
|
|
Box2DView::Box2DView(void)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
Box2DView* Box2DView::viewWithEntryID(int entryId)
|
|
|
|
{
|
|
|
|
Box2DView* pView = new Box2DView();
|
|
|
|
pView->initWithEntryID(entryId);
|
|
|
|
pView->autorelease();
|
|
|
|
|
|
|
|
return pView;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool Box2DView::initWithEntryID(int entryId)
|
|
|
|
{
|
|
|
|
setIsAccelerometerEnabled( true );
|
|
|
|
setIsTouchEnabled( true );
|
|
|
|
|
|
|
|
schedule( schedule_selector(Box2DView::tick) );
|
|
|
|
|
|
|
|
m_entry = g_testEntries + entryId;
|
|
|
|
m_test = m_entry->createFcn();
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
std::string Box2DView::title()
|
|
|
|
{
|
|
|
|
return std::string(m_entry->name);
|
|
|
|
}
|
|
|
|
|
|
|
|
void Box2DView::tick(ccTime dt)
|
|
|
|
{
|
|
|
|
m_test->Step(&settings);
|
|
|
|
}
|
|
|
|
|
|
|
|
void Box2DView::draw()
|
|
|
|
{
|
|
|
|
CCLayer::draw();
|
|
|
|
|
|
|
|
// Default GL states: GL_TEXTURE_2D, GL_VERTEX_ARRAY, GL_COLOR_ARRAY, GL_TEXTURE_COORD_ARRAY
|
|
|
|
// Needed states: GL_VERTEX_ARRAY,
|
|
|
|
// Unneeded states: GL_TEXTURE_2D, GL_COLOR_ARRAY, GL_TEXTURE_COORD_ARRAY
|
|
|
|
glDisable(GL_TEXTURE_2D);
|
|
|
|
glDisableClientState(GL_COLOR_ARRAY);
|
|
|
|
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
|
|
|
|
|
|
|
|
m_test->m_world->DrawDebugData();
|
|
|
|
|
|
|
|
// restore default GL states
|
|
|
|
glEnable(GL_TEXTURE_2D);
|
|
|
|
glEnableClientState(GL_COLOR_ARRAY);
|
|
|
|
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
|
|
|
}
|
|
|
|
|
|
|
|
Box2DView::~Box2DView()
|
|
|
|
{
|
|
|
|
delete m_test;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Box2DView::registerWithTouchDispatcher()
|
|
|
|
{
|
|
|
|
// higher priority than dragging
|
|
|
|
CCTouchDispatcher::getSharedDispatcher()->addTargetedDelegate(this, -10, true);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool Box2DView::ccTouchBegan(CCTouch* touch, UIEvent* event)
|
|
|
|
{
|
|
|
|
CGPoint touchLocation = touch->locationInView( touch->view() );
|
|
|
|
touchLocation = CCDirector::getSharedDirector()->convertToGL( touchLocation );
|
|
|
|
|
|
|
|
CGPoint nodePosition = convertToNodeSpace( touchLocation );
|
|
|
|
// NSLog(@"pos: %f,%f -> %f,%f", touchLocation.x, touchLocation.y, nodePosition.x, nodePosition.y);
|
|
|
|
|
|
|
|
return m_test->MouseDown(b2Vec2(nodePosition.x,nodePosition.y));
|
|
|
|
}
|
|
|
|
|
|
|
|
void Box2DView::ccTouchMoved(CCTouch* touch, UIEvent* event)
|
|
|
|
{
|
|
|
|
CGPoint touchLocation = touch->locationInView( touch->view() );
|
|
|
|
touchLocation = CCDirector::getSharedDirector()->convertToGL( touchLocation );
|
|
|
|
CGPoint nodePosition = convertToNodeSpace( touchLocation );
|
|
|
|
|
|
|
|
m_test->MouseMove(b2Vec2(nodePosition.x,nodePosition.y));
|
|
|
|
}
|
|
|
|
|
|
|
|
void Box2DView::ccTouchEnded(CCTouch* touch, UIEvent* event)
|
|
|
|
{
|
|
|
|
CGPoint touchLocation = touch->locationInView( touch->view() );
|
|
|
|
touchLocation = CCDirector::getSharedDirector()->convertToGL( touchLocation );
|
|
|
|
CGPoint nodePosition = convertToNodeSpace( touchLocation );
|
|
|
|
|
|
|
|
m_test->MouseUp(b2Vec2(nodePosition.x,nodePosition.y));
|
|
|
|
}
|
|
|
|
|
|
|
|
// void Box2DView::accelerometer(UIAccelerometer* accelerometer, UIAcceleration* acceleration)
|
|
|
|
// {
|
|
|
|
// //// Only run for valid values
|
|
|
|
// //if (acceleration.y!=0 && acceleration.x!=0)
|
|
|
|
// //{
|
|
|
|
// // if (test) test->SetGravity((float)-acceleration.y,(float)acceleration.x);
|
|
|
|
// //}
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
void Box2dTestBedScene::runThisTest()
|
|
|
|
{
|
|
|
|
addChild(MenuLayer::menuWithEntryID(0));
|
|
|
|
|
|
|
|
CCDirector::getSharedDirector()->replaceScene(this);
|
|
|
|
}
|