Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Luoti (Oliot ja Luokat)

Jartsala [28.06.2007 22:34:09]

#

Tässä kehittelin Ammusta räiskintä peliini, toimisiko jotakuinkin näin vai?
Sitten tuosta luonnista että miten se oikein menisi kun en itse keksi millään siihen mitään kätevää keinoa kuin laittaa joku muuttuja perään mutta sekin aivan älyttömän vaikeaa, tiedätte jo miksi joten en jaksa selittää.

Miten tehdään luoti jonka xnextin voin määrätä itse pelissä?

class Bullet
{
public:
  int x;
  int y;
  int xnext;
  int ynext;
  void Move();
  void Draw();
};

void Bullet::Draw()
{
  //Piirrä ammus
}

void Bullet::Move()
{
  x += xnext;
  y += ynext;
}

main()
{
  Bullet ammusNUMERO?; // Miten tuon ammus sanan perään saisi laitettua jonkin muuttujan luvun? (NUMERO? tilalle?)
  ammusNUMERO?.xnext(3);
}

kayttaja-4976 [28.06.2007 22:44:27]

#

Kutsuvat taulukoksi? Ja jos xnext on muuttuja, niin miksi annat sille funktion parametreja?

Touho [28.06.2007 23:28:36]

#

main()
{
 int i;
 Bullet ammus[100];
 for(i=0;i<100;i++) // alustaa jokaisen bulletin yksitellen.
 {
   ammus[i].x = 0;
   ammus[i].y = 0;
   ammus[i].xnext = 1; //suunta oikealle ylös (tai alas, riippuu koordinaatistosta)
   ammus[i].ynext = 1;
 }

 while(1)
 {
  for(i=0;i<100;i++)
  {
    ammus[i].Move();
    ammus[i].Draw();
  }
 }
}

Tässä kaikki ammukset lähtevät kohdasta (0, 0) liikkeelle vinosti oikealle. Ei hirveän käyttökelpoinen, mutta tästä näet, miten panoksia pitää käsitellä.

pieslice [28.06.2007 23:56:46]

#

Kannattaa harkita jonkun kontrolliluokan tekemistä noille ammuksille. Sellaista jossa ammukset ovat memberinä.

Tässä Sylph Wind-pelin bulletmanager luokan headeri. Toivottavasti saat tosta idean, miten noita luoteja käsitellään.

(Ehkä vähän monimutkainen puhtaasti esimerkiksi...)

#ifndef BULLETMANAGER_H
#define BULLETMANAGER_H

#include "MathLib.h"

class Bullet;
class BulletParameters;
class TextureManager;

enum BulletType
{
    EPlayerBullet,
    EEnemyBullet,
};

enum
{
    EMaxPlayerBullets = 256,
    EMaxEnemyBullets = 1024,
};

class BulletManager
{
public:
    BulletManager();
    ~BulletManager();

    void    Init();
    void    InitGraphicsContext( TextureManager& rTextureManager );

    void    Release();

    void    Reset();

    void    UpdateEnemyBullets( unsigned int timeDelta, bool isStalled );
    void    UpdatePlayerBullets( unsigned int timeDelta, bool isStalled );
    void    FireBullet( BulletType type, BulletParameters& rParameters, float bulletScaleCounter = 0.f );

    void    Render( BulletType type, TextureManager& rTextureManager );

    int     GetEnemyBulletCount()   { return enemyBulletCount; }
    int     GetPlayerBulletCount()  { return playerBulletCount; }

    void    WipePlayerBullets() { playerBulletCount = 0; }
    void    WipeEnemyBullets()  { enemyBulletCount = 0; }
    void    RestoreBuzz();

private:

    void    BeginRender( TextureManager& rTextureManager, bool glow, bool _3d );
    void    EndRender( bool _3d );
    void    LoadShaders();

    void    RemoveBulletFromStack( Bullet* pBulletToRemove, int count );

    Bullet* pEnemyBulletStack;
    Bullet* pPlayerBulletStack;
    int     enemyBulletCount;
    int     playerBulletCount;

    float   bulletBloom;
    float   bloomCounter;

};
#endif

Siis edellisessä postauksessa oleva:
Bullet ammus[100];
array käytännössä sisältää maksimimäärän luoteja ruudulla.
Sitten kannattaa määritellä muuttuja jossa on ruudulla olevien luotien määrä.

Edelleenkin Sylph Windistä. Bulletmanager luokan updateplayerbullets.

void BulletManager::UpdatePlayerBullets( unsigned int timeDelta, bool isStalled )
{
    if ( isStalled ) return;

    const float timeDeltaSeconds = (float)timeDelta / 1000.f;

    for ( int i = 0; i < playerBulletCount; i++ )
    {
        bool shouldBeDestroyed = false;

        Bullet& rBullet = pPlayerBulletStack[i];
        rBullet.Update( timeDeltaSeconds );
        Math::Vector3D bulletPos = rBullet.GetPosition();
        if ( !rBullet.IsOnScreen( EPlayerBullet ) ) shouldBeDestroyed = true;

        if ( GameDataContainer::GetEnemyManager().TestCollisionsWithPlayerBullet(bulletPos) ) shouldBeDestroyed = true;

        if ( shouldBeDestroyed )
        {
            if ( i == playerBulletCount - 1 )
            {
                playerBulletCount--;
                break;
            }
            else
            {
                const int count = (playerBulletCount - 1) - i;
                RemoveBulletFromStack( &pPlayerBulletStack[i], count );
                playerBulletCount--;
            }
            i--;
        }
    }
}

Tuossa vielä Sylph Windin bullet-luokan update, mistä näet miten noita liikutetaan käytännössä.

void Bullet::Update( float timeDeltaSeconds )
{
    const float rad     = Math::DegToRad( orientation.y );
    const float sine    = sin( rad );
    const float cosine  = cos( rad );

(SNIP)
    {
        position.x += sine * (velocity * timeDeltaSeconds);
        position.z += cosine * (velocity * timeDeltaSeconds);
    }

(SNIP)

}

Metabolix [29.06.2007 00:06:18]

#

Vaan kysyjällä taitavat olla sen verran alkeetkin vielä hakusessa, että ehkä olisi hyvä muistella sellaisia perusasioita kuin muuttujien nimeäminen ja arvon sijoitus jne.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta