Collision et Tilemap avec la SGDK
+2
Stef
Infitek
6 participants
Page 1 sur 5
Page 1 sur 5 • 1, 2, 3, 4, 5
Collision et Tilemap avec la SGDK
Bonjour à tous amis codeurs
J'essaye de me mettre à la SGDK depuis la semaine dernière, mais je bloque pas mal sur la gestion des tilemaps, mes tiles s'affichent pourtant bien et j'ai un scrolling horizontal qui fonctionne.
Par contre au moment d'afficher les tiles non vides de ma map, j'obtiens ceci (je place une tile verte la ou les données x et y correspondantes de la tilemap sont différentes de zéro) :
https://i.servimg.com/u/f57/20/05/15/69/rom_0010.png
Par contre en apparence tout va bien mes tiles s'affichent au bon endroit mais impossible d’accéder a une tilemap correcte
https://i.servimg.com/u/f57/20/05/15/69/rom_0011.png
La portion de code debug qui affiche la valeur des tiles (elle tourne dans ma boucle de jeu) :
J'affiche correctement ma map ici :
Comme vous pouvez le voir j'ai codé une structure Map afin de stocker plusieurs maps et de définir certaines informations à l'intérieur, elle ressemble à ça :
Et dans ma fonction init je défini donc la map comme ceci :
Voila, j'ai vraiment du mal à comprendre pourquoi mes données de tilemap sont incorrectes (ou alors je les exploite mal ?) alors que mon affichage de la map est nickel.
Je m'arrache les cheveux la dessus depuis ce matin
Merci pour votre aide !
J'essaye de me mettre à la SGDK depuis la semaine dernière, mais je bloque pas mal sur la gestion des tilemaps, mes tiles s'affichent pourtant bien et j'ai un scrolling horizontal qui fonctionne.
Par contre au moment d'afficher les tiles non vides de ma map, j'obtiens ceci (je place une tile verte la ou les données x et y correspondantes de la tilemap sont différentes de zéro) :
https://i.servimg.com/u/f57/20/05/15/69/rom_0010.png
Par contre en apparence tout va bien mes tiles s'affichent au bon endroit mais impossible d’accéder a une tilemap correcte
https://i.servimg.com/u/f57/20/05/15/69/rom_0011.png
La portion de code debug qui affiche la valeur des tiles (elle tourne dans ma boucle de jeu) :
- Code:
int i = 0;
for (int y = 0; y < 28; y++)
{
for (int x = 0; x < 40; x++)
{
//if (levels[actual_level].map->tilemap[y * 20 + x] != 0)
if (levels[actual_level].map->tilemap[i] != 0)
{
VDP_setTileMapXY(PLAN_A, 1, x, y);
}
i++;
}
}
J'affiche correctement ma map ici :
- Code:
VDP_setMapEx(PLAN_A, levels[actual_level].map, TILE_ATTR_FULL(PAL1, FALSE, FALSE, FALSE, levels[actual_level].tile_index)
, 0, 0, 0, levels[actual_level].offset_y, levels[actual_level].w, levels[actual_level].h);
Comme vous pouvez le voir j'ai codé une structure Map afin de stocker plusieurs maps et de définir certaines informations à l'intérieur, elle ressemble à ça :
- Code:
typedef struct s_level
{
u8 level;
Map *map;
TileSet tileset;
u16 w;
u16 h;
u16 offset_x;
u16 offset_y;
u16 tile_index;
}t_level;
Et dans ma fonction init je défini donc la map comme ceci :
- Code:
VDP_loadTileSet(bgLevel_image.tileset, levels[actual_level].tile_index, TRUE);
levels[actual_level].map = unpackMap(bgLevel_image.map, NULL);
levels[actual_level].w = levels[actual_level].map->w;
levels[actual_level].h = levels[actual_level].map->h;
levels[actual_level].offset_y = levels[actual_level].h > 32 ? levels[actual_level].h / 2 + 4 : 0;
Voila, j'ai vraiment du mal à comprendre pourquoi mes données de tilemap sont incorrectes (ou alors je les exploite mal ?) alors que mon affichage de la map est nickel.
Je m'arrache les cheveux la dessus depuis ce matin
Merci pour votre aide !
Infitek- Patient en incubation
- Nombre de messages : 72
Age : 32
Localisation : France
Date d'inscription : 28/03/2019
Re: Collision et Tilemap avec la SGDK
Du nouveau !
Étrange en fait je pensais que rescomp donnait la valeur 0 aux tiles transparents dans le tilemap mais quand j'affiche les tiles ayant la valeur de 2 voici ce que j'obtiens :
https://i.servimg.com/u/f57/20/05/15/69/rom_0012.png
Et donc en toute logique lorsque les données de la tilemap sont différentes de 2 j'ai mes données de collision :
https://i.servimg.com/u/f57/20/05/15/69/rom_0013.png
ça me suffira pour l'instant, si quelqu'un passe par la et qu'il a une idée de la raison pour laquelle rescomp insère la valeur 2 a l'emplacement des tiles transparents dans mon tilemap je suis preneur !
(Au passage un grand bravo à Steph pour son super boulot)
Étrange en fait je pensais que rescomp donnait la valeur 0 aux tiles transparents dans le tilemap mais quand j'affiche les tiles ayant la valeur de 2 voici ce que j'obtiens :
https://i.servimg.com/u/f57/20/05/15/69/rom_0012.png
Et donc en toute logique lorsque les données de la tilemap sont différentes de 2 j'ai mes données de collision :
https://i.servimg.com/u/f57/20/05/15/69/rom_0013.png
ça me suffira pour l'instant, si quelqu'un passe par la et qu'il a une idée de la raison pour laquelle rescomp insère la valeur 2 a l'emplacement des tiles transparents dans mon tilemap je suis preneur !
(Au passage un grand bravo à Steph pour son super boulot)
Infitek- Patient en incubation
- Nombre de messages : 72
Age : 32
Localisation : France
Date d'inscription : 28/03/2019
Re: Collision et Tilemap avec la SGDK
Hello !
Merci pour le commentaire par rapport à SGDK
Je vois que tu a réussi à t'en sortir par toi-même, mais oui en réalité tu n'auras pas la valeur 0 pour les tiles tranparentes car pour des raisons de performance rescomp va dupliquer la tuile transparente (sans quoi il faudrait faire un traitement spécial pour les tiles transparentes sur la fonction setTilemap(..) et ça serait beaucoup plus lent). Du coup ceci explique ce que tu as pu observer.
Merci pour le commentaire par rapport à SGDK
Je vois que tu a réussi à t'en sortir par toi-même, mais oui en réalité tu n'auras pas la valeur 0 pour les tiles tranparentes car pour des raisons de performance rescomp va dupliquer la tuile transparente (sans quoi il faudrait faire un traitement spécial pour les tiles transparentes sur la fonction setTilemap(..) et ça serait beaucoup plus lent). Du coup ceci explique ce que tu as pu observer.
Stef- Interne
- Nombre de messages : 5087
Age : 45
Localisation : Sevres
Date d'inscription : 04/04/2007
Re: Collision et Tilemap avec la SGDK
Oh c'est bien peu par rapport au possibilités offertes par tes outils !
Une dernière question du coup, tilemap[0] correspond a quelle tile de l'image ? J'imagine qu'il s'agit de celle située en haut à gauche de l'image ?
Une dernière question du coup, tilemap[0] correspond a quelle tile de l'image ? J'imagine qu'il s'agit de celle située en haut à gauche de l'image ?
Infitek- Patient en incubation
- Nombre de messages : 72
Age : 32
Localisation : France
Date d'inscription : 28/03/2019
Re: Collision et Tilemap avec la SGDK
oui c'est bien ça, c'est celle en haut à droite gauche!
Edit: aie désolé je voulais dire en haut à gauche bien sur ^^
Edit: aie désolé je voulais dire en haut à gauche bien sur ^^
Dernière édition par Stef le Lun 1 Avr 2019 - 10:43, édité 1 fois
Stef- Interne
- Nombre de messages : 5087
Age : 45
Localisation : Sevres
Date d'inscription : 04/04/2007
Re: Collision et Tilemap avec la SGDK
A droite ou a gauche ?
Bon maintenant que mes collisions marchent j'ai aussi voulu rajouter le scrolling vertical pour pouvoir prendre un peu de hauteur, la caméra et les collisions fonctionnent par contre l'affichage pas du tout, j'utilise pourtant la même méthode que pour le scrolling horizontal.
Voici le bout de code erroné :
EDIT : Du coup le fait que la caméra se déplace également verticalement maintenant pose problème avec le scrolling horizontal, lorsque je prends de la hauteur, j'ai bien rajouté camposy dans les coordonnées à mettre à jour mais je pense que l'erreur vient du x_offset et y_offset
EDIT2 : Bon le scrolling horizontal fonctionne même avec la caméra qui bouge verticalement, par contre j'ai du mal a récuperer les infos pour le scrolling vertical, mon code pour dessiner les bords horizontaux de l'image :
J'ai l'impression d'avoir tout essayé mais pas moyen de faire de même pour le scrolling horizontal.
Bon maintenant que mes collisions marchent j'ai aussi voulu rajouter le scrolling vertical pour pouvoir prendre un peu de hauteur, la caméra et les collisions fonctionnent par contre l'affichage pas du tout, j'utilise pourtant la même méthode que pour le scrolling horizontal.
Voici le bout de code erroné :
- Code:
if (player.movx > 0)
VDP_setMapEx(PLAN_A, levels[actual_level].map, TILE_ATTR_FULL(PAL1, FALSE, FALSE, FALSE, levels[actual_level].tile_index), ((fix32ToInt(camposx)/8) + 63), 0, ((fix32ToInt(camposx)/8) + 63), levels[actual_level].offset_y, 1, levels[actual_level].h);
else if (player.movx < 0)
VDP_setMapEx(PLAN_A, levels[actual_level].map, TILE_ATTR_FULL(PAL1, FALSE, FALSE, FALSE, levels[actual_level].tile_index), ((fix32ToInt(camposx)/8)), 0, ((fix32ToInt(camposx)/8)), levels[actual_level].offset_y, 1, levels[actual_level].h);
if (player.movy > 0)
VDP_setMapEx(PLAN_A, levels[actual_level].map, TILE_ATTR_FULL(PAL1, FALSE, FALSE, FALSE, levels[actual_level].tile_index), 0, ((fix32ToInt(camposy)/8)), 0, ((fix32ToInt(camposy)/8)) + levels[actual_level].offset_y, 64, 1);
else if (player.movy < 0)
VDP_setMapEx(PLAN_A, levels[actual_level].map, TILE_ATTR_FULL(PAL1, FALSE, FALSE, FALSE, levels[actual_level].tile_index), 0, ((fix32ToInt(camposy)/8) + 63), 0, ((fix32ToInt(camposy)/8)) + levels[actual_level].offset_y, 64, 1);
EDIT : Du coup le fait que la caméra se déplace également verticalement maintenant pose problème avec le scrolling horizontal, lorsque je prends de la hauteur, j'ai bien rajouté camposy dans les coordonnées à mettre à jour mais je pense que l'erreur vient du x_offset et y_offset
EDIT2 : Bon le scrolling horizontal fonctionne même avec la caméra qui bouge verticalement, par contre j'ai du mal a récuperer les infos pour le scrolling vertical, mon code pour dessiner les bords horizontaux de l'image :
- Code:
if (player.movx > 0)
VDP_setMapEx(PLAN_A, levels[actual_level].map, TILE_ATTR_FULL(PAL1, FALSE, FALSE, FALSE, levels[actual_level].tile_index),
((fix32ToInt(camposx)/8) + 63), ((fix32ToInt(camposy)/8)), ((fix32ToInt(camposx)/8) + 63), levels[actual_level].offset_y + ((fix32ToInt(camposy)/8)), 1, 27);
else if (player.movx < 0)
VDP_setMapEx(PLAN_A, levels[actual_level].map, TILE_ATTR_FULL(PAL1, FALSE, FALSE, FALSE, levels[actual_level].tile_index),
(fix32ToInt(camposx)/8), ((fix32ToInt(camposy)/8)), ((fix32ToInt(camposx)/8)),levels[actual_level].offset_y + ((fix32ToInt(camposy)/8)), 1, 27);
if (player.movy > 0)
VDP_setMapEx(PLAN_A, levels[actual_level].map, TILE_ATTR_FULL(PAL1, FALSE, FALSE, FALSE, levels[actual_level].tile_index),
((fix32ToInt(camposx)/8)), ((fix32ToInt(camposy)/8) + 27), ((fix32ToInt(camposx)/8)), levels[actual_level].offset_y + ((fix32ToInt(camposy)/8) + 27), 63, 1);
else if (player.movy < 0)
VDP_setMapEx(PLAN_A, levels[actual_level].map, TILE_ATTR_FULL(PAL1, FALSE, FALSE, FALSE, levels[actual_level].tile_index),
((fix32ToInt(camposx)/8)), ((fix32ToInt(camposy)/8)), ((fix32ToInt(camposx)/8)), levels[actual_level].offset_y + ((fix32ToInt(camposy)/8)), 63, 1);
J'ai l'impression d'avoir tout essayé mais pas moyen de faire de même pour le scrolling horizontal.
Infitek- Patient en incubation
- Nombre de messages : 72
Age : 32
Localisation : France
Date d'inscription : 28/03/2019
Re: Collision et Tilemap avec la SGDK
Salut ,)
Je suis trop crevé/nul pour prétendre aider les autres, je vais passer pour un con.. ,)
Si tu réussis à scroller horizontalement, tu devrais être proche de le faire verticalement..
Attends j'ai l'esprit embrouillé, C'est quoi qu'il fait mal au juste? la camera? je préfère fermer mon clapet de peur de te dire des bêtises...
J'espere qu'on pourra t'aider...
Load Map region at specified position.
Parameters:
[size]
Load the specified Map region at specified plan position.[/size]
Je suis trop crevé/nul pour prétendre aider les autres, je vais passer pour un con.. ,)
Si tu réussis à scroller horizontalement, tu devrais être proche de le faire verticalement..
Attends j'ai l'esprit embrouillé, C'est quoi qu'il fait mal au juste? la camera? je préfère fermer mon clapet de peur de te dire des bêtises...
J'espere qu'on pourra t'aider...
u16 VDP_setMapEx | ( | VDPPlan | plan, |
const Map * | map, | ||
u16 | basetile, | ||
u16 | x, | ||
u16 | y, | ||
u16 | xm, | ||
u16 | ym, | ||
u16 | wm, | ||
u16 | hm | ||
) |
Load Map region at specified position.
Parameters:
plan | Plan where we want to load Map. Accepted values are:
|
map | Map to load. |
basetile | Base index and flags for tile attributes (see TILE_ATTR_FULL() macro). |
x | Plan X destination position (in tile). |
y | Plan Y destination position (in tile). |
xm | Map region X start position (in tile). |
ym | Map region Y start position (in tile). |
wm | Map region Width (in tile). |
hm | Map region Heigh (in tile). |
Load the specified Map region at specified plan position.[/size]
Dr. Acula- Patient en incubation
- Nombre de messages : 56
Age : 43
Localisation : Paris en bretagne
Date d'inscription : 25/04/2018
Re: Collision et Tilemap avec la SGDK
Salut Dr.Acula je pense que tester ma rom vaut mille mots la voici donc ainsi qu'un screeshot de ma map :
https://i.servimg.com/u/f57/20/05/15/69/maptes10.png (c'est beau n'est ce pas ?)
Ainsi que la rom : https://drive.google.com/file/d/1l-gU4LL_vJ65xLxoVHEwaSk4aGt3CZqS/view?usp=sharing
Comme vous pourrez le voir tant que le personnage ne saute pas tout fonctionne, après c'est approximatif.
Je reposte les quelques lignes qui gèrent ce scrolling :
Merci encore pour votre aide
https://i.servimg.com/u/f57/20/05/15/69/maptes10.png (c'est beau n'est ce pas ?)
Ainsi que la rom : https://drive.google.com/file/d/1l-gU4LL_vJ65xLxoVHEwaSk4aGt3CZqS/view?usp=sharing
Comme vous pourrez le voir tant que le personnage ne saute pas tout fonctionne, après c'est approximatif.
Je reposte les quelques lignes qui gèrent ce scrolling :
- Code:
if (player.movx > 0)
VDP_setMapEx(PLAN_A, levels[actual_level].map, TILE_ATTR_FULL(PAL1, FALSE, FALSE, FALSE, levels[actual_level].tile_index),
((fix32ToInt(camposx)/8) + 40), ((fix32ToInt(camposy)/8)), ((fix32ToInt(camposx)/8) + 40), levels[actual_level].offset_y + ((fix32ToInt(camposy)/8)), 1, 28);
else if (player.movx < 0)
VDP_setMapEx(PLAN_A, levels[actual_level].map, TILE_ATTR_FULL(PAL1, FALSE, FALSE, FALSE, levels[actual_level].tile_index),
(fix32ToInt(camposx)/8), ((fix32ToInt(camposy)/8)), ((fix32ToInt(camposx)/8)),levels[actual_level].offset_y + ((fix32ToInt(camposy)/8)), 1, 28);
if (player.movy > 0)
VDP_setMapEx(PLAN_A, levels[actual_level].map, TILE_ATTR_FULL(PAL1, FALSE, FALSE, FALSE, levels[actual_level].tile_index),
((fix32ToInt(camposx)/8)), ((fix32ToInt(camposy)/8) + 28), ((fix32ToInt(camposx)/8)), levels[actual_level].offset_y + ((fix32ToInt(camposy)/8) + 28),64, 1);
else if (player.movy < 0)
VDP_setMapEx(PLAN_A, levels[actual_level].map, TILE_ATTR_FULL(PAL1, FALSE, FALSE, FALSE, levels[actual_level].tile_index),
((fix32ToInt(camposx)/8)), ((fix32ToInt(camposy)/8)), ((fix32ToInt(camposx)/8)), levels[actual_level].offset_y + ((fix32ToInt(camposy)/8)), 64, 1);
Merci encore pour votre aide
Infitek- Patient en incubation
- Nombre de messages : 72
Age : 32
Localisation : France
Date d'inscription : 28/03/2019
Re: Collision et Tilemap avec la SGDK
Attends mais tu y es presque là, y semble qu'y est seulement un petit detail qui cloche
C'est comme si ton perso sautait trop vite par rapport a ton code , ou quelque chose comme ça, ou peut-être un probleme avec ta boucle de collision(c'est très possible), ou l'offset y ?
-test sans les collisions?
-test avec des paramètres sans structure pour voir ?
- les index? refait un rescomp avec map ? ta map elle-même ? Une histoire de dimensions de map ?
-Ton code lui même est bien avant ton VDP_waitVSync() et donc tes VDP_setHorizontalScroll +VDP_setVerticalScroll juste après ton VDP_waitVSync()...
-ET Fais-tu tes initialisations + un VDP_setScrollingMode + VDP_setScreenWidth + VDP_setScreenHeight, tous ça entre un SYS_disableInts() et un SYS_enableInts() ?
C'est comme si ton perso sautait trop vite par rapport a ton code , ou quelque chose comme ça, ou peut-être un probleme avec ta boucle de collision(c'est très possible), ou l'offset y ?
-test sans les collisions?
-test avec des paramètres sans structure pour voir ?
- les index? refait un rescomp avec map ? ta map elle-même ? Une histoire de dimensions de map ?
-Ton code lui même est bien avant ton VDP_waitVSync() et donc tes VDP_setHorizontalScroll +VDP_setVerticalScroll juste après ton VDP_waitVSync()...
-ET Fais-tu tes initialisations + un VDP_setScrollingMode + VDP_setScreenWidth + VDP_setScreenHeight, tous ça entre un SYS_disableInts() et un SYS_enableInts() ?
Dr. Acula- Patient en incubation
- Nombre de messages : 56
Age : 43
Localisation : Paris en bretagne
Date d'inscription : 25/04/2018
Re: Collision et Tilemap avec la SGDK
C'est quoi levels[actual_level].offset_y ? Pourquoi y'en a pas sur x et y'en a sur y ?
Quelle est la dimension de ta carte ?
Quelle est la dimension de ta carte ?
Tryphon- Docteur *
- Nombre de messages : 26166
Age : 47
Localisation : Un peu plus à l'Ouest
Date d'inscription : 23/07/2016
Re: Collision et Tilemap avec la SGDK
DR.Acula
Alors j'ai essayé de décomposer mon code en ne laissant que le scrolling Horizontal mais effectivement des que la position de la camera change en Y les bords horizontaux ont tendance à glitcher, ce même en désactivant les collisions et en baissant la vitesse de saut.
Pour les autres parametres tout a l'air bon, c'est vraiment quand camposy entre en jeu que ça foire on dirait.
Tryphon
levels[actual_level].offset_y = levels[actual_level].h - 32 + 4;
Je fais ça car ma map fait 1600*512 et donc de base la map s'affiche a partir du coin haut de l'image alors que la position de début de mon personnage est en bas, j'ai donc crée un offset en hauteur, par contre je commence bien a gauche de la map donc pas besoin d'offset_x a priori.
Alors j'ai essayé de décomposer mon code en ne laissant que le scrolling Horizontal mais effectivement des que la position de la camera change en Y les bords horizontaux ont tendance à glitcher, ce même en désactivant les collisions et en baissant la vitesse de saut.
Pour les autres parametres tout a l'air bon, c'est vraiment quand camposy entre en jeu que ça foire on dirait.
Tryphon
levels[actual_level].offset_y = levels[actual_level].h - 32 + 4;
Je fais ça car ma map fait 1600*512 et donc de base la map s'affiche a partir du coin haut de l'image alors que la position de début de mon personnage est en bas, j'ai donc crée un offset en hauteur, par contre je commence bien a gauche de la map donc pas besoin d'offset_x a priori.
Infitek- Patient en incubation
- Nombre de messages : 72
Age : 32
Localisation : France
Date d'inscription : 28/03/2019
Re: Collision et Tilemap avec la SGDK
J'ai pas trop le temps de creuser mais j'ai l'impression que le problème est une confusion entre la position de la caméra et la position du joueur.
camposx, camposy devrait pointer sur les coordonnées cartes du point haut-gauche de l'écran (et tu ne devrais donc pas avoir besoin du offset_y).
Par exemple, en début de jeu, le joueur est, mettons, en (0, 511) mais la caméra en (0, 192) (car 192 = 512 - 320).
D'ailleurs, quand le perso bouge, je suppose qu'il faut attendre qu'il ait dépasse la moitié de l'écran (mettons (161, 511)) pour que la caméra commence à bouger (en (1, 192)).
camposx, camposy devrait pointer sur les coordonnées cartes du point haut-gauche de l'écran (et tu ne devrais donc pas avoir besoin du offset_y).
Par exemple, en début de jeu, le joueur est, mettons, en (0, 511) mais la caméra en (0, 192) (car 192 = 512 - 320).
D'ailleurs, quand le perso bouge, je suppose qu'il faut attendre qu'il ait dépasse la moitié de l'écran (mettons (161, 511)) pour que la caméra commence à bouger (en (1, 192)).
Tryphon- Docteur *
- Nombre de messages : 26166
Age : 47
Localisation : Un peu plus à l'Ouest
Date d'inscription : 23/07/2016
Re: Collision et Tilemap avec la SGDK
Un autre truc à pas perdre de vue, c'est que ton plan A ne fait pas 1600 pixels de large et que donc il faudra tracer tes tiles modulo sa vraie largeur (512 je suppose).
Idem pour la hauteur (vraisemblablement 256).
Edit : y'a pas un tuto sur les scrollings de grandes cartes ? Il en faudrait un (y'a d'autres finesses, comme balancer en DMA queue le tracé des lignes et colonnes pour des raisons d'efficacité).
Idem pour la hauteur (vraisemblablement 256).
Edit : y'a pas un tuto sur les scrollings de grandes cartes ? Il en faudrait un (y'a d'autres finesses, comme balancer en DMA queue le tracé des lignes et colonnes pour des raisons d'efficacité).
Tryphon- Docteur *
- Nombre de messages : 26166
Age : 47
Localisation : Un peu plus à l'Ouest
Date d'inscription : 23/07/2016
Re: Collision et Tilemap avec la SGDK
Bah c'est un sujet qui revient tout le temps si
Meme ici d'ailleurs :
https://www.gamopat-forum.com/t99015-sgdk-scrolling-encore-megadrive-genesis
Il est temps que je complète ce sample "sprite" pour y intégrer un long scrolling.
Meme ici d'ailleurs :
https://www.gamopat-forum.com/t99015-sgdk-scrolling-encore-megadrive-genesis
Il est temps que je complète ce sample "sprite" pour y intégrer un long scrolling.
Stef- Interne
- Nombre de messages : 5087
Age : 45
Localisation : Sevres
Date d'inscription : 04/04/2007
Re: Collision et Tilemap avec la SGDK
J'ai suivi tes conseils Tryphon je me suis débarrassé de cet y_offset maintenant la caméra est correctement configurée, j'ai réduit l'affichage de la map en une seule ligne pour voir si cela fonctionne :
- Code:
VDP_setMapEx(PLAN_A, levels[actual_level].map, TILE_ATTR_FULL(PAL1, FALSE, FALSE, FALSE, levels[actual_level].tile_index),
(fix32ToInt(camposx)/8), (fix32ToInt(camposy)/8), (fix32ToInt(camposx)/8), (fix32ToInt(camposy)/8), 64, 32);
Infitek- Patient en incubation
- Nombre de messages : 72
Age : 32
Localisation : France
Date d'inscription : 28/03/2019
Re: Collision et Tilemap avec la SGDK
Si j'ai bien compris VDP_setMapEx, c'est les coordonnées dans le plan qui doivent être modulées :
- Code:
VDP_setMapEx(
PLAN_A,
levels[actual_level].map,
TILE_ATTR_FULL(PAL1, FALSE, FALSE, FALSE, levels[actual_level].tile_index),
(fix32ToInt(camposx)/8) & 63,
(fix32ToInt(camposy)/8) & 31,
(fix32ToInt(camposx)/8),
(fix32ToInt(camposy)/8),
64,
32
);
Tryphon- Docteur *
- Nombre de messages : 26166
Age : 47
Localisation : Un peu plus à l'Ouest
Date d'inscription : 23/07/2016
Re: Collision et Tilemap avec la SGDK
Vraiment pas loin j'ai l'impression !
https://i.servimg.com/u/f57/20/05/15/69/rom_0014.png
Il doit falloir rajouter la largeur/hauteur de la map dans l'equation...
Je vais faire des tests, merci en tout cas !
EDIT : Ne faites pas attention au carré en haut a gauche c'est juste un sprite mal configuré.
https://i.servimg.com/u/f57/20/05/15/69/rom_0014.png
Il doit falloir rajouter la largeur/hauteur de la map dans l'equation...
Je vais faire des tests, merci en tout cas !
EDIT : Ne faites pas attention au carré en haut a gauche c'est juste un sprite mal configuré.
Infitek- Patient en incubation
- Nombre de messages : 72
Age : 32
Localisation : France
Date d'inscription : 28/03/2019
Re: Collision et Tilemap avec la SGDK
Rien a faire j'ai beau essayer avec la largeur et la hauteur de ma map en tile, soit ça défile beaucoup trop vite jusqu'au bout du plan soit j’ai le même problème que sur l'image ci dessus.
Infitek- Patient en incubation
- Nombre de messages : 72
Age : 32
Localisation : France
Date d'inscription : 28/03/2019
Re: Collision et Tilemap avec la SGDK
Tu peux poster le source complet (en virant ce qui ne sert à rien) ?
Tryphon- Docteur *
- Nombre de messages : 26166
Age : 47
Localisation : Un peu plus à l'Ouest
Date d'inscription : 23/07/2016
Re: Collision et Tilemap avec la SGDK
Bien sur voici les fichiers principaux, j'ai essayé d'enlever tout ce qui n’interférais pas sur le scrolling :
https://drive.google.com/open?id=1QOcPuf6Jkp3D9QbqSPWiiRNzcfwa-Mcz
Un énorme merci, c'est vraiment le dernier truc qui me bloque je fais pas mal de C donc le reste devrait bien se passer
https://drive.google.com/open?id=1QOcPuf6Jkp3D9QbqSPWiiRNzcfwa-Mcz
Un énorme merci, c'est vraiment le dernier truc qui me bloque je fais pas mal de C donc le reste devrait bien se passer
Infitek- Patient en incubation
- Nombre de messages : 72
Age : 32
Localisation : France
Date d'inscription : 28/03/2019
Re: Collision et Tilemap avec la SGDK
En fait ton code n'est pas compilable. Et je ne vois pas où tu modifies camposx et camposy (enfin si, dans updateCamera, mais je la vois pas appelée).
Si ça te dérange pas, je veux bien un code plus complet (promis, je le leake pas )
Si ça te dérange pas, je veux bien un code plus complet (promis, je le leake pas )
Tryphon- Docteur *
- Nombre de messages : 26166
Age : 47
Localisation : Un peu plus à l'Ouest
Date d'inscription : 23/07/2016
Re: Collision et Tilemap avec la SGDK
Pas de soucis voila la bête : https://drive.google.com/open?id=1uxftuD7QvPm4rAC-WzU7TV--ys1xno_0
Normalement il est appelé dans la boucle du main mais j'avais du l'enlever sans faire attention en nettoyant les sources.
Oh pour le leak je m'en fait pas trop à ce stade du développement
Normalement il est appelé dans la boucle du main mais j'avais du l'enlever sans faire attention en nettoyant les sources.
Oh pour le leak je m'en fait pas trop à ce stade du développement
Infitek- Patient en incubation
- Nombre de messages : 72
Age : 32
Localisation : France
Date d'inscription : 28/03/2019
Re: Collision et Tilemap avec la SGDK
Mmmh, j'ai le regret de te dire que ça ne compile toujours pas.
Après un make clean et un make, j'obtiens le message d'erreur suivant :
Ça n'a rien à voir avec ton problème de scrolling, a priori, mais c'est bizarre (et c'est casse-pieds pour les tests).
Sans "make clean", ça compile, mais je n'ai pas le sprite principal (et je ne peux pas bouger).
Après un make clean et un make, j'obtiens le message d'erreur suivant :
- Code:
java -jar C:/SGDK134/bin/rescomp.jar res/sound.res res/sound.s
ResComp 2.0 - SGDK Resource Compiler - Copyright 2019 (Stephane Dallongeville)
Resource: XGM castle_music "music/vampire.vgm"
--> executing plugin XGM...
Executing C:\SGDK134\bin\xgmtool C:\Users\Tryphon Tournesol\Downloads\Castle\res\music\vampire.vgm C:/Users/Tryphon Tournesol/Downloads/Castle/res/music/vampire.bin -s
Resource: WAV player_jump_sfx "sfx/Jump.wav" XGM
--> executing plugin WAV...
Exception in thread "main" java.lang.NegativeArraySizeException
at sgdk.tool.SoundUtil.getRawDataFromWAV(SoundUtil.java:28)
at sgdk.rescomp.processor.WavProcessor.execute(WavProcessor.java:94)
at sgdk.rescomp.Compiler.execute(Compiler.java:266)
at sgdk.rescomp.Compiler.compile(Compiler.java:100)
at sgdk.rescomp.Launcher.main(Launcher.java:51)
make.exe": *** [res/sound.s] Error 1
rm res/gfx.s
Ça n'a rien à voir avec ton problème de scrolling, a priori, mais c'est bizarre (et c'est casse-pieds pour les tests).
Sans "make clean", ça compile, mais je n'ai pas le sprite principal (et je ne peux pas bouger).
Tryphon- Docteur *
- Nombre de messages : 26166
Age : 47
Localisation : Un peu plus à l'Ouest
Date d'inscription : 23/07/2016
Re: Collision et Tilemap avec la SGDK
Raah zut, bon j'ai enlevé les sons et les musiques a priori ça devrait passer, chez moi ça compile nickel en tout cas :
https://drive.google.com/open?id=1hgaJPcSfs-jUZqrnKiR6FDs_Yy-abuGm
https://drive.google.com/open?id=1hgaJPcSfs-jUZqrnKiR6FDs_Yy-abuGm
Infitek- Patient en incubation
- Nombre de messages : 72
Age : 32
Localisation : France
Date d'inscription : 28/03/2019
Re: Collision et Tilemap avec la SGDK
Merci Oui, ça compile ! Je regarde ça dès que je peux...
Tryphon- Docteur *
- Nombre de messages : 26166
Age : 47
Localisation : Un peu plus à l'Ouest
Date d'inscription : 23/07/2016
Re: Collision et Tilemap avec la SGDK
OK c'est bon, j'ai compris : tu retraces tout le plan ! Faut juste tracer la colonne de droite ou de gauche (ce que t'avais fait dans ta tentative précédente, c'est pour ça que je me suis pas méfié )
J'ai un peu modifié ton code pour que ce soit plus efficace :
* tu n'as pas besoin que camposx et camposy soient des fix32, des u16 ou des s16 suffisent
* j'ai créé 2 booléens camera_move_left et camera_move_right, mis à jour dans updateCamera, pour savoir quelle colonne mettre à jour ; tu adapteras pour le scrolling vertical
* j'ai vu que tu testais le type des ennemis grâce à des chaînes (ce qu'on fait dans les moteurs de jeu actuels je crois) ; c'est une mauvaise idée sur MD (c'est assez long de comparer des chaînes), utilise plutôt des identificateurs entiers :
tu testes :
* j'ai cru voir des multiplications dans check_near_tiles, c'est terrible
Un truc qui devrait marcher, au lieu d'écrire :
tu écris :
J'ai un peu modifié ton code pour que ce soit plus efficace :
* tu n'as pas besoin que camposx et camposy soient des fix32, des u16 ou des s16 suffisent
* j'ai créé 2 booléens camera_move_left et camera_move_right, mis à jour dans updateCamera, pour savoir quelle colonne mettre à jour ; tu adapteras pour le scrolling vertical
* j'ai vu que tu testais le type des ennemis grâce à des chaînes (ce qu'on fait dans les moteurs de jeu actuels je crois) ; c'est une mauvaise idée sur MD (c'est assez long de comparer des chaînes), utilise plutôt des identificateurs entiers :
- Code:
#define PLAYER 1
#define TOAD 2
etc.
- Code:
if (strcmp(enemy->name, "toad") == 0)
tu testes :
- Code:
if (enemy->name_id == TOAD)
* j'ai cru voir des multiplications dans check_near_tiles, c'est terrible
Un truc qui devrait marcher, au lieu d'écrire :
- Code:
value = ligne*map->w + col;
tu écris :
- Code:
if (map->w == 400) {
value = ligne * 400 + col;
}
Tryphon- Docteur *
- Nombre de messages : 26166
Age : 47
Localisation : Un peu plus à l'Ouest
Date d'inscription : 23/07/2016
Re: Collision et Tilemap avec la SGDK
Les fichiers modifiés :
main.c
updateCamera.c
updatePhysics.c
init.c
game.h
main.c
updateCamera.c
updatePhysics.c
init.c
game.h
Tryphon- Docteur *
- Nombre de messages : 26166
Age : 47
Localisation : Un peu plus à l'Ouest
Date d'inscription : 23/07/2016
Re: Collision et Tilemap avec la SGDK
Il reste le problème du scrolling vertical et multidirectionnel, mais ta carte ne fait que 224 pixels de haut...
Tryphon- Docteur *
- Nombre de messages : 26166
Age : 47
Localisation : Un peu plus à l'Ouest
Date d'inscription : 23/07/2016
Re: Collision et Tilemap avec la SGDK
Merci beaucoup pour tous tes bons conseils effectivement ça fonctionne maintenant, je devrais pouvoir m'en sortir avec ces bases solides, vraiment un énorme merci pour ton aide, je me remets au boulot !
Infitek- Patient en incubation
- Nombre de messages : 72
Age : 32
Localisation : France
Date d'inscription : 28/03/2019
Re: Collision et Tilemap avec la SGDK
J'ai fait une boulette : faut sortir le
du if dans updateCamera() (et y'en a peut-être d'autres, mais t'as l'idée). T'as remarqué aussi que y'a pas du tout besoin du offset_y dont on parlait hier.
Pour les scrollings verticaux, n'oublie pas qu'il faudra tracer une ligne et une colonne plus loin.
Un truc que j'aime bien pour débugger : les KLog, KDebug_Halt, etc.
C'est des instructions spéciales pour l'émulateur gens_kmod, qui provoquent l'affichage de messages dans un terminal, ou qui pausent l'émulateur. C'est super pratique (enfin moi je sais débugger que comme ça, j'ai jamais appris à me servie d'un debugger, c'est mon côté manouche ) et c'est implémenté par défaut dans SGDK.
Par contre, faut penser à les désactiver pour les release parce que ça bouffe assez méchamment des performances ! Moi j'ai écrit un truc du genre :
Un autre truc : gens (enfin gens_r57shell, mais peut-être d'autres) ont un compteur de "frames perdues" qui permettent de savoir quand t'as raté une VBlank (ce qui signifie que le corps de ta boucle principale est trop lent), c'est assez utile.
Ça vaut ce que ça vaut.
Autre chose : je me demande si c'est normal que le SPR_update (et même le VDP_setMapEx, même si y'a moins de risques) soient à l'extérieur du SYS_disableInts() - SysEnableInts() (parce qu'ils accèdent au VDP)
- Code:
camera_move_left = FALSE;
camera_move_right = FALSE;
du if dans updateCamera() (et y'en a peut-être d'autres, mais t'as l'idée). T'as remarqué aussi que y'a pas du tout besoin du offset_y dont on parlait hier.
Pour les scrollings verticaux, n'oublie pas qu'il faudra tracer une ligne et une colonne plus loin.
Un truc que j'aime bien pour débugger : les KLog, KDebug_Halt, etc.
C'est des instructions spéciales pour l'émulateur gens_kmod, qui provoquent l'affichage de messages dans un terminal, ou qui pausent l'émulateur. C'est super pratique (enfin moi je sais débugger que comme ça, j'ai jamais appris à me servie d'un debugger, c'est mon côté manouche ) et c'est implémenté par défaut dans SGDK.
Par contre, faut penser à les désactiver pour les release parce que ça bouffe assez méchamment des performances ! Moi j'ai écrit un truc du genre :
- Code:
#ifdef DEBUG
#define LOG(m) KDebug_Alert((m));
#else
#define LOG(m) {}
#endif
Un autre truc : gens (enfin gens_r57shell, mais peut-être d'autres) ont un compteur de "frames perdues" qui permettent de savoir quand t'as raté une VBlank (ce qui signifie que le corps de ta boucle principale est trop lent), c'est assez utile.
Ça vaut ce que ça vaut.
Autre chose : je me demande si c'est normal que le SPR_update (et même le VDP_setMapEx, même si y'a moins de risques) soient à l'extérieur du SYS_disableInts() - SysEnableInts() (parce qu'ils accèdent au VDP)
Tryphon- Docteur *
- Nombre de messages : 26166
Age : 47
Localisation : Un peu plus à l'Ouest
Date d'inscription : 23/07/2016
Page 1 sur 5 • 1, 2, 3, 4, 5
Sujets similaires
» Problème de sprites avec SGDK
» Besoin d'aide pour un éditeur de Tilemap
» [C/SDL/SGDK] Le bouzin du Kane
» SGDK et Mega CD
» [SGDK] Màj de sprites
» Besoin d'aide pour un éditeur de Tilemap
» [C/SDL/SGDK] Le bouzin du Kane
» SGDK et Mega CD
» [SGDK] Màj de sprites
Page 1 sur 5
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum