Voir la version complète : [GBA][Aide] Question d'affichage "Mode4"
Acid burns
10/10/2006, 19h55
Salut , voilà je me suis posé la question suivante en lisant un tuto sur le mode 4 . Peut on afficher des sprites pendant le defilement d'une suite d'images ?
Allez le bout de code afin de mieux me faire comprendre .
// Initialisation HAMlib
ham_Init();
// initialisation du mode 4
ham_SetBgMode(4);
// Lancement de l'interruption VBL
startVBLTimer();
//boucle infinie
while(1) {
if(NEW_FRAME){
NEW_FRAME = FALSE;
if( F_CTRLINPUT_A_PRESSED){ // Pendant cette anime peut on afficher autre
for(x=1; x <=28;x++){ // chose à l'écran .
Changer_Bg();
wait(5);
}
}
}
}
return 0;
}
j'ai essayé quelques trucs (mais pas concluant) afin d'avoir une reponse a cette question.
Merci a vous .
Dr.Vince
10/10/2006, 21h18
bien sur que c'est possible !!!
c'est la même chose que dans les autres modes, sauf que tu as peut être moins de mémoire pour les sprites, à confirmer
Acid burns
10/10/2006, 23h30
Ok merci , je vais reessayer en faisant attention a la memoire concernant les sprites , car c'est un des problemes que j'ai rencontré effectivement .;)
Acid burns
16/10/2006, 10h46
Encore lui :D Voila j'arrive a afficher correctement des sprites mais , car il ya toujours un "mais" surtout pour le novice que je suis , en plein apprentissage.
Je ne vois pas comment procéder pour afficher à des intervales predefinis et simultanement a mes animations ces sprites. Plus simplement j'aimerai arriver a afficher a l'écran des combinaisons de touches avant la fin d'une animation permettant de passer à la suivante sans interruption (a savoir que chaque touche est assignée à une anim distincte ) . Je n'ai aucune idée de la façon dont je pourrai structurer cela . Sans ces bases manquantes je suis encore loin de pouvoir un jour commencer un projet et pourtant c'est pas l'envie qui manque mais les connaissances :(
Je pensais peut etre a un second pointeur avec VBL en concequence ? BREF je sais pas trop , puis plus facile à dire qu'a faire pour moi.
merci de votre patience .:-'
cyrhades
16/10/2006, 21h20
A mon avis un simple if dans ta boucle suffira
si (condition) alors fonction blabla
et dans ta fonction tu défini ce que tu as à faire donc arréter la boucle et lancer une autre anim par exemple.
Dr.Vince
16/10/2006, 21h51
bon, va falloir que je me décide à faire un tuto là-dessus moi
alors tu déclare une variable booléenne en volatile qui s'appelle par exemple new_frame
dans ta fonction vbl tu passe cette variable à TRUE
ensuite dans ta boucle principale tu fait un truc du style :
if(new_frame){
new_frame = FALSE;
// code qui test les touche et qui exécute le code qui faut
....
}
donc là tu test les touches tous les 1/60 ème de seconde
tu peux ensuite jouer avec une autre variable pour ralentir
if(new_frame){
cpt++;
new_frame = FALSE;
if(cpt >= mon_seuil){
cpt = 0 ;
// code qui test les touche et qui exécute le code qui faut
....
}
}
voilà
Acid burns
17/10/2006, 11h57
Dans un premier temps merci de vous etre penché sur mon probleme , je recapitule , car je pense m'etre mal exprimé , j'ai deja ceci
#include <mygba.h>
#include "Adpcm.h"
bool volatile NEW_FRAME = TRUE;
void vblTimer(){
NEW_FRAME = TRUE;
ham_CopyObjToOAM();
AdpcmDecodeVbl(0);
AdpcmDecodeVbl(1);
}
void startVBLTimer(){
NEW_FRAME = FALSE;
ham_StartIntHandler(INT_TYPE_VBL,(void*)&vblTimer);
}
void wait(u16 nbFrames){
u16 curFrame = 0;
while(curFrame < nbFrames ){
if(NEW_FRAME){
NEW_FRAME = FALSE;
curFrame++;
}
}
}
j'arrive parfaitement a passer d'une anime a une autre en appuyant sur les differentes touches (code ci dessous) , et reguler la vitesse d'affichage pour chacune , ce que je n'arrive pas a réaliser c'est d'afficher une suite de sprites dans un coin de l'écran de maniere "automatique " m'affichant Exemple A puis B puis L etc à des intervales que je definis en fonction de la longueur de chaque animation , instruction que le joueur doit suivre, lorsque que A apparait j'appuie sur A et je relache l'anime correspondante debute et juste avant son arret je veux pouvoir afficher "exemple " B voulant dire maintenant presse B , B pressé cela me lance la seconde animation sans avoir de temps mort , etc .. en quelque sorte un genre de gameplay pas interressant j'en conviens mais bon ......
while(1) {
if(NEW_FRAME){
NEW_FRAME = FALSE;
if( F_CTRLINPUT_A_PRESSED){
for(x=1; x <=28;x++){
Changer_Bg();
wait(5);
}
}
if( F_CTRLINPUT_B_PRESSED){
for(x=28; x <=35;x++){
Changer_Bg();
wait(5);
}
}
}
}
return 0;
}
cyrhades
17/10/2006, 13h28
Ok si j'ai bien compris c'est dans le genre de jeu parapa the rapper sur PSX tu presse une touche il fait le mouvement correspondant, mais tu veux que la touche a presser s'affiche en sprite à l'écran.
Oui je vois pas trop comment aider, j'esperes que quelqu'un pourra répondre ...
Acid burns
17/10/2006, 13h37
En gros oui , quant le sprit apparait a l'ecran je dois presser la touche correspondante .
MERCI ..........;) en gros c'est bien ça
Acid burns
20/10/2006, 01h05
Mes questions sont aussi stupides que ça ? :whst:
Dr.Vince
20/10/2006, 11h06
désolé, mais j'avais pas vu que tes dernières questions
donc j'ai, à priori, compris ce que tu veux, mais il me manque des infos pour t'aider :
- la sequence de touche est-elle prédéfinie ???
- ton exemple de code juste au-dessus , bah y a pas de sprite juste une anime de BG ? donc peut-être j'ai mal compris ce que tu veux faire ?
Acid burns
20/10/2006, 12h00
Mais il n'ya pas de mal ;) c'est deja sympa de m'aider . Non tu as bien compris ce que je veux obtenir , dans l' exemple de code il n'ya pas de sprites c'etait pour cyrhades qui n'avait pas compris ou je voulais en venir .Pour le code avec les sprites il a términé en corbeille:berk: car ça ne fonctionnait pas du tout et franchement je pense que j'etais a coté de la plaque (conflits de memoires ou bien un sprite s'affichait sur un fond noir puis un fois affiché l'anime suivait en bref je suis perdu total. La séquence de touche doit etre predefinis .
Exemple au hasard : affichage du sprite A , intervale de 3 secondes affichage de "B ", intervale de 3,5 secondes "A" , intervale de 2,5 secondes "A & L" etc sur une durée d'environ 6 minutes .
c'est pas évident d'etre explicite , mais j'éspère que tu aura saisi .
J'ai passé mes journées cette semaine sur ce problème étant en arret maladie bien que ça ne soit pas le pied de programmer lorsque l'on ai malade . ATTENTION aux microbes :ph34r: :D
Dr.Vince
20/10/2006, 14h03
bon alors pour intervenir correctement j'aurais en fait besoin du bout de code qui permet l'affichage de ta séquence, à moins que ce ne soit çà qui te manque ??
Acid burns
20/10/2006, 14h20
Salut Doc , et oui c'est ce qu'il me manque , j'ai dessiné mes differents sprites et a partir de là ça coince , je ne vois pas comment structurer la chose ? J' ai deja etablis en gros l'ordre de defilements des sprites ainsi que les intervales de temps entre chaque . (tout cela sur papier) .
Dr.Vince
20/10/2006, 14h32
et voilà monsieur :
//================================================== ============
// enumération pour les différents touches sur lesquels il faut appuyer
//================================================== ============
typedef enum{
AK_A,
AK_B,
AK_UP,
...
} ACTION_KEY;
//================================================== ============
// structure représentant une séquence
//================================================== ============
typedef struct{
u8 duree; // duree de la sequence
ACTION_KEY action_next_seq; // quel bouton pour la sequence suivante ?
u8 tempo; //temporisation
} SEQUENCE ;
//================================================== ============
// le séquenceur (contient toutes les séquences)
//================================================== ============
struct SEQUENCE SEQUENCEUR[NB_MAX_SEQ];
//================================================== ============
// numéro de la séquence actuelle
//================================================== ============
u8 CUR_SEQ = 0 ;
//================================================== ============
// fonctionne qui gère l'affichage d'une séquence
//================================================== ============
void manageSequence(SEQUENCE seq){
u8 duree = seq.duree;
u8 tempo = seq.tempo;
ACTION_KEY ak = seq.action_next_seq;
for(i=0; i <= duree ; i++){
// ton code qui fait je sais pas quoi
Changer_Bg();
// temporisation
wait(tempo);
}
// affichage du message càd sur quel bouton on doit appuyer
show_action_key_message(ak);
// attente de l'appuie du bouton
wait_for_good_action_key(ak);
// incrémentation du numéro de séquence
CUR_SEQ++ ;
}
//================================================== ============
// fonction d'affichage du message càd sur quel bouton on doit appuyer
//================================================== ============
void show_action_key_message(ACTION_KEY ak){
switch(ak){
case AK_A:
// code d'affichage
....
break;
......
}
}
//================================================== ============
// fonction qui gère l'attente de l'appuie du bouton
//================================================== ============
void wait_for_good_action_key(ACTIION_KEY ak){
bool bad_ak = TRUE ;
while(bad_ak){
if(NEW_FRAME){
NEW_FRAME = FALSE;
// code de test du bouton suivant l'ak
...
// si bon bouton
bad_ak = FALSE;
}
}
}
//================================================== ============
// bout de code qui gère les séquence
//================================================== ============
while(CUR_SEQ < NB_MAX_SEQ){
manageSequence(SEQUENCEUR[CUR_SEQ]);
}
bon alors fait pas gaffe à la syntaxe et tout ça c'est juste pour te donner une idée de ce que tu peux faire.
Evidemment il manque des choses et d'autres sont pas bonne mais je pense que tu saura te débrouiller avec ça
Acid burns
20/10/2006, 14h39
T'es franchement un amour lol:D c'est vraiment cool allez je m'en vais de ce pas me mettre au travail ;) c'est ma femme qui va etre contante car je sens que je vais encore passer ma journée devant le clavier :D
Acid burns
09/11/2006, 11h54
"Toujours au meme point " ........Dr j'ai bien compris suite au code que tu 'mas donné le principe mais j'ai bien peur que mes connaissances en C soit pas à la hauteur , j'ai donc repris les ouvrages qui vont bien " Le livre du c premier langage etc ....Mais je m'en sors toujours pas , un peu d'aide serait la bien venue Merci d'avance ;)
Dr.Vince
09/11/2006, 12h28
bah commence par détailler ton problème, donner les bouts de code qui vont bien et je suis sûr qu'on pourra t'aider
Acid burns
06/04/2007, 10h18
Salut
desolé de ne pas avoir donné suite a ce post , pour des raisons perso .
Merci quant meme.
ps : Probeme resolu ...
Dr.Vince
06/04/2007, 11h29
putain, ça c'est de la remonté de topic !!!!
j'espère au moins avoir pu t'aider à l'époque
Acid burns
06/04/2007, 11h33
Ca date , longue absence pour ma part. Oui tu m'a mis "sur le bon chemin" Merci ..........
vBulletin® v.3.7.2, Copyright ©2000-2008, Jelsoft Enterprises Ltd. Tous droits réservés - Version française vbulletin-fr.org