| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "physics_layer.h" | 5 #include "level_layer.h" |
| 6 #include "app_delegate.h" | 6 #include "app_delegate.h" |
| 7 #include "gameplay_scene.h" | 7 #include "game_manager.h" |
| 8 | 8 |
| 9 #include "physics_nodes/CCPhysicsSprite.h" | 9 #include "physics_nodes/CCPhysicsSprite.h" |
| 10 #include "CCLuaEngine.h" | 10 #include "CCLuaEngine.h" |
| 11 | 11 |
| 12 extern "C" { | 12 extern "C" { |
| 13 #include "lua.h" | 13 #include "lua.h" |
| 14 #include "tolua++.h" | 14 #include "tolua++.h" |
| 15 #include "lualib.h" | 15 #include "lualib.h" |
| 16 #include "lauxlib.h" | 16 #include "lauxlib.h" |
| 17 #include "tolua_fix.h" | 17 #include "tolua_fix.h" |
| 18 } | 18 } |
| 19 | 19 |
| 20 // Pixels-to-meters ratio for converting screen coordinates | 20 // Pixels-to-meters ratio for converting screen coordinates |
| 21 // to Box2D "meters". | 21 // to Box2D "meters". |
| 22 #define PTM_RATIO 32 | 22 #define PTM_RATIO 32 |
| 23 #define SCREEN_TO_WORLD(n) ((n) / PTM_RATIO) | 23 #define SCREEN_TO_WORLD(n) ((n) / PTM_RATIO) |
| 24 #define WORLD_TO_SCREEN(n) ((n) * PTM_RATIO) | 24 #define WORLD_TO_SCREEN(n) ((n) * PTM_RATIO) |
| 25 #define VELOCITY_ITERATIONS 8 | 25 #define VELOCITY_ITERATIONS 8 |
| 26 #define POS_ITERATIONS 1 | 26 #define POS_ITERATIONS 1 |
| 27 | 27 |
| 28 #define MAX_SPRITES 100 | 28 #define MAX_SPRITES 100 |
| 29 | 29 |
| 30 #define DEFAULT_DENSITY 1.0f | 30 #define DEFAULT_DENSITY 1.0f |
| 31 #define DEFAULT_FRICTION 0.2f | 31 #define DEFAULT_FRICTION 0.2f |
| 32 #define DEFAULT_RESTITUTION 0.1f | 32 #define DEFAULT_RESTITUTION 0.1f |
| 33 | 33 |
| 34 | 34 |
| 35 USING_NS_CC_EXT; | 35 USING_NS_CC_EXT; |
| 36 | 36 |
| 37 PhysicsLayer* PhysicsLayer::create(int level_number) | 37 LevelLayer* LevelLayer::create(int level_number) |
| 38 { | 38 { |
| 39 PhysicsLayer* layer = new PhysicsLayer(level_number); | 39 LevelLayer* layer = new LevelLayer(level_number); |
| 40 if (!layer) | 40 if (!layer) |
| 41 return NULL; | 41 return NULL; |
| 42 layer->init(); | 42 layer->init(); |
| 43 return layer; | 43 return layer; |
| 44 } | 44 } |
| 45 | 45 |
| 46 bool PhysicsLayer::init() { | 46 bool LevelLayer::init() { |
| 47 if (!CCLayerColor::initWithColor(ccc4(0,0x8F,0xD8,0xD8))) | 47 if (!CCLayerColor::initWithColor(ccc4(0,0x8F,0xD8,0xD8))) |
| 48 return false; | 48 return false; |
| 49 | 49 |
| 50 setTouchEnabled(true); | 50 setTouchEnabled(true); |
| 51 | 51 |
| 52 InitPhysics(); | 52 InitPhysics(); |
| 53 | 53 |
| 54 // Load level from lua file. For now we simple load level 1. | 54 // Load level from lua file. For now we simple load level 1. |
| 55 LoadLua(); | 55 LoadLua(); |
| 56 | 56 |
| 57 // Calculate brush size | 57 // Calculate brush size |
| 58 CCSpriteBatchNode* brush_batch = (CCSpriteBatchNode*)getChildByTag(TAG_BRUSH); | 58 CCSpriteBatchNode* brush_batch = (CCSpriteBatchNode*)getChildByTag(TAG_BRUSH); |
| 59 assert(brush_batch); | 59 assert(brush_batch); |
| 60 brush_ = CCSprite::createWithTexture(brush_batch->getTexture()); | 60 brush_ = CCSprite::createWithTexture(brush_batch->getTexture()); |
| 61 brush_->retain(); | 61 brush_->retain(); |
| 62 CCSize brush_size = brush_->getContentSize(); | 62 CCSize brush_size = brush_->getContentSize(); |
| 63 brush_radius_ = MAX(brush_size.height/2, brush_size.width/2); | 63 brush_radius_ = MAX(brush_size.height/2, brush_size.width/2); |
| 64 | 64 |
| 65 // Schedule physics updates each frame | 65 // Schedule physics updates each frame |
| 66 schedule(schedule_selector(PhysicsLayer::UpdateWorld)); | 66 schedule(schedule_selector(LevelLayer::UpdateWorld)); |
| 67 return true; | 67 return true; |
| 68 } | 68 } |
| 69 | 69 |
| 70 PhysicsLayer::PhysicsLayer(int level_number) : | 70 LevelLayer::LevelLayer(int level_number) : |
| 71 level_number_(level_number), | 71 level_number_(level_number), |
| 72 goal_reached_(false), | 72 goal_reached_(false), |
| 73 current_touch_id_(-1), | 73 current_touch_id_(-1), |
| 74 render_target_(NULL), | 74 render_target_(NULL), |
| 75 #ifdef COCOS2D_DEBUG | 75 #ifdef COCOS2D_DEBUG |
| 76 debug_enabled_(false), | 76 debug_enabled_(false), |
| 77 #endif | 77 #endif |
| 78 box2d_density_(DEFAULT_DENSITY), | 78 box2d_density_(DEFAULT_DENSITY), |
| 79 box2d_restitution_(DEFAULT_RESTITUTION), | 79 box2d_restitution_(DEFAULT_RESTITUTION), |
| 80 box2d_friction_(DEFAULT_FRICTION) { | 80 box2d_friction_(DEFAULT_FRICTION) { |
| 81 memset(stars_collected_, 0, sizeof(stars_collected_)); | 81 memset(stars_collected_, 0, sizeof(stars_collected_)); |
| 82 } | 82 } |
| 83 | 83 |
| 84 PhysicsLayer::~PhysicsLayer() { | 84 LevelLayer::~LevelLayer() { |
| 85 brush_->release(); | 85 brush_->release(); |
| 86 delete box2d_world_; | 86 delete box2d_world_; |
| 87 #ifdef COCOS2D_DEBUG | 87 #ifdef COCOS2D_DEBUG |
| 88 delete box2d_debug_draw_; | 88 delete box2d_debug_draw_; |
| 89 #endif | 89 #endif |
| 90 } | 90 } |
| 91 | 91 |
| 92 void PhysicsLayer::registerWithTouchDispatcher() { | 92 void LevelLayer::registerWithTouchDispatcher() { |
| 93 CCDirector* director = CCDirector::sharedDirector(); | 93 CCDirector* director = CCDirector::sharedDirector(); |
| 94 director->getTouchDispatcher()->addTargetedDelegate(this, 0, true); | 94 director->getTouchDispatcher()->addTargetedDelegate(this, 0, true); |
| 95 } | 95 } |
| 96 | 96 |
| 97 void PhysicsLayer::CreateRenderTarget() { | 97 void LevelLayer::CreateRenderTarget() { |
| 98 // create render target for shape drawing | 98 // create render target for shape drawing |
| 99 assert(!render_target_); | 99 assert(!render_target_); |
| 100 CCSize win_size = CCDirector::sharedDirector()->getWinSize(); | 100 CCSize win_size = CCDirector::sharedDirector()->getWinSize(); |
| 101 render_target_ = CCRenderTexture::create(win_size.width, | 101 render_target_ = CCRenderTexture::create(win_size.width, |
| 102 win_size.height, | 102 win_size.height, |
| 103 kCCTexture2DPixelFormat_RGBA8888); | 103 kCCTexture2DPixelFormat_RGBA8888); |
| 104 render_target_->setPosition(ccp(win_size.width / 2, win_size.height / 2)); | 104 render_target_->setPosition(ccp(win_size.width / 2, win_size.height / 2)); |
| 105 addChild(render_target_); | 105 addChild(render_target_); |
| 106 } | 106 } |
| 107 | 107 |
| 108 bool PhysicsLayer::LoadLua() { | 108 bool LevelLayer::LoadLua() { |
| 109 CCScriptEngineManager* manager = CCScriptEngineManager::sharedManager(); | 109 CCScriptEngineManager* manager = CCScriptEngineManager::sharedManager(); |
| 110 CCLuaEngine* engine = (CCLuaEngine*)manager->getScriptEngine(); | 110 CCLuaEngine* engine = (CCLuaEngine*)manager->getScriptEngine(); |
| 111 assert(engine); | 111 assert(engine); |
| 112 lua_stack_ = engine->getLuaStack(); | 112 lua_stack_ = engine->getLuaStack(); |
| 113 assert(lua_stack_); | 113 assert(lua_stack_); |
| 114 | 114 |
| 115 lua_stack_->pushString("sample_game/game.lua"); | 115 lua_stack_->pushString("sample_game/game.lua"); |
| 116 lua_stack_->pushCCObject(this, "PhysicsLayer"); | 116 lua_stack_->pushCCObject(this, "LevelLayer"); |
| 117 lua_stack_->pushInt(level_number_); | 117 lua_stack_->pushInt(level_number_); |
| 118 | 118 |
| 119 // Call 'main' with three arguments pushed above | 119 // Call 'main' with three arguments pushed above |
| 120 int rtn = lua_stack_->executeFunctionByName("main", 3); | 120 int rtn = lua_stack_->executeFunctionByName("main", 3); |
| 121 if (rtn != 1) | 121 if (rtn != 1) |
| 122 return false; | 122 return false; |
| 123 | 123 |
| 124 return true; | 124 return true; |
| 125 } | 125 } |
| 126 | 126 |
| 127 bool PhysicsLayer::InitPhysics() { | 127 bool LevelLayer::InitPhysics() { |
| 128 b2Vec2 gravity(0.0f, -9.8f); | 128 b2Vec2 gravity(0.0f, -9.8f); |
| 129 box2d_world_ = new b2World(gravity); | 129 box2d_world_ = new b2World(gravity); |
| 130 box2d_world_->SetAllowSleeping(true); | 130 box2d_world_->SetAllowSleeping(true); |
| 131 box2d_world_->SetContinuousPhysics(true); | 131 box2d_world_->SetContinuousPhysics(true); |
| 132 | 132 |
| 133 // Find visible rect, and convert to box2d space. | 133 // Find visible rect, and convert to box2d space. |
| 134 CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin(); | 134 CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin(); |
| 135 CCSize visible_size = CCDirector::sharedDirector()->getVisibleSize(); | 135 CCSize visible_size = CCDirector::sharedDirector()->getVisibleSize(); |
| 136 float world_width = SCREEN_TO_WORLD(visible_size.width); | 136 float world_width = SCREEN_TO_WORLD(visible_size.width); |
| 137 b2Vec2 world_origin(SCREEN_TO_WORLD(origin.x), SCREEN_TO_WORLD(origin.y)); | 137 b2Vec2 world_origin(SCREEN_TO_WORLD(origin.x), SCREEN_TO_WORLD(origin.y)); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 160 flags += b2Draw::e_shapeBit; | 160 flags += b2Draw::e_shapeBit; |
| 161 flags += b2Draw::e_jointBit; | 161 flags += b2Draw::e_jointBit; |
| 162 flags += b2Draw::e_centerOfMassBit; | 162 flags += b2Draw::e_centerOfMassBit; |
| 163 //flags += b2Draw::e_aabbBit; | 163 //flags += b2Draw::e_aabbBit; |
| 164 //flags += b2Draw::e_pairBit; | 164 //flags += b2Draw::e_pairBit; |
| 165 box2d_debug_draw_->SetFlags(flags); | 165 box2d_debug_draw_->SetFlags(flags); |
| 166 #endif | 166 #endif |
| 167 return true; | 167 return true; |
| 168 } | 168 } |
| 169 | 169 |
| 170 void PhysicsLayer::ToggleDebug() { | 170 void LevelLayer::ToggleDebug() { |
| 171 debug_enabled_ = !debug_enabled_; | 171 debug_enabled_ = !debug_enabled_; |
| 172 | 172 |
| 173 // Set visibility of all children based on debug_enabled_ | 173 // Set visibility of all children based on debug_enabled_ |
| 174 CCArray* children = getChildren(); | 174 CCArray* children = getChildren(); |
| 175 if (!children) | 175 if (!children) |
| 176 return; | 176 return; |
| 177 for (uint i = 0; i < children->count(); i++) | 177 for (uint i = 0; i < children->count(); i++) |
| 178 { | 178 { |
| 179 CCNode* child = static_cast<CCNode*>(children->objectAtIndex(i)); | 179 CCNode* child = static_cast<CCNode*>(children->objectAtIndex(i)); |
| 180 if (child == render_target_) | 180 if (child == render_target_) |
| 181 continue; | 181 continue; |
| 182 child->setVisible(!debug_enabled_); | 182 child->setVisible(!debug_enabled_); |
| 183 } | 183 } |
| 184 } | 184 } |
| 185 | 185 |
| 186 CCRect CalcBoundingBox(CCSprite* sprite) { | 186 CCRect CalcBoundingBox(CCSprite* sprite) { |
| 187 CCSize size = sprite->getContentSize(); | 187 CCSize size = sprite->getContentSize(); |
| 188 CCPoint pos = sprite->getPosition(); | 188 CCPoint pos = sprite->getPosition(); |
| 189 return CCRectMake(pos.x - size.width, pos.y - size.height, | 189 return CCRectMake(pos.x - size.width, pos.y - size.height, |
| 190 size.width, size.height/2); | 190 size.width, size.height/2); |
| 191 } | 191 } |
| 192 | 192 |
| 193 void PhysicsLayer::UpdateWorld(float dt) { | 193 void LevelLayer::UpdateWorld(float dt) { |
| 194 // update physics | 194 // update physics |
| 195 box2d_world_->Step(dt, VELOCITY_ITERATIONS, POS_ITERATIONS); | 195 box2d_world_->Step(dt, VELOCITY_ITERATIONS, POS_ITERATIONS); |
| 196 } | 196 } |
| 197 | 197 |
| 198 void PhysicsLayer::LuaNotifyContact(b2Contact* contact, | 198 void LevelLayer::LuaNotifyContact(b2Contact* contact, |
| 199 const char* function_name) { | 199 const char* function_name) { |
| 200 // Return early if lua didn't define the function_name | 200 // Return early if lua didn't define the function_name |
| 201 lua_State* state = lua_stack_->getLuaState(); | 201 lua_State* state = lua_stack_->getLuaState(); |
| 202 lua_getglobal(state, function_name); | 202 lua_getglobal(state, function_name); |
| 203 bool is_func = lua_isfunction(state, -1); | 203 bool is_func = lua_isfunction(state, -1); |
| 204 lua_pop(state, 1); | 204 lua_pop(state, 1); |
| 205 | 205 |
| 206 if (!is_func) | 206 if (!is_func) |
| 207 return; | 207 return; |
| 208 | 208 |
| 209 // Only send to lua collitions between body's that | 209 // Only send to lua collitions between body's that |
| 210 // have been tagged. | 210 // have been tagged. |
| 211 b2Body* body1 = contact->GetFixtureA()->GetBody(); | 211 b2Body* body1 = contact->GetFixtureA()->GetBody(); |
| 212 b2Body* body2 = contact->GetFixtureB()->GetBody(); | 212 b2Body* body2 = contact->GetFixtureB()->GetBody(); |
| 213 int tag1 = (int)body1->GetUserData(); | 213 int tag1 = (int)body1->GetUserData(); |
| 214 int tag2 = (int)body2->GetUserData(); | 214 int tag2 = (int)body2->GetUserData(); |
| 215 if (!tag1 || !tag2) | 215 if (!tag1 || !tag2) |
| 216 return; | 216 return; |
| 217 | 217 |
| 218 // Call 'ContactBegan' lua function passing in 'this' | 218 // Call 'ContactBegan' lua function passing in 'this' |
| 219 // as well as the tags of the two bodies that collided | 219 // as well as the tags of the two bodies that collided |
| 220 lua_stack_->pushCCObject(this, "PhysicsLayer"); | 220 lua_stack_->pushCCObject(this, "LevelLayer"); |
| 221 lua_stack_->pushInt(tag1); | 221 lua_stack_->pushInt(tag1); |
| 222 lua_stack_->pushInt(tag2); | 222 lua_stack_->pushInt(tag2); |
| 223 lua_stack_->executeFunctionByName(function_name, 3); | 223 lua_stack_->executeFunctionByName(function_name, 3); |
| 224 } | 224 } |
| 225 | 225 |
| 226 void PhysicsLayer::BeginContact(b2Contact* contact) { | 226 void LevelLayer::BeginContact(b2Contact* contact) { |
| 227 LuaNotifyContact(contact, "BeginContact"); | 227 LuaNotifyContact(contact, "BeginContact"); |
| 228 } | 228 } |
| 229 | 229 |
| 230 void PhysicsLayer::EndContact(b2Contact* contact) { | 230 void LevelLayer::EndContact(b2Contact* contact) { |
| 231 LuaNotifyContact(contact, "EndContact"); | 231 LuaNotifyContact(contact, "EndContact"); |
| 232 } | 232 } |
| 233 | 233 |
| 234 void PhysicsLayer::LevelComplete() { | 234 void LevelLayer::LevelComplete() { |
| 235 // fade out the goal and trigger gameover callback when its | 235 // fade out the goal and trigger gameover callback when its |
| 236 // done | 236 // done |
| 237 CCPhysicsSprite* goal = (CCPhysicsSprite*)getChildByTag(TAG_GOAL); | 237 CCPhysicsSprite* goal = (CCPhysicsSprite*)getChildByTag(TAG_GOAL); |
| 238 CCActionInterval* fadeout = CCFadeOut::create(0.5f); | 238 CCActionInterval* fadeout = CCFadeOut::create(0.5f); |
| 239 CCFiniteTimeAction* fadeout_done = CCCallFuncN::create(this, | 239 CCFiniteTimeAction* fadeout_done = CCCallFuncN::create(this, |
| 240 callfuncN_selector(PhysicsLayer::LevelCompleteDone)); | 240 callfuncN_selector(LevelLayer::LevelCompleteDone)); |
| 241 CCSequence* seq = CCSequence::create(fadeout, fadeout_done, NULL); | 241 CCSequence* seq = CCSequence::create(fadeout, fadeout_done, NULL); |
| 242 goal->runAction(seq); | 242 goal->runAction(seq); |
| 243 } | 243 } |
| 244 | 244 |
| 245 void PhysicsLayer::LevelCompleteDone(CCNode* sender) { | 245 void LevelLayer::LevelCompleteDone(CCNode* sender) { |
| 246 unschedule(schedule_selector(PhysicsLayer::UpdateWorld)); | 246 unschedule(schedule_selector(LevelLayer::UpdateWorld)); |
| 247 setTouchEnabled(false); | 247 setTouchEnabled(false); |
| 248 GameplayScene* scene = static_cast<GameplayScene*>(getParent()); | 248 CCScene* scene = static_cast<CCScene*>(getParent()); |
| 249 scene->GameOver(true); | 249 GameManager::sharedManager()->GameOver(scene, true); |
| 250 } | 250 } |
| 251 | 251 |
| 252 void PhysicsLayer::DrawPoint(CCPoint& location) { | 252 void LevelLayer::DrawPoint(CCPoint& location) { |
| 253 ClampBrushLocation(location); | 253 ClampBrushLocation(location); |
| 254 render_target_->begin(); | 254 render_target_->begin(); |
| 255 brush_->setVisible(true); | 255 brush_->setVisible(true); |
| 256 brush_->setPosition(ccp(location.x, location.y)); | 256 brush_->setPosition(ccp(location.x, location.y)); |
| 257 brush_->visit(); | 257 brush_->visit(); |
| 258 brush_->setVisible(false); | 258 brush_->setVisible(false); |
| 259 render_target_->end(); | 259 render_target_->end(); |
| 260 points_being_drawn_.push_back(location); | 260 points_being_drawn_.push_back(location); |
| 261 } | 261 } |
| 262 | 262 |
| 263 void PhysicsLayer::draw() { | 263 void LevelLayer::draw() { |
| 264 CCLayerColor::draw(); | 264 CCLayerColor::draw(); |
| 265 | 265 |
| 266 #ifdef COCOS2D_DEBUG | 266 #ifdef COCOS2D_DEBUG |
| 267 if (debug_enabled_) { | 267 if (debug_enabled_) { |
| 268 ccGLEnableVertexAttribs(kCCVertexAttribFlag_Position); | 268 ccGLEnableVertexAttribs(kCCVertexAttribFlag_Position); |
| 269 kmGLPushMatrix(); | 269 kmGLPushMatrix(); |
| 270 box2d_world_->DrawDebugData(); | 270 box2d_world_->DrawDebugData(); |
| 271 kmGLPopMatrix(); | 271 kmGLPopMatrix(); |
| 272 } | 272 } |
| 273 #endif | 273 #endif |
| 274 } | 274 } |
| 275 | 275 |
| 276 void PhysicsLayer::ClampBrushLocation(CCPoint& point) { | 276 void LevelLayer::ClampBrushLocation(CCPoint& point) { |
| 277 CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin(); | 277 CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin(); |
| 278 CCSize visible_size = CCDirector::sharedDirector()->getVisibleSize(); | 278 CCSize visible_size = CCDirector::sharedDirector()->getVisibleSize(); |
| 279 | 279 |
| 280 float min_x = origin.x + brush_radius_; | 280 float min_x = origin.x + brush_radius_; |
| 281 float min_y = origin.y + brush_radius_; | 281 float min_y = origin.y + brush_radius_; |
| 282 if (point.x < min_x) point.x = min_x; | 282 if (point.x < min_x) point.x = min_x; |
| 283 if (point.y < min_y) point.y = min_y; | 283 if (point.y < min_y) point.y = min_y; |
| 284 | 284 |
| 285 float max_x = origin.x + visible_size.width - brush_radius_; | 285 float max_x = origin.x + visible_size.width - brush_radius_; |
| 286 float max_y = origin.y + visible_size.height - brush_radius_; | 286 float max_y = origin.y + visible_size.height - brush_radius_; |
| 287 if (point.x > max_x) point.x = max_x; | 287 if (point.x > max_x) point.x = max_x; |
| 288 if (point.y > max_y) point.y = max_y; | 288 if (point.y > max_y) point.y = max_y; |
| 289 } | 289 } |
| 290 | 290 |
| 291 void PhysicsLayer::DrawLine(CCPoint& start, CCPoint& end) { | 291 void LevelLayer::DrawLine(CCPoint& start, CCPoint& end) { |
| 292 ClampBrushLocation(start); | 292 ClampBrushLocation(start); |
| 293 ClampBrushLocation(end); | 293 ClampBrushLocation(end); |
| 294 | 294 |
| 295 // calculate distance moved | 295 // calculate distance moved |
| 296 float distance = ccpDistance(start, end); | 296 float distance = ccpDistance(start, end); |
| 297 | 297 |
| 298 // draw the brush sprite into render texture at every point between the old | 298 // draw the brush sprite into render texture at every point between the old |
| 299 // and new cursor positions | 299 // and new cursor positions |
| 300 render_target_->begin(); | 300 render_target_->begin(); |
| 301 for (int i = 0; i < int(distance + 0.5); i++) { | 301 for (int i = 0; i < int(distance + 0.5); i++) { |
| 302 float difx = end.x - start.x; | 302 float difx = end.x - start.x; |
| 303 float dify = end.y - start.y; | 303 float dify = end.y - start.y; |
| 304 float delta = (float)i / distance; | 304 float delta = (float)i / distance; |
| 305 brush_->setVisible(true); | 305 brush_->setVisible(true); |
| 306 brush_->setPosition( | 306 brush_->setPosition( |
| 307 ccp(start.x + (difx * delta), start.y + (dify * delta))); | 307 ccp(start.x + (difx * delta), start.y + (dify * delta))); |
| 308 | 308 |
| 309 brush_->visit(); | 309 brush_->visit(); |
| 310 brush_->setVisible(false); | 310 brush_->setVisible(false); |
| 311 } | 311 } |
| 312 render_target_->end(); | 312 render_target_->end(); |
| 313 points_being_drawn_.push_back(end); | 313 points_being_drawn_.push_back(end); |
| 314 } | 314 } |
| 315 | 315 |
| 316 bool PhysicsLayer::ccTouchBegan(CCTouch* touch, CCEvent* event) { | 316 bool LevelLayer::ccTouchBegan(CCTouch* touch, CCEvent* event) { |
| 317 if (current_touch_id_ != -1) | 317 if (current_touch_id_ != -1) |
| 318 return false; | 318 return false; |
| 319 | 319 |
| 320 current_touch_id_ = touch->getID(); | 320 current_touch_id_ = touch->getID(); |
| 321 | 321 |
| 322 if (!render_target_) | 322 if (!render_target_) |
| 323 CreateRenderTarget(); | 323 CreateRenderTarget(); |
| 324 | 324 |
| 325 points_being_drawn_.clear(); | 325 points_being_drawn_.clear(); |
| 326 CCPoint location = touch->getLocation(); | 326 CCPoint location = touch->getLocation(); |
| 327 DrawPoint(location); | 327 DrawPoint(location); |
| 328 return true; | 328 return true; |
| 329 } | 329 } |
| 330 | 330 |
| 331 void PhysicsLayer::ccTouchMoved(CCTouch* touch, CCEvent* event) { | 331 void LevelLayer::ccTouchMoved(CCTouch* touch, CCEvent* event) { |
| 332 assert(touch->getID() == current_touch_id_); | 332 assert(touch->getID() == current_touch_id_); |
| 333 CCPoint end = touch->getLocation(); | 333 CCPoint end = touch->getLocation(); |
| 334 CCPoint start = touch->getPreviousLocation(); | 334 CCPoint start = touch->getPreviousLocation(); |
| 335 DrawLine(start, end); | 335 DrawLine(start, end); |
| 336 } | 336 } |
| 337 | 337 |
| 338 void PhysicsLayer::ccTouchEnded(CCTouch* touch, CCEvent* event) { | 338 void LevelLayer::ccTouchEnded(CCTouch* touch, CCEvent* event) { |
| 339 assert(touch->getID() == current_touch_id_); | 339 assert(touch->getID() == current_touch_id_); |
| 340 b2Body* body = CreatePhysicsBody(); | 340 b2Body* body = CreatePhysicsBody(); |
| 341 CCSprite* sprite = CreatePhysicsSprite(body); | 341 CCSprite* sprite = CreatePhysicsSprite(body); |
| 342 addChild(sprite); | 342 addChild(sprite); |
| 343 if (debug_enabled_) | 343 if (debug_enabled_) |
| 344 sprite->setVisible(false); | 344 sprite->setVisible(false); |
| 345 | 345 |
| 346 // release render target (it will get recreated on next touch). | 346 // release render target (it will get recreated on next touch). |
| 347 removeChild(render_target_, true); | 347 removeChild(render_target_, true); |
| 348 render_target_ = NULL; | 348 render_target_ = NULL; |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 394 minX = WORLD_TO_SCREEN(minX); | 394 minX = WORLD_TO_SCREEN(minX); |
| 395 maxY = WORLD_TO_SCREEN(maxY); | 395 maxY = WORLD_TO_SCREEN(maxY); |
| 396 minY = WORLD_TO_SCREEN(minY); | 396 minY = WORLD_TO_SCREEN(minY); |
| 397 | 397 |
| 398 float width = maxX - minX; | 398 float width = maxX - minX; |
| 399 float height = maxY - minY; | 399 float height = maxY - minY; |
| 400 float remY = s.height - maxY; | 400 float remY = s.height - maxY; |
| 401 return CCRectMake(minX, remY, width, height); | 401 return CCRectMake(minX, remY, width, height); |
| 402 } | 402 } |
| 403 | 403 |
| 404 CCSprite* PhysicsLayer::CreatePhysicsSprite(b2Body* body) { | 404 CCSprite* LevelLayer::CreatePhysicsSprite(b2Body* body) { |
| 405 CCPhysicsSprite *sprite; | 405 CCPhysicsSprite *sprite; |
| 406 | 406 |
| 407 // create a new texture based on the current contents of the | 407 // create a new texture based on the current contents of the |
| 408 // render target | 408 // render target |
| 409 CCImage* image = render_target_->newCCImage(); | 409 CCImage* image = render_target_->newCCImage(); |
| 410 CCTexture2D* tex = new CCTexture2D(); | 410 CCTexture2D* tex = new CCTexture2D(); |
| 411 tex->initWithImage(image); | 411 tex->initWithImage(image); |
| 412 tex->autorelease(); | 412 tex->autorelease(); |
| 413 delete image; | 413 delete image; |
| 414 | 414 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 433 float anchorX = body_pos.x - sprite_rect.origin.x; | 433 float anchorX = body_pos.x - sprite_rect.origin.x; |
| 434 float anchorY = body_pos.y + sprite_rect.origin.y + sprite_rect.size.height; | 434 float anchorY = body_pos.y + sprite_rect.origin.y + sprite_rect.size.height; |
| 435 anchorY -= s.height; | 435 anchorY -= s.height; |
| 436 | 436 |
| 437 // anchor point goes from 0.0 to 1.0 with in bounds of the sprite itself. | 437 // anchor point goes from 0.0 to 1.0 with in bounds of the sprite itself. |
| 438 sprite->setAnchorPoint(ccp(anchorX / sprite_rect.size.width, | 438 sprite->setAnchorPoint(ccp(anchorX / sprite_rect.size.width, |
| 439 anchorY / sprite_rect.size.height)); | 439 anchorY / sprite_rect.size.height)); |
| 440 return sprite; | 440 return sprite; |
| 441 } | 441 } |
| 442 | 442 |
| 443 b2Body* PhysicsLayer::CreatePhysicsBody() { | 443 b2Body* LevelLayer::CreatePhysicsBody() { |
| 444 assert(points_being_drawn_.size()); | 444 assert(points_being_drawn_.size()); |
| 445 CCPoint start_point = points_being_drawn_.front(); | 445 CCPoint start_point = points_being_drawn_.front(); |
| 446 | 446 |
| 447 assert(points_being_drawn_.size()); | 447 assert(points_being_drawn_.size()); |
| 448 CCLog("new body from %d points", points_being_drawn_.size()); | 448 CCLog("new body from %d points", points_being_drawn_.size()); |
| 449 // create initial body | 449 // create initial body |
| 450 b2BodyDef def; | 450 b2BodyDef def; |
| 451 def.type = b2_dynamicBody; | 451 def.type = b2_dynamicBody; |
| 452 def.position.Set(SCREEN_TO_WORLD(start_point.x), | 452 def.position.Set(SCREEN_TO_WORLD(start_point.x), |
| 453 SCREEN_TO_WORLD(start_point.y)); | 453 SCREEN_TO_WORLD(start_point.y)); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 475 continue; | 475 continue; |
| 476 } | 476 } |
| 477 AddLineToBody(body, start_point, end_point); | 477 AddLineToBody(body, start_point, end_point); |
| 478 start_point = *iter; | 478 start_point = *iter; |
| 479 } | 479 } |
| 480 | 480 |
| 481 points_being_drawn_.clear(); | 481 points_being_drawn_.clear(); |
| 482 return body; | 482 return body; |
| 483 } | 483 } |
| 484 | 484 |
| 485 void PhysicsLayer::AddShapeToBody(b2Body *body, b2Shape* shape) { | 485 void LevelLayer::AddShapeToBody(b2Body *body, b2Shape* shape) { |
| 486 b2FixtureDef shape_def; | 486 b2FixtureDef shape_def; |
| 487 shape_def.shape = shape; | 487 shape_def.shape = shape; |
| 488 shape_def.density = box2d_density_; | 488 shape_def.density = box2d_density_; |
| 489 shape_def.friction = box2d_friction_; | 489 shape_def.friction = box2d_friction_; |
| 490 shape_def.restitution = box2d_restitution_; | 490 shape_def.restitution = box2d_restitution_; |
| 491 body->CreateFixture(&shape_def); | 491 body->CreateFixture(&shape_def); |
| 492 } | 492 } |
| 493 | 493 |
| 494 void PhysicsLayer::AddSphereToBody(b2Body *body, CCPoint* location) { | 494 void LevelLayer::AddSphereToBody(b2Body *body, CCPoint* location) { |
| 495 b2CircleShape shape; | 495 b2CircleShape shape; |
| 496 shape.m_radius = SCREEN_TO_WORLD(brush_radius_); | 496 shape.m_radius = SCREEN_TO_WORLD(brush_radius_); |
| 497 shape.m_p.x = SCREEN_TO_WORLD(location->x) - body->GetPosition().x; | 497 shape.m_p.x = SCREEN_TO_WORLD(location->x) - body->GetPosition().x; |
| 498 shape.m_p.y = SCREEN_TO_WORLD(location->y) - body->GetPosition().y; | 498 shape.m_p.y = SCREEN_TO_WORLD(location->y) - body->GetPosition().y; |
| 499 AddShapeToBody(body, &shape); | 499 AddShapeToBody(body, &shape); |
| 500 } | 500 } |
| 501 | 501 |
| 502 void PhysicsLayer::AddLineToBody(b2Body *body, CCPoint start, CCPoint end) { | 502 void LevelLayer::AddLineToBody(b2Body *body, CCPoint start, CCPoint end) { |
| 503 float distance = ccpDistance(start, end); | 503 float distance = ccpDistance(start, end); |
| 504 | 504 |
| 505 float sx = start.x; | 505 float sx = start.x; |
| 506 float sy = start.y; | 506 float sy = start.y; |
| 507 float ex = end.x; | 507 float ex = end.x; |
| 508 float ey = end.y; | 508 float ey = end.y; |
| 509 float dist_x = sx - ex; | 509 float dist_x = sx - ex; |
| 510 float dist_y = sy - ey; | 510 float dist_y = sy - ey; |
| 511 float angle = atan2(dist_y, dist_x); | 511 float angle = atan2(dist_y, dist_x); |
| 512 | 512 |
| 513 float posx = SCREEN_TO_WORLD((sx+ex)/2) - body->GetPosition().x; | 513 float posx = SCREEN_TO_WORLD((sx+ex)/2) - body->GetPosition().x; |
| 514 float posy = SCREEN_TO_WORLD((sy+ey)/2) - body->GetPosition().y; | 514 float posy = SCREEN_TO_WORLD((sy+ey)/2) - body->GetPosition().y; |
| 515 | 515 |
| 516 float width = SCREEN_TO_WORLD(abs(distance)); | 516 float width = SCREEN_TO_WORLD(abs(distance)); |
| 517 float height = SCREEN_TO_WORLD(brush_->boundingBox().size.height); | 517 float height = SCREEN_TO_WORLD(brush_->boundingBox().size.height); |
| 518 | 518 |
| 519 b2PolygonShape shape; | 519 b2PolygonShape shape; |
| 520 shape.SetAsBox(width / 2, height / 2, b2Vec2(posx, posy), angle); | 520 shape.SetAsBox(width / 2, height / 2, b2Vec2(posx, posy), angle); |
| 521 AddShapeToBody(body, &shape); | 521 AddShapeToBody(body, &shape); |
| 522 } | 522 } |
| OLD | NEW |