PDA

Voir la version complète : [PSP][Tutorial] OSlib - Jour 3 : L'acnée de la PSP


Yodajr
10/04/2006, 02h12
Jour 3 : Gestion des touches

Après avoir vu comment afficher du texte, la prochaine étape est de maitriser l'interface boutons/joystick/joypad de notre PSP :)


1) Le code

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

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

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

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

//Initialisation de la console texte
oslInitConsole();

//boucle principale
while (!osl_quit)
{
//Permet de dessiner
oslStartDrawing();

//Lit les touches
oslReadKeys();

//efface l'écran
oslCls();

if (osl_keys->held.down) oslPrintf("Vous appuyez Bas");
if (osl_keys->held.up) oslPrintf("Vous appuyez Haut");
if (osl_keys->held.left) oslPrintf("Vous appuyez Gauche");
if (osl_keys->held.right) oslPrintf("Vous appuyez Droite");

oslPrintf_xy(0,15,"Valeur joystick X : %d",osl_keys->analogX);
oslPrintf_xy(0,25,"Valeur joystick Y : %d",osl_keys->analogY);

//Fin du dessin
oslEndDrawing();

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

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

2) Explications

oslInitGfx(OSL_PF_8888, 1);
Même chose que le jour 1, sauf qu'ici on utilise le double buffering.

oslInitConsole();
N'oubliez pas d'appeler cette commande à chaque fois que vous voudrez afficher du texte, et SURTOUT ne la placez pas avant l'appel à oslInitGfx, sinon gare au... plantage ! (et non, pas de gorille ici)

oslStartDrawing();
A appeler à chaque fois que vous voulez dessiner sur l'écran. Attention, veillez à bien l'appeler à chaque frame et avant chaque opération de dessin, sinon ca plante ;)

oslReadKeys();
Lit l'ensemble des touches et stocke dans la structure globale osl_keys. Veillez également à appeler cette commande avant le moindre test de touche.

osl_keys- >held.down
On exploite ici la lecture des touches effectuée plus tôt.

La syntaxe pour les touches et le joypad est toujours la même : "osl_keys- >" suivi de :
a. held ou pressed : les 2 états exploitables des differentes touches. Held pour quand la touche est maintenue et Pressed pour quand la touche vient juste d'etre pressée.
b. Le nom de la touche :
Haut > up
Bas > down
Gauche > left
Droite > right
Croix > cross
Carré > square
Triangle > triangle
Rond > circle
L > L
R > R
Home > home
Style > note
Select > select
Start > start
Hold > hold

Et pour le joystick : "osl_keys- >" suivi de analogX pour le débattement horizontal et analogY pour le débattement vertical.

oslEndDrawing();
Tout comme oslStartDrawing, elle est à appeler à chaque frame et à la fin de toutes les opérations de dessin.

oslSyncFrame();
A appeler à chaque frame également. Très utile dans notre utilisation du double buffering, cette fonction se charge de basculer les buffers, attendre la VSync, etc...

3) Screen et eboot

Voila, vous devez obtenir un truc comme ça :

http://hothmoon.free.fr/psp/dev/jour03_screen.png

Téléchargez l'eboot compilée pour 1.5 ici (http://hothmoon.free.fr/psp/dev/jour03_eboot.zip)

spspgamers
20/05/2006, 17h23
Bonjour je voudrai savoir a quoi correspond la touche style sur la psp,
et si on peut utilisé les touche de la télécommande du casque.
MERCI.

Brunni
20/05/2006, 17h38
Pas que je sache non. En fait il faudrait faire des tests, regarder la valeur de osl_keys->held.value en fonction de l'appui des touches.
Et je ne vois pas ce que c'est la touche style? :huh:

Yodajr
21/05/2006, 00h17
La touche style, c'est la touche avec la note de musique ;)

osl_keys->pressed.note

spspgamers
21/05/2006, 14h56
Merci pour vos réponse.
C'est sympas

spspgamers
21/05/2006, 15h00
Si quelqu'un peut me donné un site ou je pourrai apprendre le C ce serrai sympas car je ne connai que le basic.

Merci

N64Francois
21/05/2006, 15h05
Si quelqu'un peut me donné un site ou je pourrai apprendre le C ce serrai sympas car je ne connai que le basic.

Merci
Pour les bases :
http://www.siteduzero.com/tuto-3-8-0-apprenez-a-programmer-en-c.html

Sinon, en étudiant les exemples et le code source de certains projets tu peux apprendre et comprendre pas mal de choses

spspgamers
21/05/2006, 15h13
Bonjour c'est ce que c'est dur par rapport aux bassic

peb
19/03/2007, 21h08
Bonjour,

voila je voudrais temporiser la reaction des touches pour le menu d'un programme en faisant une boucle, mais sa ne fonctionne pas! voila mon code :


c1 = 0;

while (c1 != 300)
{
c1 = c1+1;
}


J'ai aussi essayé :


c1 = 0;

while (c1 == 300)
{
c1 = c1+1;
}


mais les 2 ne fonctionnent pas...il existerait pas une instruction pour temporiser plus simplement?^^ (et fonctionnel surtout!lol! )

Yodajr
19/03/2007, 21h23
Ma solution pour temporiser : http://www.playeradvance.org/forum/showpost.php?p=110627&postcount=4

[edit] en fait je crois que ton premier essai fonctionne, sauf que compter jusqu'a 300, la console fait ca en quelques centièmes de secondes à mon avis :whst:

peb
19/03/2007, 22h17
Parfait, merci beaucoup, ta fonction fonctionne à merveille!! :wub:

Poison
23/03/2007, 21h14
Merci beaucoup pour le tuto . Cependant j'ai une question, pourquoi utiliser :

oslStartDrawing();
oslEndDrawing();

Car il n'y en a pas besoin dans le code ?

Merci de bien vouloir m'éclairer :)

Brunni
23/03/2007, 21h59
En fait c'est bien de l'utiliser, ça permet de structurer et d'être sûr de ce qui se passe (tu sais quand tu commences et quand tu finis).
Après dans la pratique je le fais automatiquement lors d'un oslSyncFrame (sauf erreur) donc c'est pas complètement nécessaire mais bon ;)

Haseo
31/05/2007, 17h26
Sympa comme tuto, ma PSP c'est des verrues qu'elle a :p

Salut, peut-ton faire un truc du genre : si la touche rond n'est par pressée??

Yodajr
02/06/2007, 22h57
if (osl_keys->held.circle) {}
else [tontruc]

tiranaure
12/07/2007, 17h50
Bonjour vous pouvez supprimer se post j'ai résolu mon probleme désolé :s

Yodajr
12/07/2007, 18h37
C'est pas cool ca, si t'as eu un problème et que tu l'a résolu, poste, ca pourra aider quelqu'un qui aurait le même problème...

tiranaure
12/07/2007, 20h03
bonjour j'ai un souci avec mon code j'essai de faire fonctionner les fonctions des croix et rond mais il n'y a aucune réaction quand j'appuie dessu sur ma psp :s

voici le code :

//La librairie principale OSLib
#include <oslib/oslib.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, *chrono;

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

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

oslInitConsole();

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

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

//plus de transparence
oslDisableTransparentColor();

//vérification
if (!fond || !chrono)
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();

//Lit les touches
oslReadKeys();

//deplace le sprite de chrono
if (osl_keys->held.down) chrono->y += 3;
if (osl_keys->held.up) chrono->y -= 3;
if (osl_keys->held.left) chrono->x -= 3;
if (osl_keys->held.right) chrono->x += 3;
if (osl_keys->held.cross) oslPrintf("Vous avez appuyer sur la croix");
if (osl_keys->held.circle) chrono->y -3;

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

//Fin du dessin
oslEndDrawing();

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

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


voil j'espere que vous pourrez m'éclaircir :D

Yodajr
12/07/2007, 20h13
Mêmes questions que toujours : "c'est quoi les fichiers que tu charges ?" "sont ils bien dans le dossier avec l'EBOOT.PBP ?"
Quand tu essaye le tuto sans modif, ca fonctionne ?

tiranaure
12/07/2007, 20h40
Mêmes questions que toujours : "c'est quoi les fichiers que tu charges ?" "sont ils bien dans le dossier avec l'EBOOT.PBP ?"
Quand tu essaye le tuto sans modif, ca fonctionne ?

Je charge les deux fichier png mais mon souci est juste que je veux faire bouger le sprite avec les touches croix et cercle.

Mais avec ce code sa n'a pas l'air de fonctionner ... Que faire ?
Merci ^^

Yodajr
12/07/2007, 21h06
J'ai bien compris, mais si tu ne réponds pas à mes questions, je ne pourrais pas t'aider.

tiranaure
12/07/2007, 21h14
J'ai bien compris, mais si tu ne réponds pas à mes questions, je ne pourrais pas t'aider.

oui dan le meme dossier non tout seul le fichier pas modifier ben meme modifier ya que les touche directionnel qui fonctionnent mais pas les touches croix rond ...

Voila j'espere avoir repondu a toute tes questions

Yodajr
12/07/2007, 21h29
mais pas les touches croix rond ...
Vi effectivement, c'était ta question dès le départ, j'avais pas vu.
Avec le code que tu as posté, les touches croix et rond ne feront rien.
Le code de la touche rond a une erreur (il manque "=")
Et le code de la touche croix est censé afficher du texte, mais il est immédiatement caché par les 2 oslDrawImage qui suivent.
Si tu veux que le texte apparaisse, il faut le dessiner en dernier ;)