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

Auteur Sujet: Setup avec C::B + Balle  (Lu 3175 fois)

0 Membres et 1 Invité sur ce sujet

Engineer

  • Jr. Member
  • **
  • Messages: 55
    • Voir le profil
Setup avec C::B + Balle
« le: Août 09, 2013, 07:03:33 pm »
Salut !
Je suis nouveau avec CSFML et j'aimerais créer un petit jeu avec.
Le problème est que j'aimerais bien faire ma set-up de CSFML sur Code::blocks.
J'ai fait comme le tutorial pour le CSFML normal en changeant quelques petits trucs (par exemple dans le repertoire de CSFML, pour les include il faut après choisir gcc, il n'y a pas de dll...)

Je veux donc du coup compiler le tutoriel avec la balle, pour voir si tout fonctionne bien. J'adapte donc le code en remplacant les hpp par h et en consultant la documentation pour certaines fonctions.
Voici à ce que j'arrive :


#include <SFML/Graphics.h>

int main()
{
    sfWindow * window;
    sfShape * shape;
    window = sfWindow_create(sfVideoMode(200, 200), "SFML works!");
    shape = sfCircleShape_create(100.f);
    sfShape_setFillColor(shape, sfColor sfGreen);

    while (sfWindow_isOpen(window))
    {
        sfEvent event;
        while (sfWindow_pollEvent(window, event))
        {
            if (sfEventType == sfEvtClosed)
                sfWindow_close(window);
        }

        sfWindow_clear(window);
        sfWindow_draw(shape);
        sfRenderWindow(window);
    }

    return 0;
}


Malgré cela, j'obtiens énormément d'erreurs. Est ce que CSFML est fort différent de la SFML normale ? Par exemple j'ai cru comprendre que dans certaines fonctions il fallait donner plus d'arguments que celles dans la SFML normale (il faut donner le nombre de bit par pixel pour sfVideoMode par exemple). Est ce réellement vrai ?
J'aimerais bien que quelqu'un de fortement expérimenté avec la CSFML corrige mon programme, après quoi je pourrais avoir au moins un bonne set up avec mon IDE et je pourrais réellement commencer à apprendre :)

Les erreurs du build:


main.c:5:30: error: expected expression before 'sfVideoMode'
main.c:5:30: error: too few arguments to function 'sfWindow_create'
main.c:6:5: error: too many arguments to function 'sfCircleShape_create'
main.c:7:33: error: expected expression before 'sfColor'
error: incompatible type for argument 2 of 'sfWindow_pollEvent'
error: expected expression before 'sfEventType'
error: storage size of 'window' isn't known


(PS: En fait je viens de terminer un livre sur le C avec ses exercices et j'ai également concu plusieurs programmes utilisant les différentes notions du C (structures, fichier, pointeur, adresses, tableaux) donc je voulais utiliser mes connaissances et faire un tout petit jeu vidéo (genre un personnage qui se balade, avec une detection de collision pas trop compliquée vue de haut, et qui doit par exemple résoudre des énigmes ou battre des monstres (ca deviendrait plus compliqué du coup puisqu'il faudrait du path-finding) ou alors un pong ou un snake). Bref je veux faire un petit jeu vidéo et je me disais que SDL était trop vieux et plus compliqué, et comme je ne veux pas encore apprendre le C++ (qui a également des notions compliquées (à part l'esprit POO, les vecteurs et le meta-programming ca doit un peu différer du Java  (je viens du Java que j'ai appris à l'unif), je me disais que j'allais utiliser le binding C pour la SFML, si vous avez un conseil à me donner (C++ et SFML, C et SDL ou C et CSFML), je suis preneur).
« Modifié: Août 09, 2013, 09:13:27 pm par Engineer »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Setup avec C::B + Balle
« Réponse #1 le: Août 09, 2013, 11:04:12 pm »
Il n'y a ni constructeur ni paramètre par défaut en C. Les erreurs données par le compilo devraient t'aider à corriger ton code, en t'appuyant sur la documentation de l'API ;)

Ne grille pas les étapes, prends bien le temps de maîtriser la syntaxe de base du C avant de te lancer dans des trucs compliqués avec SFML.
Laurent Gomila - SFML developer

