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; } }
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(); }