void onCustom(message_t* msg) { CustomCommands cmd = (CustomCommands)getType(msg); switch(cmd) { #ifdef MAZESOLVER case INIT_MAZE: { LOGi("mazSolver.init"); // Storage::setCurrentProgram(Prog_MazeSolver); LOGi("Program MazeSolver selected"); // mazeSolver.init(); break; } case START_MAZE: { LOGi("mazSolver.start"); // mazeSolver.start(); break; } case STOP_MAZE: { LOGi("mazSolver.stop"); // mazeSolver.stop(); break; } case REPEAT_MAZE: { LOGi("mazSolver.repeat"); // mazeSolver.repeat(); break; } case INIT_LINE_FOLLOWER: { LOGi("linefollower.init"); // Storage::setCurrentProgram(Prog_LineFollower); LOGi("Program LineFollower selected"); // mazeSolver.init(); break; } case START_LINE_FOLLOWER: { LOGi("linefollower.start"); // mazeSolver.start(); break; } case STOP_LINE_FOLLOWER: { LOGi("linefollower.stop"); // mazeSolver.stop(); break; } #endif #ifdef LINE_FOLLOWER case INIT_LINE_FOLLOWER: { LOGi("linefollower.init"); // linefollower.init(); break; } case START_LINE_FOLLOWER: { LOGi("linefollower.start"); // linefollower.start(); break; } case STOP_LINE_FOLLOWER: { LOGi("linefollower.stop"); // linefollower.stop(); break; } #endif #ifdef USE_COMPASS case CALIBRATE_COMPSS: { LOGi("compass.calibrate"); compass.calibrate(); break; } case INIT_HEADING: { LOGi("compass.reset"); calibrateHeading(); break; } case TURN_DEG: { LOGi("compass.turn"); turndegree_payload* payload = (turndegree_payload*) msg->payload; turnDegrees(payload->angle); break; } case SET_HEADING: { LOGi("setAbsAngle"); turndegree_payload* payload = (turndegree_payload*) msg->payload; setTargetHeading(payload->angle); break; } #endif #ifdef SUMO case START_SUMO: { LOGi("sumo.start"); // Storage::setCurrentProgram(Prog_Sumo); LOGi("Program Sumo selected"); // sumo.start(); break; } case STOP_SUMO: { LOGi("sumo.stop"); // sumo.stop(); break; } #endif // case SET_PROGRAM: { // program_payload* payload = (program_payload*)msg->payload; // _currentProgram = (Program)payload->program; // Storage::setCurrentProgram(_currentProgram); // break; // } case SET_WHITE_LINES: { whitelines_payload* payload = (whitelines_payload*)msg->payload; _whiteLines = (bool)payload->whiteLines; Storage::setWhiteLines(_whiteLines); break; } } }
void HelloWorld::update(float dt) { auto n = (Notifier*) notifier; timeSinceLastMouseUp += dt; timeSinceLastNotifierUpdate += dt; timeSinceLastObjectCull += dt; Vec2 visibleSize = Director::getInstance()->getVisibleSize(); bool updateMinimap = timeSinceLastNotifierUpdate >= MINIMAP_REDRAW_FREQ; // cull first, then update the remainder if(timeSinceLastObjectCull >= OBJECT_CULL_FREQ) { timeSinceLastObjectCull -= OBJECT_CULL_FREQ; std::vector<int> toRemove; for (auto sprite : torpedoVect) { auto bounds = (GAME_SIZE + visibleSize) / 2; if(sprite->getPosition().x < -1* bounds.x || sprite->getPosition().x > bounds.x || sprite->getPosition().y < -1*bounds.y || sprite->getPosition().y > bounds.y) { toRemove.push_back(sprite->getID()); } } for (int i : toRemove) { removeTorpedoByID(i); } toRemove.clear(); for (auto sprite : spriteVect) { auto bounds = (GAME_SIZE + visibleSize) / 2; if(sprite->getPosition().x < -1* bounds.x || sprite->getPosition().x > bounds.x || sprite->getPosition().y < -1*bounds.y || sprite->getPosition().y > bounds.y) { toRemove.push_back(sprite->getID()); } } for (int i : toRemove) { removeSpriteByID(i); } } // redirect the player sub if it veers off map //TODO: enemy subs if(playerSub->getPosition().x < -1*GAME_SIZE.x/2) playerSub->setPosition(-1*GAME_SIZE.x/2, playerSub->getPosition().y); else if(playerSub->getPosition().x > GAME_SIZE.x/2) playerSub->setPosition(GAME_SIZE.x/2, playerSub->getPosition().y); if(playerSub->getPosition().y < -1*GAME_SIZE.y/2) playerSub->setPosition(playerSub->getPosition().x, -1*GAME_SIZE.y/2); else if(playerSub->getPosition().y > GAME_SIZE.y/2) playerSub->setPosition(playerSub->getPosition().x, GAME_SIZE.y/2); if(updateMinimap) timeSinceLastNotifierUpdate -= MINIMAP_REDRAW_FREQ; n->setLookingAt(lookingAt()); for (auto p : typeKeyCandidates) { *p.second += dt; } // process user input before updating existing items // while key pressed for (auto key : activeKeys) { auto ps = (Submarine*)playerSub; switch (key) { case EventKeyboard::KeyCode::KEY_UP_ARROW: { setPlayerForce(getPlayerForce() + playerDeltaForcePerSecond * dt); break; } case EventKeyboard::KeyCode::KEY_DOWN_ARROW: { setPlayerForce(getPlayerForce() - playerDeltaForcePerSecond * dt); break; } #ifdef TURN_VIA_ARROW_KEYS case EventKeyboard::KeyCode::KEY_RIGHT_ARROW: { ps->setTargetHeading(ps->getTargetHeading() + ps->getTurnSpeed() * dt); break; } case EventKeyboard::KeyCode::KEY_LEFT_ARROW: { ps->setTargetHeading(ps->getTargetHeading() - ps->getTurnSpeed() * dt); break; } #endif } } // update existing items n->update(dt); for (auto o3s : spriteVect) { o3s->update(dt); } for (auto torpedo : torpedoVect) { torpedo->update(dt); if(updateMinimap) n->newMinimapTorpedo(torpedo->getPosition(), torpedo->getID()); n->newOffscreenTorpedo(torpedo->getPosition(), torpedo->getID()); } lastPlayerPos = playerSub->getPosition(); if(playerTurning && !((Submarine*)playerSub)->isTurning()) { playerTurning = false; setPlayerForce(getPlayerForce()); } else if(!playerTurning && ((Submarine*)playerSub)->isTurning()) { playerTurning = true; setPlayerForce(getPlayerForce()); } playerSub->update(dt); // update speed display after physics simulation ((Notifier*)notifier)->setSpeedText(((Submarine*)playerSub)->getSpeed()); if(updateMinimap) n->newMinimapPlayer(playerSub->getPosition(), ((O3Sprite*)playerSub)->getID()); #ifdef LOCK_PLAYER_CAMERA lookAt(playerSub->getPosition()); #else moveScreenBy(playerSub->getPosition() - lastPlayerPos); #endif }