Collision et Tilemap avec la SGDK

Page 4 sur 4 Précédent  1, 2, 3, 4

Aller en bas

Collision et Tilemap avec la SGDK - Page 4 Empty Re: Collision et Tilemap avec la SGDK

Message par Infitek le Sam 20 Avr 2019 - 18:53

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 : 49
Date d'inscription : 28/03/2019

Revenir en haut Aller en bas

Collision et Tilemap avec la SGDK - Page 4 Empty Re: Collision et Tilemap avec la SGDK

Message par Stef le Mar 23 Avr 2019 - 9:42

Tu t'es trompé de méthode, SPR_setSpriteTableIndex(..) c'est pour allouer statiquement le sprite hard, c'est très rare qu'on ai besoin de ça.
Ce dont tu as besoin c'est SPR_setVRAMIndex(..), ça te permet de définir la position des tiles d'un sprite en VRAM manuellement (et donc de partager les mêmes tiles pour plusieurs sprites)
Stef
Stef
Infirmier

Masculin Nombre de messages : 4747
Age : 39
Localisation : Sevres
Date d'inscription : 04/04/2007

Revenir en haut Aller en bas

Collision et Tilemap avec la SGDK - Page 4 Empty Re: Collision et Tilemap avec la SGDK

Message par Infitek le Mar 23 Avr 2019 - 13:52

@Stef a écrit:Tu t'es trompé de méthode, SPR_setSpriteTableIndex(..) c'est pour allouer statiquement le sprite hard, c'est très rare qu'on ai besoin de ça.
Ce dont tu as besoin c'est SPR_setVRAMIndex(..), ça te permet de définir la position des tiles d'un sprite en VRAM manuellement (et donc de partager les mêmes tiles pour plusieurs sprites)
 Je vois mais du coup ça posera un problème si j'ai les 2 même sprites à l'écran mais avec une animation différente pour chacun ?

Car dans la VRAM les tiles des sprites vont être modifiés en fonction de l'animation courante..
Infitek
Infitek
Patient en incubation

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

Revenir en haut Aller en bas

Collision et Tilemap avec la SGDK - Page 4 Empty Re: Collision et Tilemap avec la SGDK

Message par Infitek le Mar 23 Avr 2019 - 16:36

Voila le bout de code qui s’exécute lorsque j'ajoute un ennemi dans mon niveau

Code:
int found = FALSE;
    for (int i = 0; i < nb_enemy; i++)
    {
      if (levels[actual_level].enemies[i].id == enemy->id && levels[actual_level].enemies[i].x != enemy->x)
          {
              KLog_U2("Found ennemy not null, index : ", levels[actual_level].enemies[i].id, " i = ", i);
              enemy->enemy_sprite = SPR_addSprite(enemy->sprite_def, fix32ToInt(enemy->posx), fix32ToInt(enemy->posy), TILE_ATTR(PAL2, TRUE, FALSE, FALSE));
              enemy->sprite_index = levels[actual_level].enemies[i].sprite_index;
              SPR_setVRAMTileIndex (enemy->enemy_sprite, enemy->sprite_index);
              KLog_U1("Copying tile index  : ", enemy->sprite_index);
              found = TRUE;
              i = nb_enemy;
          }
    }
    if (found == FALSE)
    {
      KLog_U1("Did not found already existing sprite for this ennemy, creating one for id : ", enemy->id);
      enemy->enemy_sprite = SPR_addSprite(enemy->sprite_def, fix32ToInt(enemy->posx), fix32ToInt(enemy->posy), TILE_ATTR(PAL2, TRUE, FALSE, FALSE));
      enemy->sprite_index = enemy->enemy_sprite->VDPSpriteIndex;
      SPR_setVRAMTileIndex(enemy->enemy_sprite, enemy->sprite_index);
      KLog_U1("Actual tile index  : ", enemy->sprite_index);
    }

En gros je boucle dans ma liste d'ennemi pour voir si je trouve un ennemi du même type (et donc avec le même sprite) qui aurait déjà été ajouté dans mon niveau, si j'en trouve un je copie son VDPSpriteIndex et je l'assigne à mon ennemi avec SPR_setVRAMTileIndex (j'imagine que c'est cette fonction la que tu évoquais dans ton message précédent, je n'ai pas trouvé la méthode SPR_setVRAMIndex(..) dans la doc) sinon, c'est que cet ennemi est le premier de ce type à être ajouté dans mon niveau , du coup je laisse AddSprite se charger de lui attribuer un index dans la VRAM

Dans les logs ça semble fonctionner :

Code:
   create_monster(&levels[actual_level].enemies[0], SKELETON, 640, max_posy - 89);
    create_monster(&levels[actual_level].enemies[1], SKELETON, 840, max_posy - 89);
    create_monster(&levels[actual_level].enemies[2], SKELETON, 1200, max_posy - 89);
    create_monster(&levels[actual_level].enemies[3], SKELETON, 1500, max_posy - 89);
    create_monster(&levels[actual_level].enemies[4], REAPER, 520, max_posy - 180);
    create_monster(&levels[actual_level].enemies[5], REAPER, 760, max_posy - 180);
    create_monster(&levels[actual_level].enemies[6], REAPER, 1320, max_posy - 180);
    create_monster(&levels[actual_level].enemies[7], REAPER, 2600, max_posy - 230);
    create_monster(&levels[actual_level].enemies[8], SKELETON_KNIGHT, 300, max_posy - 128);

Message : Did not found already existing sprite for this ennemy, creating one for id : 3
Message : Actual tile index  : 15
Message : Found ennemy not null, index : 3 i = 0
Message : Copying tile index  : 15
Message : Found ennemy not null, index : 3 i = 0
Message : Copying tile index  : 15
Message : Found ennemy not null, index : 3 i = 0
Message : Copying tile index  : 15
Message : Did not found already existing sprite for this ennemy, creating one for id : 5
Message : Actual tile index  : 31
Message : Found ennemy not null, index : 5 i = 4
Message : Copying tile index  : 31
Message : Found ennemy not null, index : 5 i = 4
Message : Copying tile index  : 31
Message : Found ennemy not null, index : 5 i = 4
Message : Copying tile index  : 31
Message : Did not found already existing sprite for this ennemy, creating one for id : 4
Message : Actual tile index  : 47
Message : Selected menu : 0

Par contre mon image est totalement glitchée et les sprites de chaque ennemi apparaissent plusieurs fois quand j’explore le VDP-Sprites de Gens What the fuck ?!?
Infitek
Infitek
Patient en incubation

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

Revenir en haut Aller en bas

Collision et Tilemap avec la SGDK - Page 4 Empty Re: Collision et Tilemap avec la SGDK

Message par Stef le Mer 24 Avr 2019 - 9:12

Quand tu utilises la méthode SPR_setVRAMTileIndex(..) (effectivement c'est bien celle-ci) alors tu dois "précharger" toutes les animations de ton sprite en VRAM avant et avoir un tableau (animTileIndexes par ex) qui référence le "tile index" de chaque frame d'animation. Ainsi quand tu veux changer de frame d'animation sur un des sprites, tu le fais en changeant son "VRAM tile index" grâce à ce tableau. (un truc du style SPR_setVRAMTileIndex(spr, animTileIndexe[frameAnim]).
La méthode que tu as utilisé ici est bien trop lourde et je pense qu'elle ne peut pas fonctionner.
Stef
Stef
Infirmier

Masculin Nombre de messages : 4747
Age : 39
Localisation : Sevres
Date d'inscription : 04/04/2007

Revenir en haut Aller en bas

Collision et Tilemap avec la SGDK - Page 4 Empty Re: Collision et Tilemap avec la SGDK

Message par Infitek le Sam 27 Avr 2019 - 20:30

J'avoue que j'ai encore du mal a visualiser, est ce qu'il y a des exemples ou des bouts de code qui font ça bien ?

En analysant la mémoire dans Ghouls and Ghost il y a des duplicatas de spriteet ça a l'air de fonctionner, mais ils sont ajoutés dans la VRAM au fur et a mesure que le joueur avance.

Par ailleurs j'essaye de faire l'effet de pluie, ça fonctionne avec VDP_fillTileMapRect(...) mais j'aimerais changer uniquement les tiles vides du plan, du coup je me demandais s'il était possible de récupérer la valeur d'un tile précis sur un PLAN ?
Infitek
Infitek
Patient en incubation

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

Revenir en haut Aller en bas

Collision et Tilemap avec la SGDK - Page 4 Empty Re: Collision et Tilemap avec la SGDK

Message par Infitek le Jeu 2 Mai 2019 - 10:21

Ou alors il faudrait que je swape les valeur des tiles vides avec celles de la pluie ?

PS : Des retrogameurs présents au Salon retro a Volx ce week end ?
Infitek
Infitek
Patient en incubation

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

Revenir en haut Aller en bas

Collision et Tilemap avec la SGDK - Page 4 Empty Re: Collision et Tilemap avec la SGDK

Message par Infitek le Lun 6 Mai 2019 - 10:44

Concernant mon problème de sprites, il est résolu.
Finalement j'ajoute mes sprites lorsque mes ennemis sont proches de la caméra, et je les libère dès qu'il sont éliminés ou qu'il sortent de l'écran, il me semble que j'avais déjà essayé cette méthode mais apparemment je m'y prenais mal.

J'ai même implémenté mon premier palette swap pour l'écran titre, reste plus qu'a voir comment je vais me débrouiller pour faire la pluie.
Infitek
Infitek
Patient en incubation

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

Revenir en haut Aller en bas

Collision et Tilemap avec la SGDK - Page 4 Empty Re: Collision et Tilemap avec la SGDK

Message par Infitek le Mar 21 Mai 2019 - 11:31

Me revoilà avec une petite question concernant les scrollings, est il possible de définir un scrolling par plan pour le PLAN_A et un scrolling par ligne pour le PLAN_B ?

VDP_setScrollingMode() applique le mode défini pour les deux plans, donc je me demandais si c'était possible d'utiliser un mode différent pour chaque Plan. scratch
Infitek
Infitek
Patient en incubation

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

Revenir en haut Aller en bas

Collision et Tilemap avec la SGDK - Page 4 Empty Re: Collision et Tilemap avec la SGDK

Message par Kannagi le Mar 21 Mai 2019 - 11:38

Les deux plan sont indépendant niveau hardware , doit y'avoir une fonction pour définir les plan de façon indépendante Wink
Kannagi
Kannagi
Patient contaminé

Masculin Nombre de messages : 589
Age : 30
Localisation : Marseille
Date d'inscription : 18/08/2014

Revenir en haut Aller en bas

Collision et Tilemap avec la SGDK - Page 4 Empty Re: Collision et Tilemap avec la SGDK

Message par Stef le Mar 21 Mai 2019 - 12:22

Et non hélas, le mode de scrolling est partagé par les 2 plans, ce qui est effectivement un peu dommage (par contre bien sur chaque plan a sa propre table de scroll).
Stef
Stef
Infirmier

Masculin Nombre de messages : 4747
Age : 39
Localisation : Sevres
Date d'inscription : 04/04/2007

Revenir en haut Aller en bas

Collision et Tilemap avec la SGDK - Page 4 Empty Re: Collision et Tilemap avec la SGDK

Message par Infitek le Mar 21 Mai 2019 - 14:18

Merci pour vos réponses, du coup j'ai mis un scrolling par ligne pour les deux plans, ça fonctionne mais j'ai un problème de vSync sur le plan A (surtout au centre de l’écran) une idée d’où ça peut venir ?
Infitek
Infitek
Patient en incubation

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

Revenir en haut Aller en bas

Collision et Tilemap avec la SGDK - Page 4 Empty Re: Collision et Tilemap avec la SGDK

Message par Stef le Mar 21 Mai 2019 - 16:43

Mon petit doigt me dit que tu dois mettre à jour la table de scroll pendant l'affichage...
L'idée c'est de la préparer en RAM et de l'envoyer pendant le VBlank via le DMA pour éviter ça.
Stef
Stef
Infirmier

Masculin Nombre de messages : 4747
Age : 39
Localisation : Sevres
Date d'inscription : 04/04/2007

Revenir en haut Aller en bas

Collision et Tilemap avec la SGDK - Page 4 Empty Re: Collision et Tilemap avec la SGDK

Message par Infitek Aujourd'hui à 10:36

Ah c'est bien possible, Ok je vais voir si je trouve des exemples, la comme ça je ne vois pas comment faire.

J'ai aussi un problème assez étrange, je vais essayer de le résumer assez brievement.
Lorsque je fais ceci :
Code:
SPR_addSprite(&jumpParticle_sprite, 0, 0, TILE_ATTR(PAL3, TRUE, FALSE, FALSE));

ça fonctionne mon sprite apparait bien, par contre lorsque je fais ça :
Code:
players[i].jumpParticle_sprite = SPR_addSprite(&jumpParticle_sprite, 0, 0, TILE_ATTR(PAL3, TRUE, FALSE, FALSE));

(Sachant que dans player.h j'ai "Sprite *jumpParticle_sprite;") Aucune erreur, le Sprite n'est apparemment pas nul, mais il ne s'affiche pas et impossible de le trouver dans le VDP...

Une dernière chose, est il possible de supprimer un sprite automatiquement lorsque sa seule et unique animation est terminée ?
Infitek
Infitek
Patient en incubation

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

Revenir en haut Aller en bas

Collision et Tilemap avec la SGDK - Page 4 Empty Re: Collision et Tilemap avec la SGDK

Message par Contenu sponsorisé


Contenu sponsorisé


Revenir en haut Aller en bas

Page 4 sur 4 Précédent  1, 2, 3, 4

Revenir en haut


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