Voir la version complète : [GBA][Aide] Affichage Alternance entre 2 images
Bonjour,
Je vous écrit parce que je suis désespéré et je bute depuis quelques mois sur un problème en apparence tout bête. J'avais demandé de l'aide sur l'ancien forum mais on avait pas été en mesure de m'aider à ce moment là. :ph34r:
Concrétement, j'utilises HAM pour développer sur GBA et je voudrais simplement créér un programme qui affiche une image (appellons là screen1) puis qui alterne avec une autre (screen2) au bout de quelques secondes et ainsi de suite (screen 1 puis screen 2 puis screen1). :-' Seulement, j'ai abandonné une fois et je suis vraiment motivé pour m'y remettre. Je vous serais donc bien reconnaissant de tester le code avec de le publier (:w00t: ) et de le faire le plus simplement pas possible (pas besoin de la gestion des boutons ou tout autre ligne superflue :p). D'avance merci !
t'arrive à afficher une image dejà?
Sinon, en gros, sans utiliser HAM, ça donne quelque chose comme ça si tu utilise vraiment rien (pas de copie DMA, pas d'interruption, pas de... que dalle en gros).
On va se mettre en mode 3 pour que ça soit encore plus simple, pas de double buffering.
EDIT, j'ai viré mon post, je t'ai fait un code en dessous qui fonctionne et qui passe d'une image à l'autre sans rien utiliser du tout, pas de lib, pas de copie DMA, pas d'interruption, rien.
Tiens voila, je t'ai fait un code qui tourne, tu fais un nouveau projet C dans VHam, tu colle ça dans main et tu compile.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <stdlib.h>
#include "screen1.raw.c" //ta premiere image
#include "screen2.raw.c" //ta deuxieme image
#define REG_DISPCNT *(unsigned long*)0x4000000
#define MODE_3 0x3
#define BG2_ENABLE 0x400
#define SetMode(mode) REG_DISPCNT = (mode)
unsigned short* videoBuffer = (unsigned short*)0x6000000;
volatile unsigned short* ScanlineCounter =(volatile unsigned short*)0x4000006;
/////////////////////////////////////////////////////////////
//WaitVBlank()
/////////////////////////////////////////////////////////////
void WaitVBlank(void)
{
while(!(*ScanlineCounter));
while((*ScanlineCounter));
}
/////////////////////////////////////////////////////////////
//main()
/////////////////////////////////////////////////////////////
int main(void)
{
int n;
SetMode(MODE_3 | BG2_ENABLE);
while(1)
{
for(n=0; n < 38400; n++) videoBuffer[n] = screen1_Bitmap[n];
for (n = 0; n < 20; n++) //regle le chiffre 20 pour changer la tempo entre les images
{
WaitVBlank();
}
for(n=0; n < 38400; n++) videoBuffer[n] = screen2_Bitmap[n];
for (n = 0; n < 20; n++) //regle le chiffre 20 pour changer la tempo entre les images
{
WaitVBlank();
}
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Un truc vite fait (mais ca marche voir le piece jointe), en utilisant cette fois la librairie HAM :
#include <mygba.h>
#include "img1.raw.c"
#include "img2.raw.c"
#include "img.pal.c"
int main()
{
bool loadimg1 = TRUE;
bool loadimg2 = FALSE;
u32 cnt = 0;
ham_Init();
ham_SetBgMode(4);
ham_LoadBGPal((void*)img_Palette,256);
ham_LoadBitmap((void*)img1_Bitmap);
ham_FlipBGBuffer();
while(1)
{
if (loadimg1)
{
++cnt;
if (cnt == 60000)
{
ham_LoadBitmap((void*)img2_Bitmap);
ham_FlipBGBuffer();
loadimg1 = FALSE;
loadimg2 = TRUE;
cnt = 0;
}
}
if (loadimg2)
{
++cnt;
if (cnt == 60000)
{
ham_LoadBitmap((void*)img1_Bitmap);
ham_FlipBGBuffer();
loadimg1 = TRUE;
loadimg2 = FALSE;
cnt = 0;
}
}
}
return 0;
}
marrant, c'est presque plus long :)
Dr.Vince
06/01/2006, 12h53
c'est bizarre mais ça me rappelle quelque chose.
Il me semble que l'on t'avais effectivement déjà répondu sur l'ancien forum mais impossible de remttre la main sur le topic.
kaien, c'était quoi ton ancien pseudo ??
[EDIT] Ha ha, je l'ai retrouvé !!!
je sais pas si c'est toi l'ancien Acid Burns mais sur ce topic (http://www.playeradvance.org/old/index.php?showtopic=5539&st=30) il avait le même problème et on lui a donné plusieurs code sources pour le règler.
en tout cas, avec les deux codes donnés ici qui marchent, si ça fonctionne tjrs pas, c'est que le soucis vient pas de là.
Acid burns
06/01/2006, 17h14
non , Dr Vince ? Kaien et moi meme rien a voir ! en tout cas pour ma part tout a fonctionné a merveille , je te remercie de tes precieux conseills et de l'aide que tu m'avait apportée , j'en profite pour souhaiter mes voeux a l'ensemble des membres de PA .
Dr.Vince
06/01/2006, 17h53
ha bah désolé !!! au moins tu aura refais surface comme ça :)
vBulletin® v.3.7.2, Copyright ©2000-2008, Jelsoft Enterprises Ltd. Tous droits réservés - Version française vbulletin-fr.org