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

Auteur Sujet: Problème affichage sprites  (Lu 1758 fois)

0 Membres et 2 Invités sur ce sujet

Matoux

  • Newbie
  • *
  • Messages: 2
    • Voir le profil
    • E-mail
Problème affichage sprites
« le: Avril 24, 2013, 12:01:59 am »
Salut à tous!

J'ai décidé de faire un jeu de plateforme en SFML.

Au début, je faisait tout mon programme dans mon main (oui, c'est crade, je sais :P), et il marchais très bien!

Mais j'ai décidé de découper mon programme en plusieurs fonctions ou classes, et je rencontre un problème à l'affichage de mon décor:

toute la ligne des premiers blocs est remplacé par une barre de la couleur du raffraichissement de l'écran.

capture d'écran:



Comme vous vous en doutez, j'aimerai bien que quelqu'un m'explique pourquoi, ou, au mieux, me donne une solution ;D.

Je remercie d'avance tout ceux qui vont faire un post sur ce sujet ;).

Et, bien sur, je vous met les fichier concernés par ce problème(vous allez surement trouver que le code est peu synthétique, mais je code depuis peu, et c'est mon premier "gros" projet, sans l'appuie d'un tuto):

main.cpp:

#include "Screen.h"
#include "Personnage.h"
 
using namespace sf;
 
int main()
{
RenderWindow prog(VideoMode(1216, 684), "Test.exe");
int yScreen(prog.GetHeight()/38), ind(38), indR(38), finX(0);
double indT(0), constt(0.027);
char pos('d');
bool droite(false), gauche(false), haut(false), bas(false);
Clock timer, timerMarche;
Event event;
Screen screen(yScreen);
screen.chargementLvl(1);
finX=(screen.getfichierLvlsize()-prog.GetWidth()/38)*38;
prog.UseVerticalSync(true);
while(prog.IsOpened())
{
    while(prog.GetEvent(event))
    {
        switch  (event.Type)
{
case  Event::Closed :
prog.Close();
break;
case  Event::KeyPressed :
{
switch  (event.Key.Code)
{
case  Key::Escape :
prog.Close();
break;
case Key::Right :
droite=true;
pos='d';
ind=0;
timerMarche.Reset();
break;
case Key::Left :
gauche=true;
pos='g';
indR=0;
timerMarche.Reset();
break;
case Key::Down :
bas=true;
haut=false;
break;
case Key::Up :
haut=true;
bas=false;
break;
default  :
break;
}
}
break;
case Event::KeyReleased :
{
    switch (event.Key.Code)
    {
        case Key::Right :
        droite=false;
        break;
        case Key::Left :
        gauche=false;
        break;
        case Key::Down :
        bas=false;
        break;
        case Key::Up :
        haut=false;
        break;
        default :
        break;
    }
}
break;
default  :
break;
}
    }
    prog.Clear(Color(2, 255, 255));
    screen.scroling(ind, indR, prog.GetWidth(), gauche, droite);
    for (int i(0); i<yScreen; i++)
        {
    for (int j(0); j<screen.getfichierLvlsize(); j++)
    {
        prog.Draw(screen.getSprite(j, i));
    }
        }
    prog.Display();
}
return EXIT_SUCCESS;
}

 

Screen.h:

#ifndef SCREEN_H_INCLUDED
#define SCREEN_H_INCLUDED
#include <SFML/Graphics.hpp>
#include <fstream>
#include <string>
#include <iostream>
#include <vector>
 
using namespace sf;
 
class Screen
{
    public:
 
    Screen(int yS);
    ~Screen();
    void chargementLvl(int nomLvl);
    int getfichierLvlsize() const;
    Sprite getSprite(int j, int i);
    void scroling(int indt, int indtR, int w, bool gauche=false, bool droite=false);
 
 
    private:
 
    Image *Zero, *Un, *Deux, *Trois, *Quatre, *Cinq, *Six, *Sept;
    int y, x, yScreen, finX, ind, indR, indDX;
    Sprite **screen;
    int **xScreen;
    std::ifstream *fluxFichierLvl;
    std::string ligne;
    std::vector<std::string> fichierLvl;
    double indT, constt;
    Clock timer;
};
 
#endif // SCREEN_H_INCLUDED

 

Screen.cpp:

#include "Screen.h"
 
Screen::Screen(int yS)
{
    int y(0), x(0);
    Zero= new Image;
    Un= new Image;
    Deux= new Image;
    Trois= new Image;
    Quatre= new Image;
    Cinq= new Image;
    Six= new Image;
    Sept= new Image;
    Zero->LoadFromFile("fond.png");
    Un->LoadFromFile("bloc.png");
    Deux->LoadFromFile("sol.png");
    Trois->LoadFromFile("bloqueBonus.png");
    Quatre->LoadFromFile("murCassable.png");
    Cinq->LoadFromFile("pics.png");
    Six->LoadFromFile("plateformeTraversableBas.png");
    Sept->LoadFromFile("plateformeTraversableHaut.png");
    constt=0.027;
    ind=38;
    indR=38;
    finX=0;
    indDX=0;
    yScreen=yS;
}
 
Screen::~Screen()
{
    for (int i(0); i<fichierLvl[0].size(); i++)
{
    delete screen[i];
    delete xScreen[i];
}
    delete screen;
    delete fluxFichierLvl;
    delete xScreen;
    delete Zero;
    delete Un;
    delete Deux;
    delete Trois;
    delete Quatre;
    delete Cinq;
    delete Six;
    delete Sept;
}
 
int Screen::getfichierLvlsize() const
{
    return fichierLvl[0].size();
}
 
void Screen::chargementLvl(int nomLvl)
{
    if (nomLvl==1)
    {
        fluxFichierLvl= new std::ifstream("lvl.txt");
    }
    else if(nomLvl==2)
    {
    }
    else if(nomLvl==3)
    {
    }
    else if(nomLvl==4)
    {
    }
    else if(nomLvl==5)
    {
    }
    else if(nomLvl==6)
    {
    }
    else if(nomLvl==7)
    {
    }
    else if(nomLvl==8)
    {
    }
    else if(nomLvl==9)
    {
    }
    else if(nomLvl==10)
    {
    }
while(getline(*fluxFichierLvl, ligne))
{
    fichierLvl.push_back(ligne);
}
screen= new Sprite*[fichierLvl[0].size()];
xScreen= new int*[fichierLvl[0].size()];
for (int i(0); i<fichierLvl[0].size(); i++)
{
    screen[i]=new Sprite[yScreen];
    xScreen[i]=new int[yScreen];
}
for (int i(0); i<yScreen; i++)
{
    for (int j(0); j<fichierLvl[0].size(); j++)
    {
        screen[j][i].SetPosition(x,y);
        xScreen[j][i]=x;
        if (fichierLvl[i][j]=='0')
        {
            screen[j][i].SetImage(*Zero);
        }
        else if (fichierLvl[i][j]=='1')
        {
            screen[j][i].SetImage(*Un);
        }
        else if (fichierLvl[i][j]=='2')
        {
            screen[j][i].SetImage(*Deux);
        }
        else if (fichierLvl[i][j]=='3')
        {
            screen[j][i].SetImage(*Trois);
        }
        else if (fichierLvl[i][j]=='4')
        {
            screen[j][i].SetImage(*Quatre);
        }
        else if (fichierLvl[i][j]=='5')
        {
            screen[j][i].SetImage(*Cinq);
        }
        else if (fichierLvl[i][j]=='6')
        {
            screen[j][i].SetImage(*Six);
        }
        else if (fichierLvl[i][j]=='7')
        {
            screen[j][i].SetImage(*Sept);
        }
        x+=38;
    }
    y+=38;
    x=0;
}
for (int j(0); j<fichierLvl[0].size(); j++)
{
        screen[j][0].SetPosition(x,y);
        xScreen[j][0]=x;
        x+=38;
}
}
 
void Screen::scroling(int indt, int indtR, int w, bool gauche, bool droite)
{
    if (indDX==0)
    {
        finX=(fichierLvl[0].size()-w/38)*38;
        indDX=1;
    }
    timer.Reset();
    if (droite)
    {
        ind=indt;
        if(finX>0)
{
    if (ind<38)
    {
        indT=timer.GetElapsedTime();
        if(indT<constt)
        {
for (int i(0); i<yScreen; i++)
{
    for (int j(0); j<fichierLvl[0].size(); j++)
    {
 
        xScreen[j][i]-=1;
        screen[j][i].SetX(xScreen[j][i]);
    }
}
finX--;
ind++;
timer.Reset();
        }
 
    }
}
    }
    else if(gauche)
    {
        indR=indtR;
        if(xScreen[0][0]<0)
{
    if (indR<38)
    {
        indT=timer.GetElapsedTime();
        if(indT<constt)
        {
for (int i(0); i<yScreen; i++)
{
    for (int j(0); j<fichierLvl[0].size(); j++)
    {
 
        xScreen[j][i]+=1;
        screen[j][i].SetX(xScreen[j][i]);
    }
}
finX++;
indR++;
timer.Reset();
        }
 
    }
}
    }
}
 
Sprite Screen::getSprite(int j, int i)
{
    return screen[j][i];
}
 

Matoux

Ps: Je tien à préciser que le programme compile

Black Templar

  • Newbie
  • *
  • Messages: 45
    • Live Messenger (MSN) - ferdipiette@hotmail.com
    • Voir le profil
    • E-mail
Re : Problème affichage sprites
« Réponse #1 le: Avril 24, 2013, 12:35:11 am »
Salut,

En effet, c'est assez crade.
Tu as plein d'attribut qui n'ont pas lieu d'être (par exemple : y, x, yScreen, finX, ind, indR, indDX, etc.)
Vire les. Tu peux très bien les créer uniquement dans les fonctions qui en ont besoin. Rien ne sert de les garder en mémoire.

Ton problème vient surement de la méthode Screen::chargementLvl.
A la fin de la méthode, tu as un bout de code qui ne sert à rien, vire le !

for (int j(0); j<fichierLvl[0].size(); j++)
{
        screen[j][0].SetPosition(x,y);
        xScreen[j][0]=x;
        x+=38;
}

Ton soucis viens de là !
Ta variable "y" n'est pas réinitialisé ! Donc tu va positionner tes tiles [j][0] (donc la première ligne de tiles) hors de l'écran.


++
Black Templar

Matoux

  • Newbie
  • *
  • Messages: 2
    • Voir le profil
    • E-mail
Re : Problème affichage sprites
« Réponse #2 le: Avril 25, 2013, 09:53:00 am »
Merci de ta réponse Black Templar.
En fait, tout les attributs en trop datent du temps où j'avais mis tout mon programme dans mon main.
Je les supprimes au fur et à mesure, mais il y a certain rescapés  ;).
Si non, la boucle que j'est mise en plus, c'est parce que quand je l'enlève, je ne sais pas pourquoi, le scrolling
ne marche pas vers la gauche.
Effectivement, quand je réinitialise "y", il y a un changement:



Matoux