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 :

Tetris : intercaler un bloc sous un autre [debutant]


Sujet :

SDL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 98
    Points : 87
    Points
    87
    Par défaut Tetris : intercaler un bloc sous un autre [debutant]
    Tout d'abord bonjour à tous vu que je suis nouveau sur ce forum.

    Je débutes en C et plus particulièrement en programmation de jeux je tente donc de faire un Tetris.

    Ca ne marche pas trop mal pour l'instant mais je me heurte à un probleme. dans le tetris lorsqu'il y a un trou on peut intercaler une autre piece :

    ........................ X
    ......................X X
    .. XXXX =====> ..X

    On veut par exemple intercaler la ligne sous le T.

    Avec ce que j'ai fait j'y arrive mais il faut avoir vraiement de la chance ou mettre un parametre très petit pour l'intervalle de répétition des touches !

    Je precise que pour l'animation je trouvais que cela fesait trop sacadé de faire tomber verticalement les pieces par "bloc" j'ai donc fait tomber les pieces lignes par lignes, il faut donc que l'utilisateur aille a droite pile lorsque la piece est à la bonne ligne pour que la piece aille a droite!

    Voici en gros ma boucle principale, je pense que je sens que je pourrai l'améliorer et je n'en suis pas super satisfait mais bon!

    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
    		while(continuDescente)  {
    			while(SDL_PollEvent(&event)) {
     
    				switch (event.type) {
    				case SDL_QUIT :
    					exit(0);
    					break;
    				case SDL_KEYDOWN :
    					switch (event.key.keysym.sym) {
    				case SDLK_RIGHT :
    					// On incremente x et on vérifie qu'il est dans les limites+
    					// qu'il ne chevauche aucun bloc.
    					positionSuivante.x=positionCentre.x+1;
    					positionSuivante.y=positionCentre.y;
    					positionDessous.x=positionCentre.x+1;
    					positionDessous.y=positionSuivante.y+19;
     
    					if ((!toucheDroite(piece,terrain,positionSuivante))&&
    						(!toucheDroite(piece,terrain,positionDessous))){
    							afficherPiece(piece,ecran,fenetreJeu,bloc_effacement,positionCentre);
    							positionCentre.x++;
    					}
    					break;
    				case SDLK_LEFT :
    					// Le pb est le mm que pour la droite!
     
    					break;
    				case SDLK_UP :
     
    					//Dans la fonction rotation on bouge le bloc et on vérifie qu'il est dans
    					//les limites et qu'il ne chevauche aucun bloc. Si ce n'est pas le cas on renvoie
    					//le bloc qui n'a pas tourné.
    					rotationDroite(piece,terrain,positionCentre);
    					afficherPiece(piece,ecran, fenetreJeu,imageBloc, positionCentre);
    					break;
    				case SDLK_DOWN :
    					SDL_WaitEvent(&event);
    					SDL_WaitEvent(&event);
    					break;
    					}
    				}
    			}
    		}
     
    		/* temporisation */
    		tempsActuel = SDL_GetTicks();
    		if (tempsActuel - tempsPrecedent > 10) {
    			tempsPrecedent=tempsActuel;
     
     
    			positionSuivante.x=positionCentre.x;
    			positionSuivante.y=positionCentre.y+1;
     
    			if (!toucheBas(piece,terrain,positionSuivante)){
    				/* effacement de la piece */
    				afficherPiece(piece,ecran, fenetreJeu,bloc_effacement, positionCentre);
    				positionCentre.y++;
    				afficherPiece(piece,ecran, fenetreJeu,imageBloc, positionCentre);	   
    			}
    			else{
    				continuDescente=0;
    				afficherPiece(piece,ecran, fenetreJeu,imageBloc, positionCentre);	   
    				miseJourTerrain(piece,terrain,positionCentre,couleur);
    			}
    		}
    		else
    			SDL_Delay(10 - (tempsActuel - tempsPrecedent));
    		SDL_Flip(ecran);
    	}
    J'ai également tente de faire une boucle sur le test des touches cela marche tres moyennement

    Merci d'avance de vos réponses

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 104
    Points : 113
    Points
    113
    Par défaut
    Ca ne marche pas trop mal pour l'instant mais je me heurte à un probleme. dans le tetris lorsqu'il y a un trou on peut intercaler une autre piece :
    il te suffit de mettre que quand la piéce touche le bas,ou une autre piéce, tu puisse la controler pendant un petit moment pour aller sur la gauche et la droite, ainsi l'utilisateur pourras inbriquer les piéces sans appuyer frénétiquement sur la bonne direction.

  3. #3
    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
    Citation Envoyé par LeTsIrGoD Voir le message
    il te suffit de mettre que quand la piéce touche le bas,ou une autre piéce, tu puisse la controler pendant un petit moment pour aller sur la gauche et la droite, ainsi l'utilisateur pourras inbriquer les piéces sans appuyer frénétiquement sur la bonne direction.
    Plus simplement : lorsque l'objet ne peut plus descendre il est enfin bloqué et une autre pièce est choisie.

    La différence avec le système courant :

    - On fait descendre l'objet, s'il y a une collision, on annule la descente, on fixe la position et on passe au prochain objet.

    Cela permet de faire bouger latéralement l'objet lorsqu'il arrive à la dernière ligne tant que le programme ne tente pas de le faire descendre.

    Jc

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Août 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 98
    Points : 87
    Points
    87
    Par défaut
    Rohhhh le bouletto que n'y avais-je point pensé!

    Très bonne idée que je viens de mettre en pratique effectivement cela marche impecablement bien.

    Juste une chtite question. J'ai regardé la doc SDL je n'ai pas trouvé de fonction permettant de faire un "SDL_PollEvent" temporisé. La seule solution est-elle de mettre le SDL_PollEvent dans une boucle ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    tempsActuel = SDL_GetTicks();
    while (SDL_GetTicks()-tempsActuel<500){
         while(SDL_PollEvent(&event)) {
             switch (event.type) {
                 case SDL_KEYDOWN :
    		blablabla............
    		break;
            }
         }
    }
    OK fear mais mon programme utilise un SDL_Wait(...) pour reguler la descente, donc tant que je suis dans le wait je ne peux rien tester.
    De plus cela signifierai que le temps qu'on a pour placer la nouvelle piece varie en fonction de la vitesse de chute non?
    De plus comme je fais descendre ligne par ligne la tempo avant d'envoyer une nouvelle piece est quand meme assez faible.
    Ou alors j'ai pas compris ce que tu voulais me dire ?

  5. #5
    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
    Citation Envoyé par pmier Voir le message
    OK fear mais mon programme utilise un SDL_Wait(...) pour reguler la descente, donc tant que je suis dans le wait je ne peux rien tester.
    Un tetris avec SDL_Wait ? Cela me semble étonnant de toute facon, il faudrait mieux passer à SDL_PollEvent.

    De plus cela signifierai que le temps qu'on a pour placer la nouvelle piece varie en fonction de la vitesse de chute non?
    Oui et cela se passe comme cela dans un tetris normal.

    Jc

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Août 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 98
    Points : 87
    Points
    87
    Par défaut
    Oups desole pas SDl_Wait mais SDL_Delay !
    J'ai en plus bien sur un SDL_PollEvent pour "capter" les commandes de l'utilisateur.

    SDL_Delay==>
    Dans ma boucle j'ai mis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    tempsActuel = SDL_GetTicks();
    if (tempsActuel - tempsPrecedent > 10) {
        tempsPrecedent=tempsActuel;
        faire descendre la piece
    }
     
    else {
        SDL_Delay (10 - (tempsActuel - tempsPrecedent));
    }
    Cela me permet que mon jeu tourne à la même vitesse pour des machines plus rapides que la mienne.

    Ah oki je ne savais pas que on avais moins de temps pour placer la piece en dessous sur le vrai tetris !

    En tous les cas merci beaucoup à tous les 2 de vos réponses.


    Je retourne coder la disparition des lignes

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Positionner un bloc sous un autre
    Par pasc06 dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 27/03/2010, 16h33
  2. insérer 2 blocs droites l'un sous l'autre
    Par Stéph utilisateur d'acces dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 11/08/2009, 19h51
  3. [VBA-E] Enregistrer sous un autre format
    Par Bashaq dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 14/10/2005, 23h33
  4. Comment faire ??? Sous formulaire ? Autre ?
    Par Zotto dans le forum IHM
    Réponses: 11
    Dernier message: 14/06/2005, 15h53
  5. Sauvegarde d'une image sous un autre format
    Par gandf dans le forum C++Builder
    Réponses: 4
    Dernier message: 24/02/2004, 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