示例#1
0
//--------------------------------------------------------------
// initialize application
void DontHitMe::appInit()
{
  // get the important directories
  mgString shaderDir;
  m_options.getFileName("shaderDir", m_options.m_sourceFileName, "docs/shaders", shaderDir);
  mgString uiDir;
  m_options.getFileName("uiDir", m_options.m_sourceFileName, "docs/ui", uiDir);
  mgString fontDir;
  m_options.getFileName("fontDir", m_options.m_sourceFileName, "docs/fonts", fontDir);

  mgInitDisplayServices(shaderDir, fontDir);

  mgDisplay->setFOV(m_options.getDouble("FOV", 60.0));
  mgDisplay->setDPI(m_options.getInteger("DPI", 0));

  // load cursor pattern
  loadCursor();
  setDeskMode(true);

  initMovement();

  // load the shaders we might use
  mgVertex::loadShader("litTexture");
  mgVertex::loadShader("unlitTexture");
  mgVertex::loadShader("litTextureCube");
  mgVertex::loadShader("unlitTextureCube");
  mgVertexTA::loadShader("litTextureArray");
  mgVertexTA::loadShader("unlitTextureArray");

  m_sky = new StarrySky(m_options);
  m_sky->enableSkyBox(true);
  m_sky->enableStars(true);
  m_sky->enableSun(true);

  mgPoint3 lightDir(0, 1, 1);
  lightDir.normalize();
  m_sky->setSunDir(lightDir);

  mgDisplay->setLightDir(lightDir);

  m_saucer = new Saucer(m_options);
  m_planet = new Planet(m_options);

  m_wreck = new Wreck(m_options);
  m_tower1 = new Tower(m_options, false);
  m_tower2 = new Tower(m_options, false);

  mgString fileName;
  m_options.getFileName("tube", m_options.m_sourceFileName, "tube.jpg", fileName);
  m_tubeTexture = mgDisplay->loadTexture(fileName);

  initTrack();
  initBall();
  updateBallPt();

  m_intro = new Intro(m_options, m_ballOrigin);
  m_showingIntro = false;

  m_lastAnimate = mgOSGetTime();  // now!
}
示例#2
0
//-----------------------------------------------------------------------------
// animate the scene
void Intro::animate(
  double now,
  double since)
{
  m_saucer->animate(now, since);
  updateBallPt();
}
示例#3
0
//--------------------------------------------------------------------
// animate the view
BOOL DontHitMe::appViewAnimate(
  double now,                       // current time (ms)
  double since)                     // milliseconds since last pass
{
  m_saucer->animate(now, since);

  // update move/turn 
  BOOL changed = true;
  if (m_flying)
  {
    // construct eye matrix
    m_eyeMatrix.loadIdentity();
    m_eyeMatrix.rotateZDeg(m_eyeRotZ);
    m_eyeMatrix.rotateYDeg(m_eyeRotY);
    m_eyeMatrix.rotateXDeg(m_eyeRotX);

    changed |= updateFlyingMovement(now, since);
  }
  else 
  {
    updateRollingMovement(now, since);

    // change position of ball
    double dist = since * m_rollSpeed;
    m_ballPosn += dist;
    while (m_ballPosn > m_tube->m_trackLen)
    {
      m_ballPosn -= m_tube->m_trackLen;
    }
    while (m_ballPosn < 0)
    {
      m_ballPosn += m_tube->m_trackLen;
    }

    if (m_rollSpeed > 0)
      m_rollSpeed = max(0, m_rollSpeed - m_rollDrag*since);
    else m_rollSpeed = min(0, m_rollSpeed + m_rollDrag*since);

    // change rotation of ball
    double angle = since * m_rotateSpeed;
    m_ballRotate += angle;
    if (m_ballRotate > 180.0)
      m_ballRotate -= 360.0;
    if (m_ballRotate < -180.0)
      m_ballRotate += 360.0;

    if (m_rotateSpeed > 0)
      m_rotateSpeed = max(0, m_rotateSpeed - m_rotateDrag*since);
    else m_rotateSpeed = min(0, m_rotateSpeed + m_rotateDrag*since);

    updateBallPt();

    changed = true;
  }
  
  return m_eyeChanged || changed;
}
示例#4
0
//--------------------------------------------------------------
// constructor
Intro::Intro(
  const mgOptionsFile& options,
  const mgPoint3& origin)
{
  m_origin = origin;

  // load wall texture
  mgString fileName;
  options.getFileName("tube", options.m_sourceFileName, "tube.jpg", fileName);
  m_tubeTexture = mgDisplay->loadTexture(fileName);

  options.getFileName("intro-wall", options.m_sourceFileName, "tube.jpg", fileName);
  m_wallTexture = mgDisplay->loadTexture(fileName);

  m_saucer = new Saucer(options);
  m_tube = new Tube(TUBE_RADIUS, TUBE_STEPS);
  m_wall = new Tube(WALL_RADIUS, WALL_STEPS);

  initTrack();
  m_ballPosn = 0.0;
  updateBallPt();
}