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);
}Kutsuvat taulukoksi? Ja jos xnext on muuttuja, niin miksi annat sille funktion parametreja?
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ä.
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;
};
#endifSiis 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)
}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.
Aihe on jo aika vanha, joten et voi enää vastata siihen.