GAMOPAT
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.

Collision et Tilemap avec la SGDK

+2
Stef
Infitek
6 participants

Page 1 sur 5 1, 2, 3, 4, 5  Suivant

Aller en bas

Collision et Tilemap avec la SGDK Empty Collision et Tilemap avec la SGDK

Message par Infitek Jeu 28 Mar 2019 - 20:46

Bonjour à tous amis codeurs Very Happy

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 Collision et Tilemap avec la SGDK 418468

Merci pour votre aide ! Very Happy
Infitek
Infitek
Patient en incubation

Masculin Nombre de messages : 72
Age : 31
Localisation : France
Date d'inscription : 28/03/2019

Revenir en haut Aller en bas

Collision et Tilemap avec la SGDK Empty Re: Collision et Tilemap avec la SGDK

Message par Infitek Ven 29 Mar 2019 - 10:12

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)
Infitek
Infitek
Patient en incubation

Masculin Nombre de messages : 72
Age : 31
Localisation : France
Date d'inscription : 28/03/2019

Revenir en haut Aller en bas

Collision et Tilemap avec la SGDK Empty Re: Collision et Tilemap avec la SGDK

Message par Stef Ven 29 Mar 2019 - 21:45

Hello !

Merci pour le commentaire par rapport à SGDK Embarassed 
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
Stef
Interne
Interne

Masculin Nombre de messages : 5082
Age : 44
Localisation : Sevres
Date d'inscription : 04/04/2007

Revenir en haut Aller en bas

Collision et Tilemap avec la SGDK Empty Re: Collision et Tilemap avec la SGDK

Message par Infitek Ven 29 Mar 2019 - 22:20

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 ?
Infitek
Infitek
Patient en incubation

Masculin Nombre de messages : 72
Age : 31
Localisation : France
Date d'inscription : 28/03/2019

Revenir en haut Aller en bas

Collision et Tilemap avec la SGDK Empty Re: Collision et Tilemap avec la SGDK

Message par Stef Sam 30 Mar 2019 - 13:15

oui c'est bien ça, c'est celle en haut à droite gauche!

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
Stef
Interne
Interne

Masculin Nombre de messages : 5082
Age : 44
Localisation : Sevres
Date d'inscription : 04/04/2007

Revenir en haut Aller en bas

Collision et Tilemap avec la SGDK Empty Re: Collision et Tilemap avec la SGDK

Message par Infitek Sam 30 Mar 2019 - 17:27

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é :
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);  
Surement une erreur bête, je pensais pourtant avoir correctement configuré la fonction

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
Infitek
Patient en incubation

Masculin Nombre de messages : 72
Age : 31
Localisation : France
Date d'inscription : 28/03/2019

Revenir en haut Aller en bas

Collision et Tilemap avec la SGDK Empty Re: Collision et Tilemap avec la SGDK

Message par Dr. Acula Dim 31 Mar 2019 - 23:58

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...

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:
planPlan where we want to load Map.
Accepted values are:

  • PLAN_A
  • PLAN_B
  • PLAN_WINDOW

mapMap to load.
basetileBase index and flags for tile attributes (see TILE_ATTR_FULL() macro).
xPlan X destination position (in tile).
yPlan Y destination position (in tile).
xmMap region X start position (in tile).
ymMap region Y start position (in tile).
wmMap region Width (in tile).
hmMap region Heigh (in tile).
[size]

Load the specified Map region at specified plan position.[/size]
Dr. Acula
Dr. Acula
Patient en incubation

Masculin Nombre de messages : 56
Age : 43
Localisation : Paris en bretagne
Date d'inscription : 25/04/2018

Revenir en haut Aller en bas

Collision et Tilemap avec la SGDK Empty Re: Collision et Tilemap avec la SGDK

Message par Infitek Lun 1 Avr 2019 - 0:32

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 :

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 Very Happy
Infitek
Infitek
Patient en incubation

Masculin Nombre de messages : 72
Age : 31
Localisation : France
Date d'inscription : 28/03/2019

Revenir en haut Aller en bas

Collision et Tilemap avec la SGDK Empty Re: Collision et Tilemap avec la SGDK

Message par Dr. Acula Lun 1 Avr 2019 - 8:48

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() ?
Dr. Acula
Dr. Acula
Patient en incubation

Masculin Nombre de messages : 56
Age : 43
Localisation : Paris en bretagne
Date d'inscription : 25/04/2018

Revenir en haut Aller en bas

Collision et Tilemap avec la SGDK Empty Re: Collision et Tilemap avec la SGDK

Message par Tryphon Lun 1 Avr 2019 - 10:37

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 ?
Tryphon
Tryphon
Docteur *
Docteur *

Masculin Nombre de messages : 26166
Age : 47
Localisation : Un peu plus à l'Ouest
Date d'inscription : 23/07/2016

Revenir en haut Aller en bas

Collision et Tilemap avec la SGDK Empty Re: Collision et Tilemap avec la SGDK

Message par Infitek Lun 1 Avr 2019 - 11:21

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.
Infitek
Infitek
Patient en incubation

Masculin Nombre de messages : 72
Age : 31
Localisation : France
Date d'inscription : 28/03/2019

Revenir en haut Aller en bas

Collision et Tilemap avec la SGDK Empty Re: Collision et Tilemap avec la SGDK

Message par Tryphon Lun 1 Avr 2019 - 11:28

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)).
Tryphon
Tryphon
Docteur *
Docteur *

Masculin Nombre de messages : 26166
Age : 47
Localisation : Un peu plus à l'Ouest
Date d'inscription : 23/07/2016

Revenir en haut Aller en bas

Collision et Tilemap avec la SGDK Empty Re: Collision et Tilemap avec la SGDK

Message par Tryphon Lun 1 Avr 2019 - 11:29

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é).
Tryphon
Tryphon
Docteur *
Docteur *

Masculin Nombre de messages : 26166
Age : 47
Localisation : Un peu plus à l'Ouest
Date d'inscription : 23/07/2016

Revenir en haut Aller en bas

Collision et Tilemap avec la SGDK Empty Re: Collision et Tilemap avec la SGDK

Message par Stef Lun 1 Avr 2019 - 11:47

Bah c'est un sujet qui revient tout le temps si Razz
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
Stef
Interne
Interne

Masculin Nombre de messages : 5082
Age : 44
Localisation : Sevres
Date d'inscription : 04/04/2007

Revenir en haut Aller en bas

Collision et Tilemap avec la SGDK Empty Re: Collision et Tilemap avec la SGDK

Message par Infitek Lun 1 Avr 2019 - 14:25

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);
C'est pas mal mais j'ai toujours un problème lorsque ma caméra dépasse la taille du plan, les tiles apparaissent 8 pixels trop bas, ou placerait tu les modulos dans mon SetMapEx exactement ?
Infitek
Infitek
Patient en incubation

Masculin Nombre de messages : 72
Age : 31
Localisation : France
Date d'inscription : 28/03/2019

Revenir en haut Aller en bas

Collision et Tilemap avec la SGDK Empty Re: Collision et Tilemap avec la SGDK

Message par Tryphon Lun 1 Avr 2019 - 18:47

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
Tryphon
Docteur *
Docteur *

Masculin Nombre de messages : 26166
Age : 47
Localisation : Un peu plus à l'Ouest
Date d'inscription : 23/07/2016

Revenir en haut Aller en bas

Collision et Tilemap avec la SGDK Empty Re: Collision et Tilemap avec la SGDK

Message par Infitek Lun 1 Avr 2019 - 19:40

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 ! Very Happy

EDIT : Ne faites pas attention au carré en haut a gauche c'est juste un sprite mal configuré.
Infitek
Infitek
Patient en incubation

Masculin Nombre de messages : 72
Age : 31
Localisation : France
Date d'inscription : 28/03/2019

Revenir en haut Aller en bas

Collision et Tilemap avec la SGDK Empty Re: Collision et Tilemap avec la SGDK

Message par Infitek Lun 1 Avr 2019 - 22:38

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
Infitek
Patient en incubation

Masculin Nombre de messages : 72
Age : 31
Localisation : France
Date d'inscription : 28/03/2019

Revenir en haut Aller en bas

Collision et Tilemap avec la SGDK Empty Re: Collision et Tilemap avec la SGDK

Message par Tryphon Lun 1 Avr 2019 - 23:24

Tu peux poster le source complet (en virant ce qui ne sert à rien) ?
Tryphon
Tryphon
Docteur *
Docteur *

Masculin Nombre de messages : 26166
Age : 47
Localisation : Un peu plus à l'Ouest
Date d'inscription : 23/07/2016

Revenir en haut Aller en bas

Collision et Tilemap avec la SGDK Empty Re: Collision et Tilemap avec la SGDK

Message par Infitek Mar 2 Avr 2019 - 0:07

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 Very Happy
Infitek
Infitek
Patient en incubation

Masculin Nombre de messages : 72
Age : 31
Localisation : France
Date d'inscription : 28/03/2019

Revenir en haut Aller en bas

Collision et Tilemap avec la SGDK Empty Re: Collision et Tilemap avec la SGDK

Message par Tryphon Mar 2 Avr 2019 - 11:50

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 Razz)
Tryphon
Tryphon
Docteur *
Docteur *

Masculin Nombre de messages : 26166
Age : 47
Localisation : Un peu plus à l'Ouest
Date d'inscription : 23/07/2016

Revenir en haut Aller en bas

Collision et Tilemap avec la SGDK Empty Re: Collision et Tilemap avec la SGDK

Message par Infitek Mar 2 Avr 2019 - 15:22

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 MDR
Infitek
Infitek
Patient en incubation

Masculin Nombre de messages : 72
Age : 31
Localisation : France
Date d'inscription : 28/03/2019

Revenir en haut Aller en bas

Collision et Tilemap avec la SGDK Empty Re: Collision et Tilemap avec la SGDK

Message par Tryphon Mar 2 Avr 2019 - 17:50

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 :

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
Tryphon
Docteur *
Docteur *

Masculin Nombre de messages : 26166
Age : 47
Localisation : Un peu plus à l'Ouest
Date d'inscription : 23/07/2016

Revenir en haut Aller en bas

Collision et Tilemap avec la SGDK Empty Re: Collision et Tilemap avec la SGDK

Message par Infitek Mar 2 Avr 2019 - 18:02

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
Infitek
Infitek
Patient en incubation

Masculin Nombre de messages : 72
Age : 31
Localisation : France
Date d'inscription : 28/03/2019

Revenir en haut Aller en bas

Collision et Tilemap avec la SGDK Empty Re: Collision et Tilemap avec la SGDK

Message par Tryphon Mar 2 Avr 2019 - 18:07

Merci Wink Oui, ça compile ! Je regarde ça dès que je peux...
Tryphon
Tryphon
Docteur *
Docteur *

Masculin Nombre de messages : 26166
Age : 47
Localisation : Un peu plus à l'Ouest
Date d'inscription : 23/07/2016

Revenir en haut Aller en bas

Collision et Tilemap avec la SGDK Empty Re: Collision et Tilemap avec la SGDK

Message par Tryphon Mar 2 Avr 2019 - 19:17

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é Razz)

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.
puis au lieu de :
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 Very Happy
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;
}
et tu fais autant de tests que de valeurs de map->w possibles. OK, c'est lourd et moche (mais tu peux mettre une macro), mais une multiplication par une constante est optimisée en décalages et additions par le compilo, alors qu'une multiplication par la variable map->w génèrera un mul, très lent sur 68000. En plus cette fonction tu vas l'appeler pour tous les sprites je suppose, alors ça vaut le coup de l'optimiser...
Tryphon
Tryphon
Docteur *
Docteur *

Masculin Nombre de messages : 26166
Age : 47
Localisation : Un peu plus à l'Ouest
Date d'inscription : 23/07/2016

Revenir en haut Aller en bas

Collision et Tilemap avec la SGDK Empty Re: Collision et Tilemap avec la SGDK

Message par Tryphon Mar 2 Avr 2019 - 19:39

Les fichiers modifiés :

main.c
updateCamera.c
updatePhysics.c
init.c
game.h
Tryphon
Tryphon
Docteur *
Docteur *

Masculin Nombre de messages : 26166
Age : 47
Localisation : Un peu plus à l'Ouest
Date d'inscription : 23/07/2016

Revenir en haut Aller en bas

Collision et Tilemap avec la SGDK Empty Re: Collision et Tilemap avec la SGDK

Message par Tryphon Mar 2 Avr 2019 - 19:42

Il reste le problème du scrolling vertical et multidirectionnel, mais ta carte ne fait que 224 pixels de haut...
Tryphon
Tryphon
Docteur *
Docteur *

Masculin Nombre de messages : 26166
Age : 47
Localisation : Un peu plus à l'Ouest
Date d'inscription : 23/07/2016

Revenir en haut Aller en bas

Collision et Tilemap avec la SGDK Empty Re: Collision et Tilemap avec la SGDK

Message par Infitek Mar 2 Avr 2019 - 21:30

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 ! Very Happy
Infitek
Infitek
Patient en incubation

Masculin Nombre de messages : 72
Age : 31
Localisation : France
Date d'inscription : 28/03/2019

Revenir en haut Aller en bas

Collision et Tilemap avec la SGDK Empty Re: Collision et Tilemap avec la SGDK

Message par Tryphon Mar 2 Avr 2019 - 22:29

J'ai fait une boulette : faut sortir le

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 Razz) 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
comme ça quand je compile sans debug, ça les désactive.

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) Confused
Tryphon
Tryphon
Docteur *
Docteur *

Masculin Nombre de messages : 26166
Age : 47
Localisation : Un peu plus à l'Ouest
Date d'inscription : 23/07/2016

Revenir en haut Aller en bas

Page 1 sur 5 1, 2, 3, 4, 5  Suivant

Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum