:: PlayerAdvance.org ::  

Précédent   :: PlayerAdvance.org :: > :: Forums Hébergés :: > OldSchool Library > Aide au développement

Aide au développement Aide sur l'utilisation d'OSLib

Publicité

Réponse
 
Outils de la discussion Modes d'affichage
Vieux 26/08/2008, 12h22   #1
BigProMaN
Membre
 
Date d'inscription: 24/08/2008
Messages: 8
Par défaut Un bug d'affichage très bizarre !

Bonjour à tous !

Je souhaiterais tout d'abord remercier Brunni pour son OSLib

Par contre, je rencontre un petit problème vraiment très étrange.




Comme vous le voyez une zone noire (surlignée en rouge) s'est incrustée à l'écran !
Et en plus quand mon perso va dedans, la zone le recouvre, alors que la dernière chose que je blite est mon perso ...

Voici le petit code (pour l'instant ) :

Code:
#include <oslib/oslib.h>


//Callbacks
PSP_MODULE_INFO("...", 0, 1, 1);
PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER | THREAD_ATTR_VFPU);




OSL_IMAGE *fond, *perso;





typedef struct{
  int x;
  int y;
  int live;
 }Infos;

 
 
void Move_Perso(Infos* acteur)
{
	  oslReadKeys();
	  
	  if (osl_keys->held.right)
	  {
	  acteur->x += 3;
	  } 
	  else if (osl_keys->held.left)
	  {
	  acteur->x -= 3;
	  }
	  else if (osl_keys->held.up)
	  {
	  acteur->y -= 3;
	  }
	  else if (osl_keys->held.down)
	  {
	  acteur->y += 3;
	  }
} 
 
 
int Random(int _iMin, int _iMax)
{
return (_iMin + (rand () % (_iMax-_iMin+1)));
}
 
 
 
 
int main()
{

	
	//Initialise l'OSLib
    oslInit(0);
    oslInitGfx(OSL_PF_8888, 0);
    oslInitConsole();
	
	//Configure les Touches 
	oslSetKeyAutorepeatInit(40);
	oslSetKeyAutorepeatInterval(10);
		
		
	 oslSetTransparentColor(RGB(255,0,255));
	
	//Charge les images
	fond = oslLoadImageFile("back.png", OSL_IN_RAM, OSL_PF_8888);
	perso = oslLoadImageFile("perso.png", OSL_IN_RAM, OSL_PF_8888);
	
	oslDisableTransparentColor(); 
	
	if (!fond || !perso)
	oslFatalError("Une des images n'a pas pu etre chargée.");

	Infos Perso; 
   
    srand((unsigned)time( NULL )); // Utile pour le Random

   
   //Variables servants au stafield
   float size = 200;
   float zMax = 5;
   float speed = 0.1;

   int width = 480;
   int height = 272;

   
   //Structure des étoiles
   typedef struct{
      float x;
      float y;
      float z;
   }star;

   star starfield[200];
   
   
   //Fonction qui crée les étoiles
   void CreateStar(int i)
   {
      starfield[i].x = Random(1,width*2) - width;
      starfield[i].y = Random(1,height*2) - height;
      starfield[i].z = zMax;
   }
   
   
   float x=0;
   float y=0;
   long j;
   
   for (j = 1; j < size; j++)
   {
      CreateStar(j);
      starfield[j].z = Random(1,zMax);
   }
   
   
   
   
   
   
   
   //Boucle 
   while (!osl_quit)
    {
	
	  oslReadKeys();
	
      oslStartDrawing();
	  oslClearScreen(RGB(0,0,0));
	  
	  oslDrawImageXY(fond,0,0);
	  
      for (j = 1; j < size; j++)
      {
         starfield[j].z = starfield[j].z - speed;
         if (starfield[j].z < speed) CreateStar(j);
         
         x = width/2 + starfield[j].x / starfield[j].z;
         y = height/2 + starfield[j].y / starfield[j].z;
         if ((x < 0) || (y < 0) || (x >= width) || (y >= height))
         {
            CreateStar(j);
         }
         else
         {
            oslDrawFillRect( x, y, x + 1, y + 1,RGB(255,255,255));
         }
      }

      oslDrawImageXY(perso,Perso.x,Perso.y); 
	  


	  Move_Perso(&Perso);
	  
      oslEndDrawing();
      oslSyncFrame();   

	  
    } //Fin while
   
    oslEndGfx();
    oslQuit();
    return 0;
}
Quelqu'un d'entre vous pourrait-il me dire d'ou ce problème vient ?

Merci d'avance !

Dernière modification par Dr.Vince ; 26/08/2008 à 15h20.
BigProMaN est déconnecté   Réponse avec citation

Publicité

Vieux 26/08/2008, 13h29   #2
Brunni
Super Modérateur
 
Date d'inscription: 10/11/2005
Localisation: Un pays avec beaucoup de banques
Messages: 3 225
Par défaut

Ton problème vient très certainement du fait que tu n'as pas activé le double buffering: oslInitGfx(pixelFormat, 1)
Sans double buffering le balayage de l'écran risque de commencer alors que l'affichage n'a pas encore terminé, ce qui provoque généralement des clignotements ou des zones vides (de la couleur de fond).
Le double buffering permet de dessiner sur un écran virtuel (pas affiché) plutôt que directement sur l'écran, et cet écran virtuel est transféré vers l'écran "réel" une fois le dessin terminé. L'écran n'affichera donc jamais de dessin "pas terminé", comme ici.
Brunni est déconnecté   Réponse avec citation
Vieux 26/08/2008, 13h29   #3
Foxy
Membre confirmé
 
Date d'inscription: 10/11/2005
Messages: 366
Par défaut

Moi je dirais une face avec des coordonnées qui "explosent"->overflow ou un Z faux.
Mais bon je ne suis ni un specialiste de la PSP ni d'OSLib

[edit:] Grillé par Brunni
Par contre, si c'était un probleme de refresh d'ecran, ca ferait une bande horizontale, pas en diagonale !? non ?
__________________
Mes releases persos, etc...
Foxy est déconnecté   Réponse avec citation
Vieux 26/08/2008, 14h23   #4
BigProMaN
Membre
 
Date d'inscription: 24/08/2008
Messages: 8
Par défaut

Merci beaucoup Brunni, ça fonctionne parfaitement !

Foxy, en fait la bande qui recouvrait mon perso était horizontale, c'était simplement la zone noire qui était en diagonale
BigProMaN est déconnecté   Réponse avec citation
Vieux 26/08/2008, 15h19   #5
Brunni
Super Modérateur
 
Date d'inscription: 10/11/2005
Localisation: Un pays avec beaucoup de banques
Messages: 3 225
Par défaut

Non, si la bande est diagonale, c'est parce que le blitting de l'arrière plan se fait de gauche à droite à cause du stripping (le GPU de la PSP est plus efficace en dessinant les images par bandes de 64 pixels de large), du coup dès les premières lignes la gauche de l'arrière-plan est disponible, mais la droite étant dessinée vers la fin, elle n'est disponible que quelques lignes plus tard, d'où cet effet de diagonale
En l'occurence si la diagonale est autant prononcée, ça veut dire que le blitting est très lent. Pense à swizzler tes images

Dernière modification par Brunni ; 26/08/2008 à 15h24.
Brunni est déconnecté   Réponse avec citation
Vieux 26/08/2008, 15h31   #6
Foxy
Membre confirmé
 
Date d'inscription: 10/11/2005
Messages: 366
Par défaut

Ah ok, c'est marrant comme mode de fonctionnement.
Je ne connaissais pas, mais maintenant que tu le dis, en effet l'effet refresh est evident
__________________
Mes releases persos, etc...
Foxy est déconnecté   Réponse avec citation
Vieux 27/08/2008, 09h51   #7
BigProMaN
Membre
 
Date d'inscription: 24/08/2008
Messages: 8
Par défaut

Merci pour tes conseils Brunni
BigProMaN est déconnecté   Réponse avec citation
Réponse

Liens sociaux

Publicité



Utilisateurs regardant la discussion actuelle : 1 (0 membre(s) et 1 invité(s))
 
Outils de la discussion
Modes d'affichage

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Navigation rapide

Discussions similaires
Discussion Auteur Forum Réponses Dernier message
Wii [Test] Escape from bug Island (Necronesia) dolarcles Jeux 10 05/10/2007 21h56
Bug dans ndstool deufeufeu [NDS] Divers 1 09/05/2007 20h18
NDS Bug PictoChat Shideneyu Archives - Divers (NDS) 1 01/02/2007 23h15
Problème d'affichage sur DSL jap avec ACWW Seruko [NDS] Divers 12 20/07/2006 10h25
NDS bug du pictochat... samy2910 Archives - Divers (NDS) 2 14/04/2006 14h48


Fuseau horaire GMT +2. Il est actuellement 18h56.


Édité par : vBulletin® version 3.7.2
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Tous droits réservés.
Version française #16 par l'association vBulletin francophone
Design par Ass-Itch, DJP et Dr.Vince