示例#1
0
文件: App.cpp 项目: eggerdo/Zumo
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;
	}

	}
}
示例#2
0
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
}