PDA

Voir la version complète : [PSP][Aide] Modifier la position d'une images toutes les X secs [résolu]


Solevis
23/05/2007, 16h54
Bonjour a tous:) ,

Venant de découvrir la fabuleuse librairie Oslib, je me suis lancé dans la création d'un jeu pour Psp.
Le jeu se nomme PSP falldown et sera un portage du célèbre jeu des calculettes Ti.
Le but étant d'éviter qu'une bille se retrouve coincer en haut de l'écran.

C'est plus facile avec un exemple : Falldown en flash (http://www.albinoblacksheep.com/flash/falldown2.php)

Mais arriver a quelques lignes de codes, je me trouve face a un problème. Impossible de faire constamment descendre la bille.
Donc je voulais savoir s il existait des Timers sous Oslib, ou alors même en C. De façon a ce que j'ai

Timer(30)
{
bille->y -= 4
}

Je voulais également savoir on pouvait scroller une image et non pas une map.
J'espère que vous pourrez m'aider.

Merci d'avance :fleur:

PS : Voici mon Code complet (pas grands choses mais ca pourra peut etre vous aider)

//##############################
// Falldown by Solevis
//version developpement


//La librairie principale OSLib
#include <oslib/oslib.h>
#include <time.h>
#include <stdlib.h>
#include <stdio.h>

//les callbacks
PSP_MODULE_INFO("OSLib Sample", 0, 1, 1);
PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER | THREAD_ATTR_VFPU);

//definition des pointeurs vers nos images
OSL_IMAGE *fond, *bille;

int main()
{
int x=0, y=0 ;
int compteur = NULL;
int continuer = 1;
//Initialisation de la librairie
oslInit(0);

//Initialisation du mode graphique
oslInitGfx(OSL_PF_8888, 1);

//definition de la transparence
oslSetTransparentColor(RGB(255,0,255));

//chargement de nos images (oui, le "loading" :p)
fond = oslLoadImageFile("Background.png", OSL_IN_RAM, OSL_PF_5551);
bille = oslLoadImageFile("bille.png", OSL_IN_RAM, OSL_PF_5551);

//plus de transparence
oslDisableTransparentColor();

//vérification
if (!fond || !bille)
oslDebug("Impossible de charger un ou plusieurs fichiers. Verifiez que tous les fichiers sont bien copiés dans le répertoire du jeu.");

//boucle principale
while (!osl_quit)
{
//Permet de dessiner
oslStartDrawing();
oslCls();
//Lit les touches
oslReadKeys();

//deplace le sprite de la bille
if (osl_keys->held.left) bille->x -= 4;
if (osl_keys->held.right) bille->x += 4;
if (osl_keys->held.start) oslQuit();;

bille->y -= 4;


//dessine nos images
oslDrawImage(fond);
oslDrawImage(bille);

//Fin du dessin
oslEndDrawing();

//Synchronise l'écran
oslSyncFrame();
}

//on quitte l'application
oslEndGfx();
oslQuit();
return 0;
}

Yodajr
23/05/2007, 18h24
Regarde mon tuto sur les animations, j'y explique la méthode que j'utilise :

temp_anim++;
if (temp_anim > uncertaintemps)
{
temp_anim = 0;

(animation)
}

Quand à ta 2ème question, je ne comprend pas : quand tu fait image- >x++, ben tu scrolle l'image.

Solevis
23/05/2007, 19h28
D'accord merci, le cours sur l'animation je l'avais lu en diagonal et ca ne m'avais pas tilté.
Pour ma seconde question j'ai trouvé la reponse en suivant, tout bete en faites^^

EDIT :

Maintenant j'ai un probleme avec ma fonction Afficher Mur, impossible d'afficher un bloc (16*16), meme si je force l'affichage (sans faire de boucle ou de conditions).

Voila le code :
void AfficherMur ()
{
int Cadrrillage[30][17] = {0} ;
int CaseVide = 0;
int i = 0, j = 0, k = 0 , l = 0, temps = 5;

temps++;
if (temps == 6)
{
//Rempli la premier ligne d'un mur
for (i=0;i<30;i++)
{
Cadrrillage[i][1] = 1;
}

//Genere un chiffre aleatoir pour connaitre la position ou il y a un trou dans le mur
srand(time(NULL));
CaseVide = (rand() % (30 - 1 + 1)) + 1;

Cadrrillage[CaseVide][1] = 0 ;

//si la case est a 1, alors on affiche un mur a cette endroit
for (j=0;j<30;j++)
{
if (Cadrrillage[j][1] == 1)
{
//Les coordonnées sont a revoir :)
oslDrawImageXY(mur, (j*16), (1*16)) ;


}
}
}






}

J'ai divise l'ecran en 30*17 puisque mon image fais 16*16.
Voila l'image appelé Bloc est declaré au debut de main.c, avec toutes les autres images

//definition des pointeurs vers nos images
OSL_IMAGE *fond, *bille, *Bloc;

Donc normalement pas besoin de faire passer la variable en paramètre de la fontion puisque c'est une variable global.
j'arrive pas a voir ou est le probleme. Peut etre au niveau des Tableaux. C'est la premiere fois que j'utilise des tableaux a deux dimensions.

Yodajr
23/05/2007, 22h30
Ben là déja tu fait pas repasser temp à 0, donc il passe une fois à 6 et continue de s'incrémenter indéfiniment :p

Solevis
23/05/2007, 22h37
Merci,
j'ai rectifié en mettant

temps++;
if (temps == 6)
{
temps = 0

Mais j'ai toujour le meme probleme, les blocs ne s'affichent pas

Solevis
23/05/2007, 22h53
Voila le programme sans condition ni rien:

//##############################
// Falldown by Solevis
//version developpement
#include <oslib/oslib.h>
#include <time.h>
#include <stdlib.h>
#include <stdio.h>

void AfficherMur ();



//les callbacks
PSP_MODULE_INFO("OSLib Sample", 0, 1, 1);
PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER | THREAD_ATTR_VFPU);

//definition des pointeurs vers nos images
OSL_IMAGE *fond, *bille, *Bloc;

int main()
{
int j = 0;
//Initialisation de la librairie
oslInit(0);

//Initialisation du mode graphique
oslInitGfx(OSL_PF_8888, 1);

//definition de la transparence
oslSetTransparentColor(RGB(255,0,255));

//chargement de nos images (oui, le "loading" :p)
fond = oslLoadImageFile("Background.png", OSL_IN_RAM, OSL_PF_5551);
bille = oslLoadImageFile("bille.png", OSL_IN_RAM, OSL_PF_5551);
Bloc = oslLoadImageFile("Mur.png", OSL_IN_RAM, OSL_PF_5551);



//plus de transparence
oslDisableTransparentColor();

//vérification
if (!fond || !bille)
oslDebug("Impossible de charger un ou plusieurs fichiers. Verifiez que tous les fichiers sont bien copiés dans le répertoire du jeu.");

//boucle principale
while (!osl_quit)
{
//Permet de dessiner
oslStartDrawing();
oslCls();
//Lit les touches
oslReadKeys();

//deplace le sprite de la bille
if (osl_keys->held.left) bille->x -= 4;
if (osl_keys->held.right) bille->x += 4;
if (osl_keys->held.start) oslQuit();;

bille->y += 1;


//dessine nos images
AfficherMur ();

oslDrawImage(fond);
oslDrawImage(bille);


//Fin du dessin
oslEndDrawing();

//Synchronise l'écran
oslSyncFrame();
}

//on quitte l'application
oslEndGfx();
oslQuit();
return 0;
}

void AfficherMur ()
{
Bloc = oslLoadImageFile("Mur.png", OSL_IN_RAM, OSL_PF_5551);
oslDrawImage(Bloc) ;
/*int Cadrrillage[30][17] = {0} ;
int CaseVide = 0;
int i = 0, j = 0, k = 0 , l = 0, temps = 5;

temps++;
if (temps == 6)
{
temps = 0;
//Rempli la premier ligne d'un mur
for (i=0;i<30;i++)
{
Cadrrillage[i][1] = 1;
}

//Genere un chiffre aleatoir pour connaitre la position ou il y a un trou dans le mur
srand(time(NULL));
CaseVide = (rand() % (30 - 1 + 1)) + 1;

Cadrrillage[CaseVide][1] = 0 ;

//si la case est a 1, alors on affiche un mur a cette endroit
for (j=0;j<30;j++)
{
if (Cadrrillage[j][1] == 1)
{
//oslDrawImageXY(mur, (j*16), (1*16)) ;
oslDrawImageXY(Bloc, 150, 150) ;

}
}
}

//Scroll le mur
for (k=0;k<30;k++)
{
for (l=0;l<17;l++)
{
Cadrrillage[k+1][l] = Cadrrillage[k][l]
}
}*/



}

Yodajr
23/05/2007, 23h16
Ok, je sais pas si tu as testé ça, mais avec :
//dessine nos images
AfficherMur ();

oslDrawImage(fond);
oslDrawImage(bille);
si ton "fond" couvre tout l'écran, tu ne verra jamais ce qu'affiche la fonction AfficherMur.
Car ici, ta fonction affiche ton mur, puis la psp dessine le fond par dessus, puis la bille.
L'ordre est important, j'espère que c'est ca le problème ;)

Solevis
25/05/2007, 14h00
Desolé pour le retard.
Tu avais raison le probleme venait bien de la. Je vais pourvoir reprendre la programmation :)

Encore Merci