IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SDL Discussion :

[SDL/C]Projets Space Invaders


Sujet :

SDL

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Juillet 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 5
    Points : 1
    Points
    1
    Par défaut [SDL/C]Projets Space Invaders
    Bonjour !

    Je suis actuellement en train de travailler sur un Space Invader en SDL, et il y a pas mal de chose pour lesquelles j'aurai besoin d'aide

    J'ai déjà fait le système de déplacement gauche et droite pour le joueur principale (presque rien me direz vous ^^), il me reste encore ces éléments a faire:

    - Le système de tir.
    - Les mouvements des Invaders
    - Le système de score. (Augmentation après avoir tué un Invaders.)

    Tout se que je vous demande c'est de m'indiquer des tutos qui pourront m'aider, ou alors, si vous vous sentez prêts a m'aider cela me ferait le plus grand plaisir

    Voila j'attends vos réponse et j'espère trouver de l'aide, merci d'avance !

    Je vous mets mon main.c :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>
    #include <SDL/SDL_ttf.h>
    #include <fmod.h>
    #include <SDL/SDLP_Anim.h>
     
    int main(int argc, char *argv[])
    {
       //Variable
    	int continuer = 1;
       //Creation des variables SDL
    	SDL_Surface *ecran = NULL, *mainPlayer = NULL, *evilPizza = NULL, *score = NULL;
    	TTF_Font *police = NULL;
    	SDL_Color blanc = {255,255,255};
        SDL_Rect positionMainPlayer, positionevilPizza, positionScore;//Les positions
        SDL_Event event;
     
       //Initilistation de la SDL
       SDL_Init(SDL_INIT_VIDEO | SDL_DOUBLEBUF | SDL_INIT_AUDIO);
       TTF_Init();
       //Creation des surfaces
       ecran = SDL_SetVideoMode(482, 240, 32, SDL_SWSURFACE);
       //Remplissage de l'écran
       SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 1, 1, 1));
       //Chargement des images
       mainPlayer = SDL_LoadBMP("Sprites/zozor.bmp");
       evilPizza = SDL_LoadBMP("Sprites/Evilpizza.bmp");
       police = TTF_OpenFont("TECHNOID.TTF", 21);
       score = TTF_RenderText_Solid(police, "0000", blanc);
       //Reglage de la transparence
       SDL_SetColorKey(mainPlayer, SDL_SRCCOLORKEY, SDL_MapRGB(mainPlayer->format, 0, 255, 255));
       SDL_SetColorKey(evilPizza, SDL_SRCCOLORKEY, SDL_MapRGB(evilPizza->format, 0, 255, 255));
       //Positionnement initiale du mainPlayer
       positionMainPlayer.x = ecran->w / 2 - mainPlayer->w / 2;
       positionMainPlayer.y = 200;
       //Positionement de la pizza
       positionevilPizza.x = 95;
       positionevilPizza.y = 40;
       //Position du score
       positionScore.x = 10;
       positionScore.y = 220;
     
     
       //Boucle de mouvement
    	SDL_EnableKeyRepeat(5, 5);
    	SDL_ShowCursor(SDL_DISABLE);
     
     
    	while (continuer)
    {
        SDL_WaitEvent(&event);
        switch(event.type)
        {
    	case SDL_QUIT:
                continuer = 0;
                break;
            case SDL_KEYDOWN:
                switch (event.key.keysym.sym)
                {
                case SDLK_RIGHT: // Flèche droite
                    positionMainPlayer.x++;
                    break;
                case SDLK_LEFT: // Flèche gauche
                    positionMainPlayer.x--;
                    break;
    			case SDLK_ESCAPE: /* Appui sur la touche Echap, on arrête le programme */
                        continuer = 0;
                        break;
                }
                break;
        }
            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0)); /* On efface l'écran */
            SDL_BlitSurface(mainPlayer, NULL, ecran, &positionMainPlayer);/* On place zozor à sa nouvelle position */
            SDL_BlitSurface(evilPizza, NULL, ecran, &positionevilPizza);/*On place la Pizza*/
    		SDL_BlitSurface(score, NULL, ecran, &positionScore);
    		SDL_Flip(ecran); /* On met à jour l'affichage */
        }
     
        TTF_CloseFont(police);
        TTF_Quit();
    	SDL_FreeSurface(mainPlayer);
    	SDL_FreeSurface(evilPizza);
    	SDL_FreeSurface(score);/*On libère de l'espace pour les surfaces*/
        SDL_Quit();
    }

  2. #2
    Expert éminent
    Avatar de raptor70
    Inscrit en
    Septembre 2005
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Septembre 2005
    Messages : 3 173
    Points : 6 812
    Points
    6 812
    Par défaut
    J'ai déplacé le sujet de la rubrique Projet vers SDL car tu sembles ton topic correspond plus à des besoins en SDL que d'un réel besoin de recrutement pour un Projet.
    Mes Tutos DirectX, OpenGL, 3D : http://raptor.developpez.com/

  3. #3
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 022
    Points : 2 273
    Points
    2 273
    Par défaut
    Salut,
    a priori la première chose à faire serait de définir une struct 'Sprite' ou 'Enemy 'dans laquelle tu stockes un pointeur sur SDL_Surface et un pointeur sur SDL_Rect pour tes surfaces et positions. Tu stockes ensuite tes struct dans un tableau que tu pourras utiliser pour l'affichage/blitage/mouvements parce que là ton code va vite être énorme. Pour mieux découper le code tu peux te faire des fonctions draw() et moveSprites() auxquelles tu passeras un pointeur sur ta liste de sprites.
    (Je suis un peu rouillé en C mais l'idée est là )
    Bye
    Vive les roues en pierre

  4. #4
    Nouveau Candidat au Club
    Inscrit en
    Juillet 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Merci ^^ j'avoue que je me suis dit plusieurs fois que j'allais plus m'en sortir avec toute ces lignes Je voulais savoir, tu n'aurais pas un tuto pour animer les Invaders juste un petit mouvement a gauche et un autre a droite droite j'ai vu un tuto sur l'animation mais c'est pas vraiment se que je voudrais faire

  5. #5
    Rédacteur

    Avatar de loka
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    2 672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 672
    Points : 5 509
    Points
    5 509
    Par défaut
    Je pense que ce que tu veux faire est une simple boucle de déplacements automatique, je me trompe ?

    Selon le temps, tes Invaders vont aller à droite, puis à gauche et descendre au fur et à mesure qu'ils changent de direction (comme sur le jeu original).

  6. #6
    Nouveau Candidat au Club
    Inscrit en
    Juillet 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Oui c'est ça en faite mais je ne sait pas me servir de la fonction qui gère les déplacements Il est la le problème , j'ai trouvé un schéma en imaginant que je puisse les tuer grâce au canon ce serait donc:


    Je créé un booléen Invaders qui vaut vrai
    Si il y a collision avec le laser Invaders vaudra faux
    Sinon ne rien faire

    Ensuite la boucle:

    Tant que Invaders vaut vrai faire le déplacement

    Je pense que le schéma est le bon mais j'aimerais en être sûr voila merci pour votre aide

    P.S: Je me demande si je ne devrais pas me mettre au C++

  7. #7
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 022
    Points : 2 273
    Points
    2 273
    Par défaut
    Pour la destruction de ton sprite, il te suffit de le supprimer de ta liste (ou plutôt de mettre ton pointeur à null), pas besoin de savoir s'il est dead ou pas s'il n'existe plus.
    Pour le mouvement tu pourrais stocker la direction et la position référence centrale par exemple, ensuite tu testes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    if(dir == LEFT) {
    moveSprites(-10);
    posRef.x -= 10;
    if(posRef.x == -200) {
    dir == RIGHT
    }
    }
    else {
    moveSprites(10);
    posRef.x += 10;
    if(posRef.x == 200) {
    dir == LEFT;
    }
    }
    Si tu veux un système qui tourne à la même vitesse partout, il faut que tu multiplies ta vitesse par le temps écoulé.
    Vive les roues en pierre

  8. #8
    Rédacteur

    Avatar de loka
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    2 672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 672
    Points : 5 509
    Points
    5 509
    Par défaut
    Sur ce tutoriel :
    http://loka.developpez.com/tutoriel/sdl/mouvements/

    Tu as les déplacement qui réagissent aux touches du clavier, il suffit de prendre la partie qui t'intéresse sans la gestion des touches pour les déplacements.

  9. #9
    Nouveau Candidat au Club
    Inscrit en
    Juillet 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    J'ai pas compris, parce qu'enfaite il faudrait que je fasse une boucle qui fasse bouger l'invader vers la droite donc positionevilPizza.x++; et ensuite vers la gauche positionevilPizza.x--; mais je ne sait pas quelle est la condition de cette boucle ^^ Faut-il que je rajoute autre chose dans ma boucle ? Car pour le moment je fais que des boucles infini

    J'ai trouvé ça mais c'est aussi une boucle infini

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while(&event)
    {
        positionevilPizza.x++;//Changement de position
        SDL_BlitSurface(evilPizza, NULL, ecran, &positionevilPizza);//blittage
        positionevilPizza.x--;//Changement de position
        SDL_BlitSurface(evilPizza, NULL, ecran, &positionevilPizza);//reblittage
    }
    Mais sa ne veut pas marcher...

  10. #10
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 022
    Points : 2 273
    Points
    2 273
    Par défaut
    Non, tu n'as pas besoin de nouvelle boucle, tu es déjà dans la boucle principale. En fait à chaque cycle CPU tu vas déplacer un peu tes objets et ensuite tout dessiner, effectuer les tests claviers etc., c'est pour ça que tu ne peux pas mettre ça dans une autre boucle sinon tu bloques tout. Le schéma basique c'est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while(!done) { // Main loop infini
    move(); // ici tu mets à jour toutes les positions
    draw(); // tu dessines tous les objets avec leur nouvelle position 
    checkKey(); // tu testes les entrées claviers
    }
    C'est pour ça que j'introduisais une variable direction dans le code que je t'ai montré.
    Vive les roues en pierre

  11. #11
    Nouveau Candidat au Club
    Inscrit en
    Juillet 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Je crée une variable direction et je stock la position de gauche et j'en fait une autre avec la position de droite c'est ça que tu voulais que je fasse ? mais j'ai pas compris la position de référence

  12. #12
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 022
    Points : 2 273
    Points
    2 273
    Par défaut
    En fait vu que tous les ennemis se déplacent par bloc, au lieu de tester la position de chaque ennemi, pour savoir s'ils doivent aller à gauche ou à droite, tu peux créer une position de référence ou une position pour le groupe d'ennemis. Il te suffit ensuite de tester seulement cette position pour savoir dans quelle direction faire bouger tous les sprites. La méthode proposée par loka est plus pratique avec la vélocité et finalement t'as pas besoin de la direction. Mettons que l'origine de ta scène soit le centre de ta fenêtre. Tu peux définir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int posX = 0;
    int vel = -10;
    puis dans ta boucle principale, ou plutôt dans une fonction move() que tu vas créer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
           if(vel < 0) {
                posX += vel;
                if(posX <= -200) {
                        vel = -vel;
                }
            }
            else {
                posX += vel;
                if(posX >= 200) {
                          vel = -vel;
                }
            }
                positionevilPizza.x += vel;
    avec ça tu devrais avoir un mouvement de va-et-vient sur x relatif à la position d'origine de tes sprites de -200 à plus 200. Le principe est d'inverser la vélocité quand tu atteins les extrêmes que tu as fixées. Il te suffit ensuite d'appliquer cela à ta liste de sprites.
    (Je te conseille fortement de regarder des tutos de base en C notamment sur les struct, les fonctions et les tableaux.)
    Vive les roues en pierre

  13. #13
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Ensuite, je ferai remarquer qu'il y a beaucoup de problèmes avec ce code. Il faut tester le retour de toutes les fonctions SDL (quasiment toutes) et il y a certains éléments qui sont faux...

    Par exemple, SDL_DOUBLEBUF se passe à SDL_SetVideoMode et pas SDL_Init...

    Jc

Discussions similaires

  1. Petit projet de space invaders !
    Par alexg33 dans le forum Projets
    Réponses: 5
    Dernier message: 05/02/2011, 19h59
  2. {SDL} compilation projet SDL sous windows.
    Par LeFlou dans le forum SDL
    Réponses: 12
    Dernier message: 14/11/2007, 15h50
  3. Space Invader : pb plusieurs missiles à l'écran
    Par Bundy*Al dans le forum Développement 2D, 3D et Jeux
    Réponses: 11
    Dernier message: 19/10/2007, 08h33
  4. SDL et projet sous Dev-C++
    Par salif98 dans le forum SDL
    Réponses: 3
    Dernier message: 23/11/2006, 09h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo