Bonjour à tous,
Comme je n'ai vas vu grand monde sur les IRCs ce week-end, je pose ma question sur le forum en espérant avoir une réponse constructive.
Le problème du jour est le suivant: il s'agit de faire des mouvements automatiques de caméra. Entendez par "caméra" la position supérieure gauche qui permettra l'affichage d'une map.
Cela se fait en 2 étapes:
1) La caméra présente la map en bougeant dans le sens des aiguilles d'une montre d'une exrtrémité à l'autre de la map jusqu'à ce que le joueur appuye sur une touche. Cela est fait et ne pose pas de problème.
2) Une fois que le joueur appuye sur une touche, la caméra se repositionne automatiquement à l'endroit où se trouve le personnage (que nous appellerons Toki).
La caméra se positionne en fonction de la position de Toki. Toki se trouve toujours au centre de l'écran. Ce qui nous donne le code suivant:
// position du coin gauche de la caméra
g_foregroundCamera.x=g_toki.sprite.location.x-LCD_WIDTH/2;
// test des bornes de la map
if (g_foregroundCamera.x < 0)
g_foregroundCamera.x=0;
if (g_foregroundCamera.x > (level->nWidth*TILE_WIDTH)-LCD_WIDTH)
g_foregroundCamera.x=(level->nWidth*TILE_WIDTH)-LCD_WIDTH;
// position du coin supérieur de la caméra
g_foregroundCamera.y=g_toki.sprite.location.y-LCD_HEIGHT/2;
// test des bornes de la map
if (g_foregroundCamera.y < 0)
g_foregroundCamera.y=0;
if (g_foregroundCamera.y > (level->nHeight*TILE_HEIGHT)-LCD_HEIGHT)
g_foregroundCamera.y=(level->nHeight*TILE_HEIGHT)-LCD_HEIGHT;
Pour faire le mouvement automatique de la caméra qui vient se repositionner à bon port, j'en ai déduis 2 cas:
1) le coin supérieur gauche de la caméra se trouve AVANT le coin supérieur gauche de Toki
2) le coin supérieur gauche de la caméra se trouve APRES le coin supérieur gauche de Toki
Ce qui nous donne l'algorithme suivant:
if (bUpdatingCamera)
{
// teste l'abscisse
if (g_foregroundCamera.x < g_toki.sprite.location.x-LCD_WIDTH/2)
{
g_foregroundCamera.x+=TILE_WIDTH;// le pas de déplacement peut être de n'importe quelle valeur paire
// teste de la borne supérieure droite
if (g_foregroundCamera.x > (level->nWidth*TILE_WIDTH)-LCD_WIDTH)
{
g_foregroundCamera.x=(level->nWidth*TILE_WIDTH)-LCD_WIDTH;
bXDone=TRUE;
}
}
if (g_foregroundCamera.x > g_toki.sprite.location.x-LCD_WIDTH/2)
{
g_foregroundCamera.x-=TILE_WIDTH;
// teste la borne de gauche
if (g_foregroundCamera.x < 0)
{
g_foregroundCamera.x=0;
bXDone=TRUE;
}
}
// teste l'ordonnée
if (g_foregroundCamera.y < g_toki.sprite.location.y-LCD_HEIGHT/2)
{
g_foregroundCamera.y+=TILE_HEIGHT;// le pas de déplacement peut être de n'importe quelle valeur paire
// teste de la borne du bas
if (g_foregroundCamera.y > (level->nHeight*TILE_HEIGHT)-LCD_HEIGHT)
{
g_foregroundCamera.y=(level->nHeight*TILE_HEIGHT)-LCD_HEIGHT;
bYDone=TRUE;
}
}
if (g_foregroundCamera.y > g_toki.sprite.location.y-LCD_HEIGHT/2)
{
g_foregroundCamera.y-=TILE_HEIGHT;
// teste la borne du haut
if (g_foregroundCamera.y < 0)
{
g_foregroundCamera.y=0;
bYDone=TRUE;
}
}
// on arrête le mouvement!
if (bXDone && bYDone)
{
bUpdatingCamera=FALSE;
bXDone=FALSE;
bYDone=FALSE;
}
}
Mais cet algorithme pose un problème (et il est là ce problème!)
C'est que celon la position de Toki, il se peut que la caméra "tremble" et ne rende jamais la main.
Aurais-je oublié un cas???
Merci d'avance pour votre aide.
Cordialement.
Fred.
Utilise la balise [pre], ton code sera plus lisible...
Est-ce que ce n'est pas plus simple de faire des boucles while ou for avec comme paramètres les coordonnées de la caméra, qui vont progressivement vers les coordonnées du Toki ?
Un algo du genre :
Tant que la caméra n'est pas sur le Toki :
Tant que les coordonnées x de la caméra sont différentes des coordonnées x du Toki, alors xcam-- si xcam > xToki, xcam++, sinon
Tant que les coordonnées y de la caméra sont différentes des coordonnées y du Toki, alors ycam-- si ycam > yToki, ycam++, sinon...
[edit] (après relecture du code, c'est ce qui est fait, mais ton bxdone et ton bydone me titillent)...
non, car le tout est géré dans une boucle principale (comme doit être fait un jeu) La boucle calcule chaque image.
Le problème est que parfois, l'image tremble. Je pense que cela est du au fait que les coordonnées "sautent" avant ou après la position de Toki et du coup ça tremble sans jamais rendre la main.
Mais je ne sais pas comment résoudre le problème...
Je n'ai pas trop lu ton code, mais j'ai n'ai pas compris pourquoi tu ne vois que deux cas possible pour évaluer la position de la caméra par rapport à toki. Moi j'en vois 4 (caméra à gauche, en haut, en bas ou à droite) et qui peuvent se combiner.

« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas
. »
oui, c'est le cas où le point supérieur gauche de la caméra arrive dans l'intervalle du sprite, du coup, il est un chouilla trop loin, donc il décrémente, il voit qu'il est avant donc il incrémente et ainsi de suite, du coup ça oscille. comment éviter ce cas?
Merci.
Jyaif Le 03/04/2006 à 12:56 tu fais:
if (x<100) {
x+=10;
if (x>100)
x=100;
}
et d'où tu sors ces calculs?
Bonsoir à tous,
Puisque Godzil l'a dit, c'est vrai, je l'avoue, je suis en train de faire un clone de Toki Tori.
Le projet est basé à la fois sur les données que j'ai pu récupérer sur Pocket PC (qui marche pas sous Windows Mobile 5 et que je suis en train de refaire en parrallèle) et sur GameBoy Color dont les graphiques sont infiniments plus riches que sur PPC.
L'état du moteur est assez avancé, en effet, la gestion des niveaux est quasiment complète, entendez par là que quasiment toutes les données des fichiers ont été décodées il ne reste que quelques octets dont je n'ai pas encore trouvé leur signification.
Le chargement des niveaux est donc quasiment fini et le premier monde est entièrement fait. Les niveaux s'animent comme sur GameBoy Color. La gestion des collisions entre les sprites et le décor est faite. Les mouvements de caméra sont également faits.
Reste à gérer la physique et les états des sprites de Toki et des ennemies ainsi que la gestion des oeufs à savoir les animations, les états et les collisions avec Toki et les outils dont dispose Toki (10 outils en tout). Biensur, il restera encore à faire les menus etc. Cela fait depuis 4 mois que je suis sur le projet et espère bien le faire aboutir dans le courrant de l'année. Je sais que tout le monde s'en fout mais bon... Maintenant c'est officiel: Toki Tori est en cours de developpement et aboutira. Je ne sais pas quand, mais il aboutira. Bref, c'est pas fini, mais ça rox déjà bien...
Voilà.
Bien à vous.
Fred.
en voyant de telles réactions, je pense que le produit final ne sera distribué qu'à un public TRES restraint.... voire, pas du tout...
Ben fais ce que tu veux...

« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas
. »
Zeph Le 06/04/2006 à 14:40 puisque Jyaif n'a pas l'air d'assumer ses posts, c'était quoi la réaction en question ?
[edit] c'est bon thx

All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez
par ici :)
Jyaif s'étant excusé, disons que j'efface cette réaction de ma mémoire...
Faut avouée, faut à moitié pardonnée comme on dit...
Fred.