Salux le velux !
J'aimerais te proposer une solution qui peut etre plus simpliste et plus facilement réutilisable !
J'ai un jeu de tir en "top-down" mais que j'utilise en profilé...
Tout d'abord, on va creer une classe pour la balle :
J'ai fait comme ceci : A toi d'adapter si besoin
class Bullet
{
public:
RectangleShape shape;
Vector2f currVelocity;
float speed;
Bullet()
: currVelocity(0.f, 0.f), speed(20.f)
{
this->shape.setSize(Vector2f(18.f, 18.f));
}
};
Une fois ça fait, tu crée un objet de réf et une "liste" :
//BULLETS
Texture bTex;
bTex.loadFromFile("Textures/ball.png", IntRect(Vector2i(0, 0), Vector2i(6, 6)));
Bullet b1;
b1.shape.setTexture(&bTex);
std::vector<Bullet> bullets;
Tu peux crée des vecteurs au lieu des angles pour te faciliter la tache et faire un truc réutilisable à fond ! :
//VECTORS
Vector2f playerCenter;
Vector2f mPosWin;
Vector2f aimDir;
Vector2f aimDirNorm;
... Dans mon update :
//Vectors
playerCenter = Vector2f(player.getPosition().x + player.getSize().x / 2, player.getPosition().y + player.getSize().y / 2);
mPosWin = Vector2f(Mouse::getPosition(window));
aimDir = mPosWin - playerCenter;
aimDirNorm = aimDir / sqrt(pow(aimDir.x, 2) + pow(aimDir.y, 2));
Et apres tu te débrouilles pour que quand tu cliques tu fasse un nouveau bullet à la fin de "bullets" :
if (Mouse::isButtonPressed(Mouse::Left) && shotCounter >= difficulty * 0.8)
{
b1.shape.setPosition(playerCenter);
b1.currVelocity = aimDirNorm * b1.speed;
bullets.push_back(Bullet(b1));
shotCounter = 0;
}
// Ici shotCounter et une variable pour définir ma vitesse de tir et difficulty la difficulté de mon jeu, n'en tien pas compte
Enfin ! Tu bouges tes balles dans une boucles qui prends toutes les balles dans bullets :
for (size_t i = 0; i < bullets.size(); i++)
{
bullets[i].shape.move(bullets[i].currVelocity);
// Ici ce n'est pas fermé car j'ai des choses après
Tiens ! J'espere que ca ira, ne fait pas gaffe au fautes ou autres , car je dois tapper vite !
A plus dans le bus !
Donne moi une update si ca va mieux!
Shawrex