Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.

Forum Casio - Autres questions


Index du Forum » Autres questions » Moteur de déplacement en C
Matt36230 Hors ligne Membre Points: 1888 Défis: 0 Message

Moteur de déplacement en C

Posté le 22/01/2016 23:08

Bonjour ou bonsoir à tous !

Comme l'indique le titre, je programme un petit moteur de déplacement pour mes futurs jeux.

Déjà, à tous ceux qui m'ont aidé !


Je suis actuellement en train de faire la gestion des événements en fonction de là ou on se trouve

Par contre le SH4 comptibility tool m'indique ceci : Error 2 : we found more than one KeyDown function !
Au début de usefull.c, il y a à peu près le même code que mon pote m'a passé pour rendre compatible SH4. Le problème c'est que je n'ose pas toucher à usefull parce que sinon je vais faire n'importe quoi et que si je supprime le code de mon pote les valeurs des touches ne sont plus du tout les mêmes

Aussi, lorsque l'on quitte avec EXIT qui est censé mené à la fin du main au return 0, system error.
TLB ERROR
TARGET=00056694
PC=000068CC



Si vous pouviez m'aider ce serait génial
Merci d'avance


~Les sources [mises à jour le 31/01/2016 à 17:55]~

Le code : http://hastebin.com/ohisawiraw.cs

Les sources actuels (enfin fonctionnelles \o/) sont en fichier joint.
Dès fois il y a des trucs bien moches qui ne respectent pas l'indentation et ce genre de chose. C'est normal ils sont destinés à être supprimés alors c'est pour les reconnaître


Un grand merci à Xavier59 qui à résolu mon problème !

Fichier joint


1, 2, 3 Suivante
Lephenixnoir En ligne Administrateur Points: 21388 Défis: 149 Message

Citer : Posté le 22/01/2016 23:13 | #


Le haste m'apparaît vide et le fichier... il faudrait le changer de nom.
Matt36230 Hors ligne Membre Points: 1888 Défis: 0 Message

Citer : Posté le 22/01/2016 23:15 | #


Whaaat je recommence ><

Ajouté le 22/01/2016 à 23:17 :
Fichier joint c'est bon et hastebin ne m'apparait pas vide
J'ai mis un deuxième lien
Lephenixnoir En ligne Administrateur Points: 21388 Défis: 149 Message

Citer : Posté le 22/01/2016 23:23 | #


Laisse pour le hastebin, c'est bien moi : à tous les coups le texte en reçu en https donc j'ai rien
J'ai récupéré l'archive en fichier joint, je regarde.
Matt36230 Hors ligne Membre Points: 1888 Défis: 0 Message

Citer : Posté le 22/01/2016 23:24 | #


Ok super merci Lephe !
Lephenixnoir En ligne Administrateur Points: 21388 Défis: 149 Message

Citer : Posté le 22/01/2016 23:29 | #


D'abord, la boucle (ligne 274) est mal organisée : tu devrais avoir quelque chose comme
while(1)
{
    // dessin
    // evenements
}

au lieu de dessiner une fois avant la boucle et plusieurs fois à l'intérieur. Principe DRY (Don't Repeat Yourself).

Au passage :
if(X > 1) { X = 1; }

Tu peux écrire plus simplement :
if(X > 1) X = 1;


Enlève les parties if(X != X2) et if(Y != Y2) et tout semble normal. À quoi servent donc ces conditions ?
Matt36230 Hors ligne Membre Points: 1888 Défis: 0 Message

Citer : Posté le 22/01/2016 23:34 | #


Ah oui je n'avais pas pensé à un truc aussi bête ^.^'

Je n'étais pas trop sûr que ça fonctionnait je vais faire comme ça maintenant.

Ce sont les "animations" du déplacement, ça évite qu'on ai l'impression que le personnage se téléporte.

Merci Lephe mais essaye de bouger un peu tu verras que ça va crasher
Lephenixnoir En ligne Administrateur Points: 21388 Défis: 149 Message

Citer : Posté le 22/01/2016 23:41 | #


Je peux pas tester, je suis à l'internat >_<

Sinon tu peux avoir une structure de ce type :
int distance_a_parcourir_en_x;

while(1)
{
    // dessin
    if(distance_a_parcourir_en_x != 0)
    {
        // ajuster les coordonnees du dessin et la variable
    }
    else
    {
        // evenements
        if(key == key_right) distance_a_parcourir_en_x = /* largeur d'une tile */;
    }
}

Tu vois le principe ? Ça me semble plus simple -- et souple.
Matt36230 Hors ligne Membre Points: 1888 Défis: 0 Message

Citer : Posté le 22/01/2016 23:47 | #


Ah mince >< Mais j'ai remarqué que c'était quand on allait dans un mur que ça crashait
Mais pas tout le temps c'est bizarre

En gros c'est ce que je fais mais pas dans cet ordre
-florian66- Hors ligne Ancien rédacteur Points: 2370 Défis: 20 Message

Citer : Posté le 23/01/2016 09:14 | #


J'ai jeté un coup d’œil rapide au code et tu peux optimiser pas mal ton code
Tu peux mettre toute la compatibilité dans un autre fichier source
et tes sprites aussi
In Arch, I trust ! And you ?
Matt36230 Hors ligne Membre Points: 1888 Défis: 0 Message

Citer : Posté le 23/01/2016 09:17 | #


J'y ai pensé et je vais le faire mais avant il faut que je trouve comment
Lephenixnoir En ligne Administrateur Points: 21388 Défis: 149 Message

Citer : Posté le 23/01/2016 09:22 | #


Matt36230 a écrit :
En gros c'est ce que je fais mais pas dans cet ordre

Pas vraiment : toi tu fais un tour de boucle par tile tandis que moi je fais un tour de boucle par pixel.

