Пример #1
0
void gameInit()
#endif
{
    if (!g_inited)
    {
        Timer::init();
        g_timer.start();

#if CK_PLATFORM_ANDROID
        CkConfig config(env, activity);
        config.useJavaAudio = true;
#else
        CkConfig config;
#endif
        CkInit(&config);

        // mute the volume until the first update; 
        // the volumes & pans of 3D sounds won't be correct until then.
        CkMixer::getMaster()->setVolume(0.0f);

        // sound
        g_music = CkSound::newStreamSound("music.cks");
        g_bank = CkBank::newBank("game.ckb");

        g_pointSound = CkSound::newBankSound(g_bank, "point");

        g_engineSound = CkSound::newBankSound(g_bank, "engine");
        g_engineSound->setLoopCount(-1);
        g_engineSound->setPaused(true);
        g_engineSound->play();

        g_music->setLoopCount(-1);
        g_music->setVolume(0.2f);
        g_music->play();

        g_pointSound->setVolume(0.6f);

        CkSound::set3dAttenuation(kCkAttenuationMode_InvDistanceSquared, 0.5f, 10.0f, 0.05f);


        // game objects
        for (int i = 0; i < kNumCubes; ++i)
        {
            // cube sits just above ground plane
            Cube* cube = new Cube();
            placeCube(cube);

            g_cubes[i] = cube;
        }

        g_ground = new GroundPlane();

        g_ship = new Ship();

        // gameGlInit() is called when the drawing surface is created.

        g_inited = true;
    }
}
Пример #2
0
void gameRender()
{
    // update simulation
    float dt = g_timer.getElapsedMs() * 0.001f;
    g_timer.reset();

    // filter motion so you slow down gradually when you lift your finger off the screen
    const float kChangeFactor = 0.1f;
    g_playerPosChange = g_playerPosChangeTarget * kChangeFactor + g_playerPosChange * (1.0f - kChangeFactor);
    g_playerAngleChange = g_playerAngleChangeTarget * kChangeFactor + g_playerAngleChange * (1.0f - kChangeFactor);

    // update engine sound
    g_engineSound->setPaused(g_playerPosChange == 0.0f);
    float normSpeed = fabs(g_playerPosChange / kPosChangeMax);
    g_engineSound->setPitchShift(normSpeed*8);
    g_engineSound->setVolume(normSpeed * 0.4f);

    // update player position
    Vector3 forwardDir(sinf(g_playerAngle), 0.0f, cosf(g_playerAngle));
    Vector3 dr;
    Vector3::multiply(forwardDir, g_playerPosChange*dt, dr);
    Vector3::add(g_playerPos, dr, g_playerPos);
    g_playerAngle += g_playerAngleChange * dt;

    // keep player angle in [0..2pi]
    if (g_playerAngle > 2.0f*M_PI)
    {
        g_playerAngle -= 2.0f*M_PI;
    }
    else if (g_playerAngle < 0.0f)
    {
        g_playerAngle += 2.0f*M_PI;
    }

    // test for hits
    for (int i = 0; i < kNumCubes; ++i)
    {
        if (g_cubes[i]->hitTest(g_playerPos))
        {
            g_pointSound->play();
            placeCube(g_cubes[i]);
        }
    }

    // render
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    float fov = 0.9f;
    float near = 0.1f;
    float far = 100.0f;
    float aspect = (float) g_width / g_height;

    float top = tanf(fov*0.5) * near;
    float bottom = -top;
    float left = aspect * bottom;
    float right = aspect * top;

    glFrustumf(left, right, bottom, top, near, far);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    // for landscape orientation
    glRotatef(90.0f, 0.0f, 0.0f, 1.0f);

    Vector3 eye;
    Vector3 v;
    Vector3::multiply(forwardDir, -3.0f, v);
    Vector3::add(g_playerPos, v, eye);
    eye.y = 1.0f;

    Vector3::multiply(forwardDir, 1.0f, v);
    Vector3 center;
    Vector3::add(g_playerPos, v, center);

    gluLookAt(eye.x, eye.y, eye.z,
              center.x, center.y, center.z,
              0.0f, 1.0f, 0.0f);

    CkSound::set3dListenerPosition(
            eye.x, eye.y, eye.z,
            center.x, center.y, center.z,
            0.0f, 1.0f, 0.0f);

    g_ship->setTransform(g_playerPos, g_playerAngle * 180.0f / M_PI + 180.0f);
    g_ship->draw();

    for (int i = 0; i < kNumCubes; ++i)
    {
        g_cubes[i]->draw(dt);
    }

    g_ground->draw();

    CkMixer::getMaster()->setVolume(1.0f);

    CkUpdate();
}