Engineer

  • Jr. Member
  • **
  • Messages: 55
    • Voir le profil
Re : Setup avec C::B + Balle
« Réponse #2 le: Août 10, 2013, 12:15:09 am »
De ce qui est écrit, les fonctions _create renvoient des structures, donc je ne comprends pas ce que tu me dis ?? Et comme je te l'ai dit j'ai fini tous les exo d'un livre en C donc je ne grille pas les étapes, et afficher une balle à l'écran n'est quand même pas compliqué c'est le tutorial de base mis dans l'installation...
Je vais essayer de regarder encore la documentation mais elle n'est pas hyper claire...
Par exemple, impossible pour moi de trouver la fonction clear et draw de window qui est elle disponible en C++ !
Le code actuel :
int main()
{
    sfContextSettings * settings;
    settings->antialiasingLevel = 8;
    sfVideoMode mode;
    mode.height = 200;
    mode.width = 200;
    sfWindow * window;
    sfShape * shape;
    window = sfWindow_create(mode, "SFML works!", sfDefaultStyle ,settings);
    shape = sfCircleShape_create();
    sfShape_setFillColor(shape, sfGreen);

    while (sfWindow_isOpen(window))
    {
        sfEvent * event;
        while (sfWindow_pollEvent(window, event))
        {
            if (sfEventType == sfEvtClosed)
            {
                sfWindow_close(window);
            }
        }

        sfWindow_clear(window);
        sfWindow_draw(shape);
        sfRenderWindow(window);
    }

    return 0;
}

Il me reste juste a comprendre comment clear et draw avec les window, je ne trouve pas dans la documentation... aussi une erreur avec sfeventtype pourtant c'est bien une enumeration...

EDIT1: Après avoir fouillé partout il faut utiliser la classe renderwindow, mais pourquoi diable avoir fait deux classes pour faire une fenetre ? Quelle est la différence principale entre une render window et une window ??
Bref je progresse pas à pas...

EDIT2:

Voici le code final:

#include <SFML/Graphics.h>

int main()
{
    sfContextSettings * settings;
    settings = malloc(sizeof(sfContextSettings));
    settings->antialiasingLevel = 8;
    sfVideoMode mode;
    mode.height = 200;
    mode.width = 200;
    sfRenderWindow * renderwindow;
    sfCircleShape * shape;
    renderwindow = sfRenderWindow_create(mode, "SFML works!", sfDefaultStyle ,settings);
    shape = sfCircleShape_create();
    sfCircleShape_setFillColor(shape, sfGreen);

    while (sfRenderWindow_isOpen(renderwindow))
    {
        sfEvent * event;
        event = malloc(sizeof(sfEvent));
        while (sfRenderWindow_pollEvent(renderwindow, event))
        {
            if (event == sfEvtClosed)
            {
                sfRenderWindow_close(renderwindow);
            }
        }
        sfRenderStates * state;
        state = malloc(sizeof(sfRenderStates));
        state->SfBlendMode == SfBlendNone;

        sfRenderWindow_clear(renderwindow, sfBlack);
        sfRenderWindow_drawCircleShape(renderwindow, shape, state);
        sfRenderWindow_display(renderwindow);
    }

    return 0;
}

La seule chose que je ne comprends pas du tout et j'ai tres bien recherché cette fois c'est, comment afficher une shape sans avoir à mettre un sfRenderState * en argument (car je veux juste afficher ma forme avec sa couleur, sans texture ni blendmode ni transform etc etc).
(PS:j'avais eu quelques problèmes car le malloc() ne fonctionnait pas au début car évidemment c'est à la compilation que l'on connait la taille de l'union, c'est pour ca que je ne les avait pas mis, mais en fait ca fonctionne (warning).)
Une solution pour afficher un cercle sans avoir à recourir à un sfRenderState ?
Merci d'avance. :)
« Modifié: Août 10, 2013, 02:49:32 am par Engineer »

Engineer

  • Jr. Member
  • **
  • Messages: 55
    • Voir le profil
Re : Setup avec C::B + Balle
« Réponse #3 le: Août 10, 2013, 01:41:08 pm »
http://pastebin.com/3Z9jsi5k

Solution ici et explications sur le forum anglais