Je comprends à peu près tout le code mais ça nécessite un bon coup de nettoyage, tu peux beaucoup simplifier... (par exemple tu ne devrais pas avoir de variables X22 et Y22)... par expérience, je suis toujours mal à l'aise quand je me rends compte que mon code n'est pas trivial parce que c'est là que les bugs commencent à sortir.

Et fais gaffe à ton indentation, je sais parfois pas où j'en suis parce qu'il y a des lignes par indentées uniformément, des niveaux à quatre espaces et des niveaux à un... est-ce si compliqué d'être rigoureux dans l'indentation pour que tant de monde la néglige ?
Matt36230 Hors ligne Membre Points: 1888 Défis: 0 Message

Citer : Posté le 23/01/2016 09:29 | #


Oui mais mes variables X et Y vont de 1 à 16. Donc pour déplacer le personnage pixel par pixel autrement ça va être compliqué (a moins que j'ai pas compris du tout ce que tu voulais dire)

Pourquoi je ne devrais pas ? Trivial ?

l'indentation c'est ça ?
Print("quelque chose")

while (1)
{
   bla
   bla
   if (bla)
   {
      blo
      blo
   }
}


Si oui j'ai pourtant bien fait attention à le faire
Intelligide Hors ligne Membre de CreativeCalc Points: 49 Défis: 5 Message

Citer : Posté le 23/01/2016 09:39 | #


if (direction == 4) X--;
else direction = 4;


Par
if (direction == 4)
    X--;
else
    direction = 4;
Lephenixnoir En ligne Administrateur Points: 21388 Défis: 149 Message

Citer : Posté le 23/01/2016 09:42 | #


Non Intelligide, c'est pas du tout ce que je voulais dire >_<

      if (direction == 1) ML_bmp_or_cl(persoDOS, X*8-7, Y*8-15, 7, 12);
      if (direction == 2) ML_bmp_or_cl(persoDROITE, X*8-7, Y*8-15, 7, 12);
      if (direction == 3) ML_bmp_or_cl(persoFACE, X*8-7, Y*8-15, 7, 12);
      if (direction == 4) ML_bmp_or_cl(persoGAUCHE, X*8-7, Y*8-15, 7, 12);
      ML_bmp_or_cl(cadrillage, 0, 0, 128, 64); //C'est encore pour les tests, enlevez le si ça vous gène

      //Ces indications sont aussi pour les tests
       sprintf (buffer,"%d", X);
       PrintXY(2, 57,buffer,0);
       sprintf (buffer,"%d", Y);
       PrintXY(10, 57,buffer,0);


      ML_display_vram();

Les lignes au milieu ne sont pas au même niveau.

    while (1) {

     if (X != X2) {
         X2 = X2*8-7;
         if (direction == 2) X22 = X2 +7;
         if (direction == 4) X22 = X2 - 7;

Un espace ne fait pas un niveau d'indentation dans le while.

Des choses comme ça...

Et trivial ça veut dire évident, dont la compréhension est immédiate.
Matt36230 Hors ligne Membre Points: 1888 Défis: 0 Message

Citer : Posté le 23/01/2016 10:02 | #


D'accord Je n'avais pas fait attention, pourtant j'ai essayé
Lephenixnoir En ligne Administrateur Points: 21388 Défis: 149 Message

Citer : Posté le 23/01/2016 16:08 | #


Utilise des tabulations, configure l'éditeur à 4 ou 8 espaces de largeur, tu verras ça te simplifiera beaucoup la vie.
Matt36230 Hors ligne Membre Points: 1888 Défis: 0 Message

Citer : Posté le 24/01/2016 11:25 | #


Je vais faire ça merci Lephe
-florian66- Hors ligne Ancien rédacteur Points: 2370 Défis: 20 Message

Citer : Posté le 24/01/2016 11:32 | #


Pour la gestion de tes sprites, tu les mets dans un tableau dans l'ordre :

const unsigned char perso[4][taille_des_sprites_en_caractères]={
    {code_du_sprite_persoDOS},
    {code_du_sprite_persoDROITE},
    {code_du_sprite_persoFACE},
    {code_du_sprite_persoGAUCHE},
};


et tu peux faire

ML_bmp_or_cl(*(perso+direction-1), X*8-7, Y*8-15, 7, 12);


Ca permet d'enlever les if ...
In Arch, I trust ! And you ?
Kirafi Hors ligne Membre Points: 2175 Défis: 10 Message

Citer : Posté le 24/01/2016 14:57 | #


Heu ce ne serait pas plutôt (ou alors c'est pareil ?)
ML_bmp_or_cl(perso[direction-1], ... );

iPod
Pour des parties rapides
Jusqu'où pourras-tu aller dans ce jeu "partie rapide" qu'est Dextris (élu Jeu Du Mois)
Pourras-tu survivre plus de 20 secondes dans ce fameux tunnel appelé Graviton
Rebondis entre les murs en évitant les piques dans SpikeBird
Pourras-tu éviter de te faire écraser dans FallBlocs (élu Jeu Du Mois)
Autres
Franchement ils valent le coups
Deviens l'amiral de la marine dans SeaRush (jeu concours) (élu Jeu Du Mois)
La version 2048 tactile amélioré au plus haut point : 2048 Delux !
Pars à la recherche des morceaux d'étoile dans Lumyce (élu Jeu Du Mois)
Lephenixnoir En ligne Administrateur Points: 21388 Défis: 149 Message

Citer : Posté le 24/01/2016 15:00 | #


C'est pareil. C'est juste une notation de tableau qui utilise des pointeurs, c'est comme ça que le compilateur comprend l'array subscript.
1, 2, 3 Suivante

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v42 © créé par Neuronix et Muelsaco 2004 - 2022 | Il y a 81 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd