Collision et Tilemap avec la SGDK
+2
Stef
Infitek
6 participants
Page 3 sur 5
Page 3 sur 5 • 1, 2, 3, 4, 5
Re: Collision et Tilemap avec la SGDK
Manque un d...
Tryphon- Docteur *
- Nombre de messages : 26166
Date d'inscription : 23/07/2016
Re: Collision et Tilemap avec la SGDK
Oui mais pas dans mon code, j'ai pas reussi a copier coller l'erreur via mon terminalTryphon a écrit:Manque un d...
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
Ok j'ai trouvé j'avais oublié d'encapsuler mon addSprite par :
SYS_disableInts();
et
SYS_enableInts();
SYS_disableInts();
et
SYS_enableInts();
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
Une petite question d'ordre pratique :
Si je veux que mon ennemi clignote en rouge lorsque je le frappe, je pourrais rajouter une animation correspondante dans son sprite (pas très opti et en plus je dois le faire pour tous les ennemis) ou alors je dois pouvoir le faire en manipulant les palettes, mais j'imagine que du coup c'est beaucoup moins simple, et si je touche la palette d"un ennemi ça va modifier celle des autres également..
Si je veux que mon ennemi clignote en rouge lorsque je le frappe, je pourrais rajouter une animation correspondante dans son sprite (pas très opti et en plus je dois le faire pour tous les ennemis) ou alors je dois pouvoir le faire en manipulant les palettes, mais j'imagine que du coup c'est beaucoup moins simple, et si je touche la palette d"un ennemi ça va modifier celle des autres également..
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
C'est bizarre que tu aies besoin d'un disableInts / enableInts pour la fonction addSprite().. faut que je regarde ça, normalement le sprite engine en a pas besoin (mais peut être sur le add j'ai pas bien isolé certaines opérations)
Stef- Interne
- Nombre de messages : 5087
Age : 45
Localisation : Sevres
Date d'inscription : 04/04/2007
Re: Collision et Tilemap avec la SGDK
Sinon pour ton clignotement, oui faut faire une anim. Ma palette ça marche pas pour la raison que tu donnes...
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 je reviens sur la SGDK après une courte pause et après avoir changé le sprite de mon personnage j'ai maintenant ces erreurs qui m’empêchent de compiler :
Rien a faire impossible de trouver d’où ça vient, tout marchait pourtant bien avant que je change de sprite
EDIT : problème résolu avec la suppression du fichier sprites.s
- Code:
C:/sgdk/bin/gcc -BC:/sgdk/bin -n -T C:/sgdk/md.ld -nostdlib out/sega.o @out/cmd_ C:/sgdk/lib/libmd.a C:/sgdk/lib/libgcc.a -o out/rom.out
out/res/sprite.o: In function `player_sprite':
(.rodata+0xd330): multiple definition of `player_sprite'
out/res/sprite.o:(.rodata+0xd330): first defined here
out/res/sprite.o: In function `toad_sprite':
(.rodata+0xf9cc): multiple definition of `toad_sprite'
out/res/sprite.o:(.rodata+0xf9cc): first defined here
out/res/sprite.o: In function `boar_sprite':
(.rodata+0x12e7a): multiple definition of `boar_sprite'
out/res/sprite.o:(.rodata+0x12e7a): first defined here
out/res/sprite.o: In function `bat_sprite':
(.rodata+0x13bf8): multiple definition of `bat_sprite'
out/res/sprite.o:(.rodata+0x13bf8): first defined here
make: *** [out/rom.out] Error 1
Rien a faire impossible de trouver d’où ça vient, tout marchait pourtant bien avant que je change de sprite
EDIT : problème résolu avec la suppression du fichier sprites.s
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 fais des make clean parfois ? Souvent des reliquats d'anciennes compilations provoquent des erreurs (en particulier quand tu modifies des structs dans des headers, mais peut-être avec les ressources, j'en sais rien vu que j'ai mon propre générateur de ressources).
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
tu dois avoir des fichiers .s (générés par rescomp) qui trainent... normalement ils sont effacés par make mais apparement là c'est pas le cas.
Stef- Interne
- Nombre de messages : 5087
Age : 45
Localisation : Sevres
Date d'inscription : 04/04/2007
Re: Collision et Tilemap avec la SGDK
C'est vrai que j'ai pas le réflexe de faire des make clean alors que j'en fais tout le temps quand je code en C d’habitude, effectivement c'était bien un .s qui me bloquait !
Dites, pour savoir combien de frames comporte une animation c'est bien
Parcequ'avec ça , le log me dit que j'ai 550 frames dans mon animation alors que j'en ai 9, je m'y prend mal ?
Dites, pour savoir combien de frames comporte une animation c'est bien
- Code:
monsprite->animation[monsprite->animInd].numFrame
Parcequ'avec ça , le log me dit que j'ai 550 frames dans mon animation alors que j'en ai 9, je m'y prend mal ?
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
C'est :
Qu'il faut faire. Le champ animation est un pointeur sur l'animation courante. L'index est utilisé pour détecter plus rapidement un changement d'animation.
- Code:
monsprite->animation->numFrame
Qu'il faut faire. Le champ animation est un pointeur sur l'animation courante. L'index est utilisé pour détecter plus rapidement un changement d'animation.
Dernière édition par Stef le Jeu 11 Avr 2019 - 14:09, é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
Effectivement ça fonctionne merci, par contre des que je met trop d'ennemis je suis saturé en Vram, mes sprites sont composés de plusieurs frames de 64x64 et j'obtiens ces message dans la console au lancement :
EDIT : J'ai egalement pas mal d'erreurs/warnings qui popent dans les messages, celui ci revient sans cesse :
Aucune idée d'ou ça peut venir..
- Code:
Message : SPR_allocateSprite(): success - allocating sprite at pos 39
Message : VDP_allocateSprites(9) success: 1 - remaining = 70
Message : VRAM_alloc(144) success: 1056 - remaining = 240
Message : SPR_allocateSprite(): success - allocating sprite at pos 38
Message : VDP_allocateSprites(9) success: 10 - remaining = 61
Message : VRAM_alloc(144) success: 1200 - remaining = 96
Message : SPR_allocateSprite(): success - allocating sprite at pos 37
Message : VDP_allocateSprites(9) success: 19 - remaining = 52
Message : VRAM_alloc(144) failed: no enough free VRAM slot (free = 96)
Message : VDP_releaseSprites(19, 9) --> remaining = 61
Message : SPR_releaseSprite: success - released sprite at pos 37
Message : Can't create sprite for ennemy index : 4
EDIT : J'ai egalement pas mal d'erreurs/warnings qui popent dans les messages, celui ci revient sans cesse :
- Code:
Message : DMA_queueDma(..) warning: transfer size is above 7500 bytes.
Aucune idée d'ou ça peut venir..
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
Lors de l'appel à SPR_init(..) tu dois spécifier l'espace VRAM que tu te réserves. Ici de toute évidence tu ne réserves pas assez (il faut au moins mettre 512 voire plus selon le nombre de sprites). Ensuite il faut savoir que par défaut le sprite engine alloue la VRAM pour chaque sprite, donc si tu as des ennemis ou des bullets qui partagent les mêmes tiles, il est plus judicieux de les pré-charger en VRAM et de passer l'allocation VRAM en manuel (avec la méthode SPR_setVRAMTileIndex(..)).
Les warnings sur le DMA, c'est juste que tu transfères trop par frame (surement à cause des sprites), si tu passes certains sprites en statique (pré chargé en VRAM) tu n'auras plus ce problème.
Les warnings sur le DMA, c'est juste que tu transfères trop par frame (surement à cause des sprites), si tu passes certains sprites en statique (pré chargé en VRAM) tu n'auras plus ce problème.
Stef- Interne
- Nombre de messages : 5087
Age : 45
Localisation : Sevres
Date d'inscription : 04/04/2007
Re: Collision et Tilemap avec la SGDK
C'est ce que je me demandais justement, c'est vraiment pas quelque chose que j'ai l'habitude de faire dans mes autres projets, je suis curieux de voir comment ça fonctionne, je vais regarder SPR_setVRAMTileIndex(..)) de ce pas !
Ok donc je vais essayer de tout passer en statique, merci beaucoup !
Ok donc je vais essayer de tout passer en statique, merci beaucoup !
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
Ok donc je pense que j'ai compris, je dois initialiser le Sprite de chaque ennemi différent dans la VRAM en utilisant SPR_setVRAMTileIndex et ensuite j'assigne a chaque ennemi le bon sprite en utilisant SPR_setSpriteTableInde avec le bon index c'est bien ça ?
Du coup comment je gère ls index ? Pour mon premier ennemi j'utilise SPR_setVRAMTileIndex(sprite_skeleton, 1) ? et ensuite je dois compter moi même le nombre de tiles du premier ennemi pour initialiser l'ennemi suivant ? SPR_setVRAMTileIndex(sprite_bat, nombreDeTilesDeLennemi1 + 1) ? Je dois pouvoir acceder a cet index sans le compter a la main non ?
Du coup comment je gère ls index ? Pour mon premier ennemi j'utilise SPR_setVRAMTileIndex(sprite_skeleton, 1) ? et ensuite je dois compter moi même le nombre de tiles du premier ennemi pour initialiser l'ennemi suivant ? SPR_setVRAMTileIndex(sprite_bat, nombreDeTilesDeLennemi1 + 1) ? Je dois pouvoir acceder a cet index sans le compter a la main non ?
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 crois que si tu fais juste un SPR_setVRAMTileIndex c'est bon , ça les mets en statique (index des tiles dans la vram), et je suis plus sûr mais je crois que pas forcement besoin de toucher a l'index des sprites du VDP avec SPR_setSpriteTableInde, il semble le sprite engine à dejà compris " ,) Et dailleurs toi aussi surement (si j'ai pas dit de bêtises )
EDIT:
Ha nan nan je viens de verifier , t'aas raison y faut le faire si tu veux vraiment "statique statique"
Bon courage!
EDIT:
Ha nan nan je viens de verifier , t'aas raison y faut le faire si tu veux vraiment "statique statique"
Bon courage!
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
Oui c'est bien ce que je pensais en fait j'imagine que l'index s'incrémente comme le TILE_USER_INDEX utilisé lors du chargement des tilesets non ?
C'est étrange je suis en train de travailler sur les différents types de collisions et comme je sais que la SGDK attribue un index aux tiles en fonction de l’ordre dans lequel elle les rencontres (balayage de l'image de gauche a droite puis de haut en bas d’après mes tests), j'ai décidé de placer toutes les tiles de collision différentes en haut a gauche de l'écran pour que je puisse connaitre leur index afin de gérer les collisions.
https://i.servimg.com/u/f57/20/05/15/69/collis10.png
Ca fonctionne, sauf pour les deux tiles de slope qui descendent, leur index sont 2053 et 2054...
Toutes les autres tiles, même celle apparaissant après ont un index correct compris entre 0 et 11...
C'est étrange je suis en train de travailler sur les différents types de collisions et comme je sais que la SGDK attribue un index aux tiles en fonction de l’ordre dans lequel elle les rencontres (balayage de l'image de gauche a droite puis de haut en bas d’après mes tests), j'ai décidé de placer toutes les tiles de collision différentes en haut a gauche de l'écran pour que je puisse connaitre leur index afin de gérer les collisions.
https://i.servimg.com/u/f57/20/05/15/69/collis10.png
Ca fonctionne, sauf pour les deux tiles de slope qui descendent, leur index sont 2053 et 2054...
Toutes les autres tiles, même celle apparaissant après ont un index correct compris entre 0 et 11...
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
normal je pense ; tes tiles sont les même que ceux qui montent....mais avec un retournement horizontal.
Re: Collision et Tilemap avec la SGDK
Exact , l'index ne fait pas 16 bits , mais 10 bits : https://wiki.megadrive.org/index.php?title=VDP_Scrolls
Donc si tu veux récup que l'index il faut faire un "&0x3FF"
Donc si tu veux récup que l'index il faut faire un "&0x3FF"
Invité- Invité
Re: Collision et Tilemap avec la SGDK
soit tu fais un mask comme Kannagi le propose, soit tu interdis à "rescomp" (enfin le truc qui converti ton image en tiles) de virer les tiles dupliqués & cie - si c'est possible (je n'utilise pas c'te chose donc j'en sais rien)
Re: Collision et Tilemap avec la SGDK
Sinon la méthode la plus simple reste d'avoir un collision map dissocié du plan. Un tableau de bytes stocké à part en somme.
Hpman- Patient contaminé
- Nombre de messages : 679
Age : 47
Localisation : Lille
Date d'inscription : 22/08/2014
Re: Collision et Tilemap avec la SGDK
Ok, j'ai pas tout suivi.
Cela dit tu fais un tileset du terrain et tu fais un layer par dessus la map avec un truc comme Tiled, tu as le résultat sans se prendre la tête ?
Cela dit tu fais un tileset du terrain et tu fais un layer par dessus la map avec un truc comme Tiled, tu as le résultat sans se prendre la tête ?
Dernière édition par Hpman le Mar 16 Avr 2019 - 21:31, édité 1 fois
Hpman- Patient contaminé
- Nombre de messages : 679
Age : 47
Localisation : Lille
Date d'inscription : 22/08/2014
Re: Collision et Tilemap avec la SGDK
Perso c'est ce que je fais (avec scripts maison & cie) Après ce que font les autres...
Re: Collision et Tilemap avec la SGDK
Personnellement je fais ma map sur Tiled et j'exporte les données de collisions et de décor sous forme d'image séparément.
ça marche très bien jusqu'ici, c'est pas très optimisé mais j'ai modifié un pixel sur les tiles que Rescomp retournait et du coup mes index sont nickel.
La j'essaye de faire fonctionner les slopes, j'y suis presque, mais si vous avez des suggestions je suis toujours à l'écoute
ça marche très bien jusqu'ici, c'est pas très optimisé mais j'ai modifié un pixel sur les tiles que Rescomp retournait et du coup mes index sont nickel.
La j'essaye de faire fonctionner les slopes, j'y suis presque, mais si vous avez des suggestions je suis toujours à l'écoute
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
ichigobankai a écrit:soit tu fais un mask comme Kannagi le propose, soit tu interdis à "rescomp" (enfin le truc qui converti ton image en tiles) de virer les tiles dupliqués & cie - si c'est possible (je n'utilise pas c'te chose donc j'en sais rien)
Oui c'est possible (depuis peu) :
IMAGE
-----
Take an image as input and transform it in SGDK Image structure.
Image is used to directly draw image in background plan, it internally contains a Palette, TileSet and Map structure.
Syntax:
IMAGE name img_file [compression [mapopt [mapbase]]]
name name of the output Image structure
img_file path of the input image file (should be 8bpp .bmp or .png)
compression compression type (use unpackImage(..) to unpack), accepted values:
-1 / BEST / AUTO = use best compression
0 / NONE = no compression
1 / APLIB = aplib library (good compression ratio but slow)
2 / FAST / LZ4W = custom lz4 compression (average compression ratio but fast)
mapopt define the map optimisation level\n");
0 / NONE = no optimisation (each tile is unique)
1 / ALL = find duplicate and flipped tile (default)
2 / DUPLICATE = find duplicate tile only
mapbase define the base tilemap value, useful to set a default priority, palette and base tile index offset.
C'est le paramètre mapopt qui permet de définir ça.
Stef- Interne
- Nombre de messages : 5087
Age : 45
Localisation : Sevres
Date d'inscription : 04/04/2007
Re: Collision et Tilemap avec la SGDK
Stef > J'ai tenté de modifier mapOpt plusieurs fois mais j'ai pas eu de changement malheureusement :/
Mes pentes sont presque fonctionnelles ! J'ai parfois un soucis lorsque je saute dessus ou que j'avance par accoups :/
https://www.youtube.com/watch?v=DVItmgk7Kqo&feature=youtu.be
Je m'en vais maintenant essayer d'afficher plusieurs ennemis à l'écran, en les faisant partager le même sprite.
Mes pentes sont presque fonctionnelles ! J'ai parfois un soucis lorsque je saute dessus ou que j'avance par accoups :/
https://www.youtube.com/watch?v=DVItmgk7Kqo&feature=youtu.be
Je m'en vais maintenant essayer d'afficher plusieurs ennemis à l'écran, en les faisant partager le même sprite.
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
Infitek a écrit:Stef > J'ai tenté de modifier mapOpt plusieurs fois mais j'ai pas eu de changement malheureusement :/
Mes pentes sont presque fonctionnelles ! J'ai parfois un soucis lorsque je saute dessus ou que j'avance par accoups :/
https://www.youtube.com/watch?v=DVItmgk7Kqo&feature=youtu.be
Je m'en vais maintenant essayer d'afficher plusieurs ennemis à l'écran, en les faisant partager le même sprite.
Ca a été ajouté assez récement et du coup je pense qu'il te faut le rescomp.exe intermédiaire sur le repository. Le problème c'est qu'entre temps j'ai fait pas mal de changements (encore) et le compilateur de ressource a complètement été réécrit (en java). Si tu met à jour tout ton SGDK avec la version du repository *normalement* ça devrait marcher mais c'est risqué quand même ^^
Stef- Interne
- Nombre de messages : 5087
Age : 45
Localisation : Sevres
Date d'inscription : 04/04/2007
Re: Collision et Tilemap avec la SGDK
Oui j'ai réussi a faire ça sans, je préfère ne pas prendre de risque.
Du coup je me suis penché sur les sprites en statique et je pense que ça va être plus compliqué que prévu !
En fait j'avais fait un bout de code qui ajoutait un sprite par ennemi mais j'utilisais SPR_setSpriteTableIndex() pour assigner l'index d'un sprite déjà crée, pour ne pas avoir de doublons, mais du coup impossible d'afficher deux ennemis avec le même sprite à l'écran vu qu'ils partagent le même sprite et donc les mêmes animations...
Du coup je suis un peu bloqué, comment vous gérez ça de votre côté ?
Car d'un autre côté si je n'utilise que AddSprite mon dernier ennemi n'est pas crée par manque de VRAM..
Du coup je me suis penché sur les sprites en statique et je pense que ça va être plus compliqué que prévu !
En fait j'avais fait un bout de code qui ajoutait un sprite par ennemi mais j'utilisais SPR_setSpriteTableIndex() pour assigner l'index d'un sprite déjà crée, pour ne pas avoir de doublons, mais du coup impossible d'afficher deux ennemis avec le même sprite à l'écran vu qu'ils partagent le même sprite et donc les mêmes animations...
Du coup je suis un peu bloqué, comment vous gérez ça de votre côté ?
Car d'un autre côté si je n'utilise que AddSprite mon dernier ennemi n'est pas crée par manque de VRAM..
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
A la limite je pourrais appeler SPR_addSprite seulement quand mon joueur approche de la zone ou l'ennemi se situe non ? Puis je fais un releaseSprite dès qu'il n'a plus de pv ou qu'il sort de l'écran.
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
Ca ne marche pas non plus; j'ai l'impression que le programme n'écrit pas au bon endroit dans la VRAM
Infitek- Patient en incubation
- Nombre de messages : 72
Age : 32
Localisation : France
Date d'inscription : 28/03/2019
Page 3 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 3 sur 5
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum