Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: Création balle pour jeu de tir  (Lu 1143 fois)

0 Membres et 1 Invité sur ce sujet

spiitroz

  • Newbie
  • *
  • Messages: 0
    • Voir le profil
Création balle pour jeu de tir
« le: Novembre 18, 2019, 10:41:09 pm »
Bonjour à toutes et à tous,

Voilà, pour un projet dans mes études je dois créer un mini jeu. Je ne suis donc parti sur un style de jeu shooter. Mais je bloque sur un point, qui n'est pas négligeable... la création et le suivi de la balle. Je n'arrive pas à faire apparaître la balle lorsque je suis sensé cliquer sur le bouton gauche de ma souris et ainsi que cette balle parte dans la direction de mon curseur.

Vous allez surement me dire d'aller voir sur google, etc. Malheureusement je ne trouve pas de solution, du moins pour mon style de programmation. Si quelqu'un aurez une idée et pourrez m'aider cela serait sympa !

Voici mon code jusqu'à présent :
#include <SFML/Graphics.hpp>
#include <iostream>
#include <math.h>
#include <vector>
 
#define LARGEUR_FEN 1032
#define HAUTEUR_FEN 774
 
#define PERSO "perso.png"
#define HAUTEUR_PERSO 38
#define LARGEUR_PERSO 35
 
#define BALLE "balle.png"
#define HAUTEUR_BALLE 5
#define LARGEUR_BALLE 20
 
#define VISEUR "viseur.png"
#define TAILLE_VISEUR 25
 
using namespace sf;
 
typedef struct
{
    int x;
    int y;
} Point;
 
int main()
{
    //Initialisation variable
    float angle;
    int posMouseX, posMouseY;
    Vector2i mouse;
    Vector2f persoPosition;
    Point position;
 
    //Création de la fenêtre
    RenderWindow fen(VideoMode(LARGEUR_FEN, HAUTEUR_FEN), "Personnage");
    fen.setMouseCursorVisible(false);
    View fixed = fen.getView();
 
    //Initialisation de l'image du perso
    Texture image1;
    if(!image1.loadFromFile("perso.png"))
        printf("Probleme de chargement de l'image %s !\n", PERSO);
    Sprite perso;
    perso.setTexture(image1);
    perso.setOrigin(LARGEUR_PERSO/2, HAUTEUR_PERSO/2);
    perso.setPosition(LARGEUR_FEN/2, HAUTEUR_FEN/2);
    perso.setRotation(0);
 
    Texture image2;
    if(!image2.loadFromFile("balle.png"))
        printf("Probleme de chargement de l'image %s !\n", BALLE);
    Sprite balle;
    balle.setTexture(image2);
    balle.setOrigin(LARGEUR_BALLE/2, HAUTEUR_BALLE/2);
    balle.setPosition(position.x, position.y);
 
    Texture image3;
    if(!image3.loadFromFile("viseur.png"))
        printf("Probleme de chargement de l'image %s !\n", VISEUR);
    Sprite viseur;
    viseur.setTexture(image3);
    viseur.setOrigin(TAILLE_VISEUR/2, TAILLE_VISEUR/2);
    viseur.setPosition(position.x, position.y);
 
    // Initialisation de la fenêtre
    while (fen.isOpen())
    {
        persoPosition = perso.getPosition();
        posMouseX = mouse.x - persoPosition.x;
        posMouseY = mouse.y - persoPosition.y;
        mouse = Mouse::getPosition(fen);
        angle = -atan2 (posMouseX, posMouseY)*180/3.14;
        perso.setRotation(angle);
 
 
 
        Event event;
        while(fen.pollEvent(event))
        {
            switch(event.type)
            {
            case Event::Closed:
                fen.close();
                break;
 
            case Event::MouseButtonPressed:
                if(event.mouseButton.button == Mouse::Left)
                {
 
                }
                break;
 
            case Event::MouseMoved:
                if(event.mouseMove.y <= TAILLE_VISEUR/2)
                {
                    viseur.setPosition(event.mouseMove.x, TAILLE_VISEUR/2);
                }
                else if(event.mouseMove.y > HAUTEUR_FEN-TAILLE_VISEUR/2)
                {
                    viseur.setPosition(event.mouseMove.x, HAUTEUR_FEN-TAILLE_VISEUR/2);
                }
                else if(event.mouseMove.x <= TAILLE_VISEUR/2)
                {
                    viseur.setPosition(event.mouseMove.y, TAILLE_VISEUR/2);
                }
                else if(event.mouseMove.x > LARGEUR_FEN-TAILLE_VISEUR/2)
                {
                    viseur.setPosition(event.mouseMove.y, LARGEUR_FEN-TAILLE_VISEUR/2);
                }
                else
                {
                    viseur.setPosition(event.mouseMove.x,event.mouseMove.y);
                    // Affichage Fenêtre
                    fen.clear();
                    fen.draw(perso);
                    fen.setView(fixed);
                    fen.draw(viseur);
                    fen.display();
                }
                break;
            }
        }
    }
 
 
    system("pause");
    return EXIT_SUCCESS;
}
Merci d'avance

Shawrex

  • Newbie
  • *
  • Messages: 1
    • Voir le profil
    • E-mail
Re: Création balle pour jeu de tir
« Réponse #1 le: Novembre 20, 2019, 09:20:44 pm »
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  8)