Criar jogo com DarkGDK em C++ - Trajetória linear de tiros e navegação simples

Este programa mostra uma navegação simples com as teclas SETAESQUERDA, SETADIREITA, SETAPRACIMA, SETAPRABAIXO e ESPAÇO.
Apertando essas teclas faz a nave mover pra esquerda, direita, pra cima e pra baixo respectivamente. A última serve pra disparar o tiro. Apenas isso.





Principal.cpp
#include "DarkGDK.h"

struct TPonto {
  float X, Y;
};

struct TVeiculo {
  bool   Atirou, Sinal;
  float  TiroVelocidade;
  int    Id, IdDirecao, IdTiro, Escala, TiroInc;
  TPonto Tiro, TiroInicio;
};

const int cIdNaveTiroSom= 501;
const int cIncNaveTiroY = 5;
const int cIncNaveX     = 5;
const int cIncNaveY     = 5;
const int cXMin         = cIncNaveX;

char *cNaveNome         = "nave.bmp";
char *cNaveTiroNome     = "tiro.bmp";
char *cNaveTiroSomNome  = "fire.wav";

int      gAlturaMaxAdv, gLarguraMaxAdv, gYMin, gYMax, gYMaxAdv;
TVeiculo gAdversario, gNave;
void Atirar_Nave (void)

{
  if (!gNave.Atirou) {
    gNave.Atirou= true;
    gNave.Tiro.X= dbSpriteX (gNave.Id) + (dbSpriteWidth (gNave.Id) / 2) - (dbSpriteWidth (gNave.IdTiro) / 2);
    gNave.Tiro.Y= dbSpriteY (gNave.Id) - 15;
    dbShowSprite (gNave.IdTiro);
    dbPlaySound (cIdNaveTiroSom);
  }
}
void Navegar (void)

{
  if (dbUpKey ())
    if (dbSpriteY (gNave.Id) - cIncNaveY >= gYMin)
      dbSprite (gNave.Id, dbSpriteX (gNave.Id), dbSpriteY (gNave.Id) - cIncNaveY, 1);

  if (dbDownKey ())
    if (dbSpriteY (gNave.Id) + cIncNaveY <= gYMax)
      dbSprite (gNave.Id, dbSpriteX (gNave.Id), dbSpriteY (gNave.Id) + cIncNaveY, 1);

  if (dbKeyState (203) || dbKeyState (30)) // Movimentar nave pra esquerda <Seta esquerda>, <a>
    if (dbSpriteX (gNave.Id) >= cXMin)
      dbSprite (gNave.Id, dbSpriteX (gNave.Id) - cIncNaveX, dbSpriteY (gNave.Id), 1);

  if (dbKeyState (205) || dbKeyState (32)) // Movimentar nave pra direita <Seta direita>, <d>
    if (dbSpriteX (gNave.Id) <= dbScreenWidth () - dbSpriteWidth (gNave.Id) - cXMin)
      dbSprite (gNave.Id, dbSpriteX (gNave.Id) + cIncNaveX, dbSpriteY (gNave.Id), 1);

  if (dbKeyState (57)) // Atirar <Barra de espaço>
    Atirar_Nave ();
}
void Mostrar_NaveTiro (void)

{
  if (gNave.Atirou) {
    if (gNave.Tiro.Y <= 0)
      gNave.Atirou= false;
    else {
      dbSprite (gNave.IdTiro, gNave.Tiro.X, gNave.Tiro.Y, 1);
      gNave.Tiro.Y= gNave.Tiro.Y - cIncNaveTiroY*gNave.TiroVelocidade;
    }
    if (!gNave.Atirou)
      dbHideSprite (gNave.IdTiro);
  }
}
void DarkGDK (void)

{
  dbSetDisplayMode (320, 320, 32);

  dbSyncOn ();
  dbSyncRate (60);

  SetCurrentDirectory ("objeto");

  gNave.Atirou        = false;
  gNave.Id            = 10;
  gNave.IdTiro        = 11;
  gNave.TiroVelocidade= 2.0f;

  dbCreateAnimatedSprite (gNave.Id,     cNaveNome,     1, 1, gNave.Id);
  dbCreateAnimatedSprite (gNave.IdTiro, cNaveTiroNome, 1, 1, gNave.IdTiro);

  gAlturaMaxAdv = dbSpriteHeight (gAdversario.Id);
  gLarguraMaxAdv= dbSpriteWidth (gAdversario.Id);

  dbStretchSprite (gNave.Id,     50, 50);
  dbStretchSprite (gNave.IdTiro, 50, 50);

  dbLoadSound (cNaveTiroSomNome, cIdNaveTiroSom);

  gYMax   = dbScreenHeight () - dbSpriteHeight (gNave.Id) - 2;
  gYMaxAdv= dbScreenHeight () / 2;
  gYMin   = gYMaxAdv + gAlturaMaxAdv*2;

  dbSprite (gNave.Id, (dbScreenWidth ()-dbSpriteWidth (gNave.Id))/2, gYMax, 1);

  while (LoopGDK () && !dbEscapeKey ()) {
    Navegar ();
    Mostrar_NaveTiro ();
    dbSync ();
  }
}


Clique aqui pra baixar o código







http://transeberiano.brinkster.net