axmol/samples/Cpp/TestCpp/Classes/Box2DTestBed/Box2dView.cpp

291 lines
7.9 KiB
C++
Raw Normal View History

2010-11-18 14:50:28 +08:00
#include "Box2dView.h"
#include "GLES-Render.h"
#include "Test.h"
2010-09-14 16:23:50 +08:00
#define kAccelerometerFrequency 30
#define FRAMES_BETWEEN_PRESSES_FOR_DOUBLE_CLICK 10
2010-11-18 14:50:28 +08:00
extern int g_totalEntries;
2010-09-14 16:23:50 +08:00
Settings settings;
enum
{
kTagBox2DNode,
2010-11-18 14:50:28 +08:00
};
2010-09-14 16:23:50 +08:00
//------------------------------------------------------------------
//
// MenuLayer
//
//------------------------------------------------------------------
enum
{
IDC_NEXT = 100,
IDC_BACK,
IDC_RESTART
2010-11-18 14:50:28 +08:00
};
MenuLayer::MenuLayer(void)
{
}
MenuLayer::~MenuLayer(void)
{
}
2010-09-14 16:23:50 +08:00
MenuLayer* MenuLayer::menuWithEntryID(int entryId)
{
auto layer = new MenuLayer();
layer->initWithEntryID(entryId);
layer->autorelease();
2010-09-14 16:23:50 +08:00
return layer;
2010-09-14 16:23:50 +08:00
}
bool MenuLayer::initWithEntryID(int entryId)
{
auto director = Director::getInstance();
Point visibleOrigin = director->getVisibleOrigin();
Size visibleSize = director->getVisibleSize();
m_entryID = entryId;
setTouchEnabled( true );
Box2DView* view = Box2DView::viewWithEntryID( entryId );
addChild(view, 0, kTagBox2DNode);
view->setScale(15);
2013-07-12 14:11:55 +08:00
view->setAnchorPoint( Point(0,0) );
view->setPosition( Point(visibleOrigin.x+visibleSize.width/2, visibleOrigin.y+visibleSize.height/3) );
//#if (CC_TARGET_PLATFORM == CC_PLATFORM_MARMALADE)
// auto label = LabelBMFont::create(view->title().c_str(), "fonts/arial16.fnt");
//#else
auto label = LabelTTF::create(view->title().c_str(), "Arial", 28);
//#endif
addChild(label, 1);
2013-07-12 14:11:55 +08:00
label->setPosition( Point(visibleOrigin.x+visibleSize.width/2, visibleOrigin.y+visibleSize.height-50) );
2010-09-14 16:23:50 +08:00
auto item1 = MenuItemImage::create("Images/b1.png", "Images/b2.png", CC_CALLBACK_1(MenuLayer::backCallback, this) );
auto item2 = MenuItemImage::create("Images/r1.png","Images/r2.png", CC_CALLBACK_1( MenuLayer::restartCallback, this) );
auto item3 = MenuItemImage::create("Images/f1.png", "Images/f2.png", CC_CALLBACK_1(MenuLayer::nextCallback, this) );
2010-09-14 16:23:50 +08:00
auto menu = Menu::create(item1, item2, item3, NULL);
2010-09-14 16:23:50 +08:00
menu->setPosition( Point::ZERO );
2013-07-12 14:11:55 +08:00
item1->setPosition(Point(VisibleRect::center().x - item2->getContentSize().width*2, VisibleRect::bottom().y+item2->getContentSize().height/2));
item2->setPosition(Point(VisibleRect::center().x, VisibleRect::bottom().y+item2->getContentSize().height/2));
item3->setPosition(Point(VisibleRect::center().x + item2->getContentSize().width*2, VisibleRect::bottom().y+item2->getContentSize().height/2));
addChild(menu, 1);
// Removes touch event listener
EventDispatcher::getInstance()->removeEventListener(_touchListener);
// Adds touch event listener
auto listener = TouchEventListener::create(Touch::DispatchMode::ONE_BY_ONE);
listener->setSwallowTouches(true);
listener->onTouchBegan = CC_CALLBACK_2(MenuLayer::onTouchBegan, this);
listener->onTouchMoved = CC_CALLBACK_2(MenuLayer::onTouchMoved, this);
2010-09-14 16:23:50 +08:00
EventDispatcher::getInstance()->addEventListenerWithFixedPriority(listener, 0);
_touchListener = listener;
return true;
2010-09-14 16:23:50 +08:00
}
void MenuLayer::restartCallback(Object* sender)
2010-09-14 16:23:50 +08:00
{
auto s = new Box2dTestBedScene();
auto box = MenuLayer::menuWithEntryID(m_entryID);
s->addChild( box );
Director::getInstance()->replaceScene( s );
2010-09-14 16:23:50 +08:00
s->release();
}
void MenuLayer::nextCallback(Object* sender)
2010-09-14 16:23:50 +08:00
{
auto s = new Box2dTestBedScene();
int next = m_entryID + 1;
if( next >= g_totalEntries)
next = 0;
auto box = MenuLayer::menuWithEntryID(next);
s->addChild( box );
Director::getInstance()->replaceScene( s );
2010-09-14 16:23:50 +08:00
s->release();
}
void MenuLayer::backCallback(Object* sender)
2010-09-14 16:23:50 +08:00
{
auto s = new Box2dTestBedScene();
int next = m_entryID - 1;
if( next < 0 ) {
next = g_totalEntries - 1;
}
auto box = MenuLayer::menuWithEntryID(next);
s->addChild( box );
Director::getInstance()->replaceScene( s );
2010-09-14 16:23:50 +08:00
s->release();
}
//void MenuLayer::registerWithTouchDispatcher()
//{
// auto director = Director::getInstance();
// director->getTouchDispatcher()->addTargetedDelegate(this, 0, true);
//}
2010-09-14 16:23:50 +08:00
bool MenuLayer::onTouchBegan(Touch* touch, Event* event)
2010-09-14 16:23:50 +08:00
{
return true;
2010-09-14 16:23:50 +08:00
}
//-(void) MenuLayer::ccTouchEnded:(UITouch *)touch withEvent:(Event *)event
2010-09-14 16:23:50 +08:00
//{
//}
//
//-(void) MenuLayer::ccTouchCancelled:(UITouch *)touch withEvent:(Event *)event
2010-09-14 16:23:50 +08:00
//{
//}
void MenuLayer::onTouchMoved(Touch* touch, Event* event)
2010-09-14 16:23:50 +08:00
{
auto diff = touch->getDelta();
auto node = getChildByTag( kTagBox2DNode );
auto currentPos = node->getPosition();
node->setPosition(currentPos + diff);
2010-11-18 14:50:28 +08:00
}
2010-09-14 16:23:50 +08:00
//------------------------------------------------------------------
//
// Box2DView
//
//------------------------------------------------------------------
2010-11-18 14:50:28 +08:00
Box2DView::Box2DView(void)
{
}
2010-09-14 16:23:50 +08:00
Box2DView* Box2DView::viewWithEntryID(int entryId)
{
Box2DView* pView = new Box2DView();
pView->initWithEntryID(entryId);
pView->autorelease();
2010-09-14 16:23:50 +08:00
return pView;
2010-09-14 16:23:50 +08:00
}
bool Box2DView::initWithEntryID(int entryId)
{
// setIsAccelerometerEnabled( true );
setTouchEnabled( true );
schedule( schedule_selector(Box2DView::tick) );
2010-09-14 16:23:50 +08:00
m_entry = g_testEntries + entryId;
m_test = m_entry->createFcn();
// Removes Touch Event Listener
EventDispatcher::getInstance()->removeEventListener(_touchListener);
// Adds Touch Event Listener
auto listener = TouchEventListener::create(Touch::DispatchMode::ONE_BY_ONE);
listener->setSwallowTouches(true);
listener->onTouchBegan = CC_CALLBACK_2(Box2DView::onTouchBegan, this);
listener->onTouchMoved = CC_CALLBACK_2(Box2DView::onTouchMoved, this);
listener->onTouchEnded = CC_CALLBACK_2(Box2DView::onTouchEnded, this);
EventDispatcher::getInstance()->addEventListenerWithFixedPriority(listener, 10);
_touchListener = listener;
2010-11-18 14:50:28 +08:00
return true;
2010-09-14 16:23:50 +08:00
}
std::string Box2DView::title()
{
return std::string(m_entry->name);
2010-09-14 16:23:50 +08:00
}
2012-06-08 13:55:28 +08:00
void Box2DView::tick(float dt)
2010-09-14 16:23:50 +08:00
{
m_test->Step(&settings);
2010-09-14 16:23:50 +08:00
}
void Box2DView::draw()
{
Layer::draw();
GL::enableVertexAttribs( cocos2d::GL::VERTEX_ATTRIB_FLAG_POSITION );
kmGLPushMatrix();
m_test->m_world->DrawDebugData();
kmGLPopMatrix();
CHECK_GL_ERROR_DEBUG();
2010-09-14 16:23:50 +08:00
}
Box2DView::~Box2DView()
{
delete m_test;
2010-09-14 16:23:50 +08:00
}
//
//void Box2DView::registerWithTouchDispatcher()
//{
// // higher priority than dragging
// auto director = Director::getInstance();
// director->getTouchDispatcher()->addTargetedDelegate(this, -10, true);
//}
2010-09-14 16:23:50 +08:00
bool Box2DView::onTouchBegan(Touch* touch, Event* event)
2010-09-14 16:23:50 +08:00
{
auto touchLocation = touch->getLocation();
2010-09-14 16:23:50 +08:00
auto nodePosition = convertToNodeSpace( touchLocation );
log("Box2DView::onTouchBegan, pos: %f,%f -> %f,%f", touchLocation.x, touchLocation.y, nodePosition.x, nodePosition.y);
2010-09-14 16:23:50 +08:00
return m_test->MouseDown(b2Vec2(nodePosition.x,nodePosition.y));
2010-09-14 16:23:50 +08:00
}
void Box2DView::onTouchMoved(Touch* touch, Event* event)
2010-09-14 16:23:50 +08:00
{
auto touchLocation = touch->getLocation();
auto nodePosition = convertToNodeSpace( touchLocation );
log("Box2DView::onTouchMoved, pos: %f,%f -> %f,%f", touchLocation.x, touchLocation.y, nodePosition.x, nodePosition.y);
m_test->MouseMove(b2Vec2(nodePosition.x,nodePosition.y));
2010-09-14 16:23:50 +08:00
}
void Box2DView::onTouchEnded(Touch* touch, Event* event)
2010-09-14 16:23:50 +08:00
{
auto touchLocation = touch->getLocation();
auto nodePosition = convertToNodeSpace( touchLocation );
log("Box2DView::onTouchEnded, pos: %f,%f -> %f,%f", touchLocation.x, touchLocation.y, nodePosition.x, nodePosition.y);
m_test->MouseUp(b2Vec2(nodePosition.x,nodePosition.y));
// EventDispatcher::getInstance()->setPriorityWithFixedValue(_touchEventId, -1);
2010-09-14 16:23:50 +08:00
}
// void Box2DView::accelerometer(UIAccelerometer* accelerometer, Acceleration* acceleration)
2010-11-18 14:50:28 +08:00
// {
// //// Only run for valid values
// //if (acceleration.y!=0 && acceleration.x!=0)
// //{
// // if (test) test->SetGravity((float)-acceleration.y,(float)acceleration.x);
// //}
2010-11-18 14:50:28 +08:00
// }
2010-09-14 16:23:50 +08:00
void Box2dTestBedScene::runThisTest()
{
addChild(MenuLayer::menuWithEntryID(0));
Director::getInstance()->replaceScene(this);
2010-09-14 16:23:50 +08:00
}