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

Forum Casio - Projets de programmation


Index du Forum » Projets de programmation » LINK! (jeu multijoueur)
Pedrobzh Hors ligne Membre Points: 478 Défis: 0 Message

LINK! (jeu multijoueur)

Posté le 28/10/2020 14:56

bonjour aujourd’hui je présente mon projet,
LINK ! est une sorte de party-game ou l'on peux jouer en solo ou a deux avec le câble 3 broche

grace a gint le jeu sera compatible sur la plupart des calculatrices (enfin j'espère )

liste des jeux:
search (annulé)
dans ce jeu, il faudra chercher un objet précis dans un lieux étrange
c'est comme among-us mais au lieux de tuer et survivre, il faudra trouver un objet

press
dans ce jeu vous vous trouverez sur une ligne et il faudra
presser la touche affiché a l’écran comme OPTN ou 6 ou DEL etc...
pour chaque touche pressé vous avancerez de quelques pixels,
le premier que arrive a la bordure droite de l’écran gagnera
morpion
rien de plus basic qu'un morpion

roket
dans ce jeu vous serez dans un tableau fixe avec un lance-roquettes vous vous déplacerez dans 4 sens
mais vous pourriez tirer que a droite ou a gauche le premier coup sera fatal

IMAGES:








VERSIONS:
version test 1
version test 1

https://www.planet-casio.com/Fr/programmes/programme4114-1-link-version-test-1-pedrobzh-jeux-add-ins.html
compatible toute graph monochrome sh4 (graph 35+E II inclus)
après 2 semaine la première version est disponible,
elle contient:
-les déplacements du futur jeu roket
-un debug mode
-des animations
-des mouvements fluides

bon test



Fichier joint


Lephenixnoir Hors ligne Administrateur Points: 19605 Défis: 142 Message

Citer : Posté le 30/10/2020 16:27 | #


Ah c'est un problème de name mangling. Les en-têtes de gint ne sont pas gardés avec le extern "C", mais tu peux t'en sortir sans trop de difficultés.

extern "C" {
#include <gint/keyboard.h>
#include <gint/display.h>
}

Tu peux trouver facilement des infos sur ce problème avec les termes que je t'ai donnés.
Pedrobzh Hors ligne Membre Points: 478 Défis: 0 Message

Citer : Posté le 30/10/2020 16:55 | #


a oui... j'ai déjà utilisé ça avec lua 5.1

Ajouté le 30/10/2020 à 16:56 :
en effet ça marche, mes projets vont aller plus vite
(au sens que j'airais moins de problèmes)
pensés suicidaires sue a des programmes qui marche pas
   20%
Lephenixnoir Hors ligne Administrateur Points: 19605 Défis: 142 Message

Citer : Posté le 30/10/2020 16:59 | #


Tant mieux si ça aide ! Normalement le runtime C++ est pas trop exigeant, mais si tu vois des bugs du genre « constructeurs pas appelés pour des objets globaux » qui semblent contrevenir aux règles de C++ il se peut qu'un ajout dans gint soit nécessaire. Dans ce cas je regarderai.

Ah oui, les exceptions ne marcheront pas je pense.
Pedrobzh Hors ligne Membre Points: 478 Défis: 0 Message

Citer : Posté le 30/10/2020 17:30 | #


c'est pas grave j'ai jamais utilisé les exceptions en c++

Ajouté le 30/10/2020 à 18:18 :
le jeu avance j'ai converti mon programme en c++, mais le joueur ne s'affiche plus!

extern "C" {
#include <gint/display.h>
#include <gint/keyboard.h>
#include <gint/timer.h>
#include <gint/clock.h>
}
extern bopti_image_t img_player;

class Animation{
    public:
    int frame_1;
    int frame_2;
    int frame_3;
    int frame_4;
    int frame_5;

    int get_data(int frame){
        int f;
        if(frame==0){f=frame_1;}
        if(frame==1){f=frame_2;}
        if(frame==2){f=frame_3;}
        if(frame==3){f=frame_4;}
        if(frame==4){f=frame_5;}
        return f;
    }

};

class Player{
    public:
    /* Position in map */
    int x, y;
    /* Direction currently facing */
    int dir;// 0: left, 1: right
    //int animdata[10][5][2];
    Animation anim_walk_left;
    Animation anim_walk_right;
    /* Animation and frame */

    Animation anim_playing;
    int twait;
    int frame;
    int anim;
    int status; //1: normal, 2: roket, 3: code manipulation

    void init(){
        anim_walk_right  = {0,1,2,3,4};
        anim_walk_left = {5,6,7,8,9};
        anim_playing = anim_walk_right;
        status = 1;
        dir = 1;
    }

    void check_anim(){
        if(status==1){
            if(dir==0){anim_playing = anim_walk_left;}
            if(dir==1){anim_playing = anim_walk_right;}
        }
        if(twait == 15){
            twait = 0;
            frame = frame + 1;
            if(frame > 4){
                frame = 0;
            }
        }
        twait = twait + 1;
        anim = anim_playing.get_data(frame);
    }
    void print(){
        dsubimage(x, y,&img_player,0,anim*12,11, 11, DIMAGE_NONE);
    }
};






//int opt = GETKEY_DEFAULT & GETKEY_REP_ARROWS;


int select = 1;

int main(void){
    extern bopti_image_t img_logo;
    extern bopti_image_t img_button;
    int playing = 1;
    int key = 0;
    Player player;
    player.init();
    int opt = GETKEY_DEFAULT & ~GETKEY_REP_ARROWS & GETKEY_MENU;


    while(playing==1){
        while(key != KEY_SHIFT){
            dclear(C_WHITE);
            dimage(25, 3, &img_logo);
            //dsubimage(40, 40,&img_player,0* 11, 0, 11, 11, DIMAGE_NONE);

            if(select==1){dsubimage(35, 33,&img_button,0, 10, 42, 10, DIMAGE_NONE);}
            else{dsubimage(35, 33,&img_button,0, 0, 42, 10, DIMAGE_NONE);}

            if(select==2){dsubimage(35, 45,&img_button,0, 30, 42, 10, DIMAGE_NONE);}
            else{dsubimage(35, 45,&img_button,0, 20, 42, 10, DIMAGE_NONE);}
            dupdate();
            key = getkey_opt(opt, NULL).key;
            if(key == KEY_UP){select=1;}
            if(key == KEY_DOWN){select=2;}

        }
        while(1==1){
            dclear(C_WHITE);
            player.check_anim();
            player.print();
            dupdate();
            key = getkey_opt(opt, NULL).key;
            if(key == KEY_RIGHT){player.x = player.x + 2;}
            if(key == KEY_LEFT){player.x = player.x - 2;}
            if(key == KEY_UP){player.y  = player.y - 2;}
            if(key == KEY_DOWN){player.y = player.y + 2;}
        }
    }
    return 1;
}

pensés suicidaires sue a des programmes qui marche pas
   20%
Lephenixnoir Hors ligne Administrateur Points: 19605 Défis: 142 Message

Citer : Posté le 30/10/2020 18:19 | #


Beau travail ! As-tu réduit le code ? Vérifié que l'appel à dsubimage() est appelé ? Qu'elle est appelée avec des paramètres qui sont dans les bornes de l'image ? etc etc.
Pedrobzh Hors ligne Membre Points: 478 Défis: 0 Message

Citer : Posté le 30/10/2020 18:22 | # | Fichier joint


oui tout est bon

voici l'image en fichier joint
pensés suicidaires sue a des programmes qui marche pas
   20%
Lephenixnoir Hors ligne Administrateur Points: 19605 Défis: 142 Message

Citer : Posté le 30/10/2020 18:25 | #


Alors si c'est bon écris un mini-programme qui affiche cette image toute seule avec les mêmes coordonnées et les mêmes valeurs que dans le gros programme ci-dessus, et soumets un rapport de bug à gint.
Pedrobzh Hors ligne Membre Points: 478 Défis: 0 Message

Citer : Posté le 30/10/2020 18:26 | #


ok...

Ajouté le 31/10/2020 à 14:17 :
je fais pause sur le développement car je fais des trucks mais ça marche pas ! J'en ai juste marre pour l'instant

Ajouté le 01/11/2020 à 16:26 :
j'ai bien testé dsubimage et il marche plus...
pensés suicidaires sue a des programmes qui marche pas
   20%
Lephenixnoir Hors ligne Administrateur Points: 19605 Défis: 142 Message

Citer : Posté le 01/11/2020 16:34 | #


Encore une fois, c'est tout à fait possible, mais je ne peux tester que si tu me fournis ton appel exact, du genre

dsubimage(10, 34, &img_player, 0, 0, 11, 11, DIMAGE_NONE);

Avec une copie de l'image.
Pedrobzh Hors ligne Membre Points: 478 Défis: 0 Message

Citer : Posté le 01/11/2020 16:38 | # | Fichier joint


x = 0;
y = 0;
anim = 0;
dsubimage(x, y,&img_player,0,anim*12,11, 11, DIMAGE_NONE);

pensés suicidaires sue a des programmes qui marche pas
   20%
Lephenixnoir Hors ligne Administrateur Points: 19605 Défis: 142 Message

Citer : Posté le 01/11/2020 16:44 | # | Fichier joint


Merci ! Ça c'est super utile, ça me permet de tester immédiatement et de m'attaquer au bug s'il y en a un. Pour l'instant j'ai testé dans un add-in vide et ça marche de mon côté (j'ai bien le joueur qui s'affiche). Projet ci-joint. Qu'est-ce que tu observes et qu'est-ce que tu voudrais observer ? Est-ce que tu as bien appelé dupdate() à la fin ?

PS. Je te l'ai déjà dit mais les GIFs tordus ne sont pas bienvenus en avatars.
Pedrobzh Hors ligne Membre Points: 478 Défis: 0 Message

Citer : Posté le 01/11/2020 18:05 | #


Lephenixnoir a écrit :
Est-ce que tu as bien appelé dupdate() à la fin ?

apeller?
pensés suicidaires sue a des programmes qui marche pas
   20%
Tituya Hors ligne Rédacteur Points: 1595 Défis: 16 Message

Citer : Posté le 01/11/2020 18:12 | #


dupdate();


Permet de mettre à jour l'écran de ta calculatrice. Pour par exemple afficher une image
Tu as juste besoin de le mettre à la fin de ta boucle par exemple.
Bretagne > Reste du globe
(Et de toute façon, vous pouvez pas dire l'inverse grâce à Bzh)



Pedrobzh Hors ligne Membre Points: 478 Défis: 0 Message

Citer : Posté le 01/11/2020 18:20 | #


oui je l'ai mis, voici mon code
extern "C" {
#include <gint/display.h>
#include <gint/keyboard.h>
#include <gint/timer.h>
#include <gint/clock.h>
}
extern bopti_image_t img_player;

class Animation{
    public:
    int frame_1;
    int frame_2;
    int frame_3;
    int frame_4;
    int frame_5;

    int get_data(int frame){
        int f;
        if(frame==0){f=frame_1;}
        if(frame==1){f=frame_2;}
        if(frame==2){f=frame_3;}
        if(frame==3){f=frame_4;}
        if(frame==4){f=frame_5;}
        return f;
    }

};

class Player{
    public:
    /* Position in map */
    int x, y;
    /* Direction currently facing */
    int dir;// 0: left, 1: right
    //int animdata[10][5][2];
    Animation anim_walk_left;
    Animation anim_walk_right;
    /* Animation and frame */

    Animation anim_playing;
    int twait;
    int frame;
    int anim =0;
    int status; //1: normal, 2: roket, 3: code manipulation

    void init(){
        anim_walk_right  = {0,1,2,3,4};
        anim_walk_left = {5,6,7,8,9};
        anim_playing = anim_walk_right;
        status = 1;
        dir = 1;
    }

    void check_anim(){
        if(status==1){
            if(dir==0){anim_playing = anim_walk_left;}
            if(dir==1){anim_playing = anim_walk_right;}
        }
        if(twait == 15){
            twait = 0;
            frame = frame + 1;
            if(frame > 4){
                frame = 0;
            }
        }
        twait = twait + 1;
        anim = anim_playing.get_data(frame);
    }
    void print(){
        dsubimage(x, y,&img_player,0,anim*12,11, 11, DIMAGE_NONE);
    }
};

int select = 1;

int main(void){
    extern bopti_image_t img_logo;
    extern bopti_image_t img_button;
    int playing = 1;
    int key = 0;
    Player player;
    player.init();
    int opt = GETKEY_DEFAULT & ~GETKEY_REP_ARROWS & GETKEY_MENU;


    while(playing==1){
        while(key != KEY_SHIFT){
            dclear(C_WHITE);
            dimage(25, 3, &img_logo);
            //dsubimage(40, 40,&img_player,0* 11, 0, 11, 11, DIMAGE_NONE);

            if(select==1){dsubimage(35, 33,&img_button,0, 10, 42, 10, DIMAGE_NONE);}
            else{dsubimage(35, 33,&img_button,0, 0, 42, 10, DIMAGE_NONE);}

            if(select==2){dsubimage(35, 45,&img_button,0, 30, 42, 10, DIMAGE_NONE);}
            else{dsubimage(35, 45,&img_button,0, 20, 42, 10, DIMAGE_NONE);}
            dupdate();
            key = getkey_opt(opt, NULL).key;
            if(key == KEY_UP){select=1;}
            if(key == KEY_DOWN){select=2;}

        }
        if(select==1){
            while(key != KEY_SHIFT){
                dclear(C_WHITE);key = getkey_opt(opt, NULL).key;
                dsubimage(20, 15,&img_button,0, 50, 42, 10, DIMAGE_NONE);
                dupdate();
                key = getkey_opt(opt, NULL).key;
            }

            while(1==1){
                player.check_anim();

                dclear(C_WHITE);
                player.print();
                dupdate();

                key = getkey_opt(opt, NULL).key;
                if(key == KEY_RIGHT){player.x = player.x + 2;}
                if(key == KEY_LEFT){player.x = player.x - 2;}
                if(key == KEY_UP){player.y  = player.y - 2;}
                if(key == KEY_DOWN){player.y = player.y + 2;}
            }
        }
        if(select==2){
            while(1==1){
                dclear(C_WHITE);
                player.print();
                dupdate();
            }
        }
    }
    return 1;
}

pensés suicidaires sue a des programmes qui marche pas
   20%
Lephenixnoir Hors ligne Administrateur Points: 19605 Défis: 142 Message

Citer : Posté le 01/11/2020 18:31 | #


Pas ton code complet, ton code minimal ! Celui où les coordonnées sont explicites.
Pedrobzh Hors ligne Membre Points: 478 Défis: 0 Message

Citer : Posté le 01/11/2020 20:44 | #


ça va être un peu dur toutes le fonctions que j'ai crée c'est pour les graphismes, mais je vais essayer de supprimer les boucles dans le main...

Ajouté le 01/11/2020 à 20:45 :
extern "C" {
#include <gint/display.h>
#include <gint/keyboard.h>
#include <gint/timer.h>
#include <gint/clock.h>
}
extern bopti_image_t img_player;

class Animation{
    public:
    int frame_1;
    int frame_2;
    int frame_3;
    int frame_4;
    int frame_5;

    int get_data(int frame){
        int f;
        if(frame==0){f=frame_1;}
        if(frame==1){f=frame_2;}
        if(frame==2){f=frame_3;}
        if(frame==3){f=frame_4;}
        if(frame==4){f=frame_5;}
        return f;
    }

};

class Player{
    public:
    /* Position in map */
    int x, y;
    /* Direction currently facing */
    int dir;// 0: left, 1: right
    //int animdata[10][5][2];
    Animation anim_walk_left;
    Animation anim_walk_right;
    /* Animation and frame */

    Animation anim_playing;
    int twait;
    int frame;
    int anim =0;
    int status; //1: normal, 2: roket, 3: code manipulation

    void init(){
        anim_walk_right  = {0,1,2,3,4};
        anim_walk_left = {5,6,7,8,9};
        anim_playing = anim_walk_right;
        status = 1;
        dir = 1;
    }

    void check_anim(){
        if(status==1){
            if(dir==0){anim_playing = anim_walk_left;}
            if(dir==1){anim_playing = anim_walk_right;}
        }
        if(twait == 15){
            twait = 0;
            frame = frame + 1;
            if(frame > 4){
                frame = 0;
            }
        }
        twait = twait + 1;
        anim = anim_playing.get_data(frame);
    }
    void print(){
        dsubimage(x, y,&img_player,0,anim*12,11, 11, DIMAGE_NONE);
    }
};

int select = 1;

int main(void){
    extern bopti_image_t img_logo;
    extern bopti_image_t img_button;
    int playing = 1;
    int key = 0;
    Player player;
    player.init();
    int opt = GETKEY_DEFAULT & ~GETKEY_REP_ARROWS & GETKEY_MENU;
    while(1==1){
                player.check_anim();

                dclear(C_WHITE);
                player.print();
                dupdate();

                key = getkey_opt(opt, NULL).key;
                if(key == KEY_RIGHT){player.x = player.x + 2;}
                if(key == KEY_LEFT){player.x = player.x - 2;}
                if(key == KEY_UP){player.y  = player.y - 2;}
                if(key == KEY_DOWN){player.y = player.y + 2;}
       }
    
    return 1;
}

pensés suicidaires sue a des programmes qui marche pas
   20%
Kbd2 Hors ligne Membre Points: 239 Défis: 0 Message

Citer : Posté le 01/11/2020 20:55 | #


Do you set the player's position to (0, 0) in Player::init? Player.x and Player.y aren't guaranteed to be 0 if you only declare them.
Pedrobzh Hors ligne Membre Points: 478 Défis: 0 Message

Citer : Posté le 02/11/2020 07:36 | #


je vais tester,mais voici la compilation:
pierre@pc-deb-799:~/opt/sh-elf-2.32-9.2.0/link$ fxsdk build-fx

:: Making into build-fx

sh-elf-g++ -c src/main.c -o build-fx/src/main.c.o -mb -ffreestanding -nostdlib -fstrict-volatile-bitfields -Wall -Wextra -Wno-missing-field-initializers -Os -D FX9860G -m3 -I include -MMD -MT build-fx/src/main.c.o -MF build-fx/src/main.c.d -MP
src/main.c: In function 'int main()':
src/main.c:68:14: warning: 'f' may be used uninitialized in this function [-Wmaybe-uninitialized]
   68 |         anim = anim_playing.get_data(frame);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/main.c:18:13: note: 'f' was declared here
   18 |         int f;
      |             ^
fxconv --bopti-image assets-fx/img/player.png -o build-fx/assets/img/player.png.o --fx --toolchain=sh-elf name:img_player
sh-elf-g++ -o build-fx/link.elf build-fx/src/main.c.o build-fx/assets/img/button.png.o build-fx/assets/img/logo.png.o build-fx/assets/img/player.png.o -mb -ffreestanding -nostdlib -fstrict-volatile-bitfields -Wall -Wextra -Wno-missing-field-initializers -Os -D FX9860G -m3 -I include  -T fx9860g.ld -lgint-fx  -lgint-fx -lgcc -Wl,-Map=build-fx/map
sh-elf-objcopy -O binary -R .bss -R .gint_bss build-fx/link.elf build-fx/link.bin
fxg1a build-fx/link.bin -o link.g1a -i "assets-fx/icon-fx.png" -n "link" --internal="@link"


Ajouté le 02/11/2020 à 08:02 :
après test, l'affichage isolé marche, mais pas dans la boucle de déplacement
pensés suicidaires sue a des programmes qui marche pas
   20%
Lephenixnoir Hors ligne Administrateur Points: 19605 Défis: 142 Message

Citer : Posté le 02/11/2020 14:45 | #


après test, l'affichage isolé marche, mais pas dans la boucle de déplacement

Voilà qui progresse significativement ! Tu as un warning sur une variable non initialisée, a priori sans rapport, mais pense à t'en défaire.

As-tu affiché les coordonnées où tu affiches ton joueur à l'écran ? Tu peux le faire de façon un peu bourrinne comme ceci :

     void print(){
        dsubimage(x, y,&img_player,0,anim*12,11, 11, DIMAGE_NONE);
        dprint(1, 50, C_BLACK, "x=%d y=%d", x, y);
    }
Pedrobzh Hors ligne Membre Points: 478 Défis: 0 Message

Citer : Posté le 02/11/2020 18:08 | #


ok je vais tester

Ajouté le 02/11/2020 à 18:24 :
j'essaye de le faire mais j'arrive pas a convertir mes int en const char * pour les afficher

Ajouté le 03/11/2020 à 07:29 :
le bug est trouvé, la variable anim est dans les 210000
mais je ne comprends pas pourquoi
(peu-être dans l'initialisation des valeurs de l'animation right)
pensés suicidaires sue a des programmes qui marche pas
   20%
Lephenixnoir Hors ligne Administrateur Points: 19605 Défis: 142 Message

Citer : Posté le 03/11/2020 09:26 | #


Pedrobzh a écrit :
j'essaye de le faire mais j'arrive pas a convertir mes int en const char * pour les afficher

C'est un problème classique. Et le premier conseil que je peux donner c'est de ne jamais dire "convertir" parce que dès qu'on prononce ce mot magique on se fait aveugler par l'idée que ça doit être simple, automatique, et bijectif. Et souvent ce n'est pas le cas.

Tu as un int qui est un nombre encodé en base 2 sur 4 octets. Tu veux un const char * qui pointe vers une zone de mémoire contenant une représentation textuelle de cet entier en base 10, sur autant d'octets qu'il y a de chiffres, avec un octet 0 à la fin (pour indiquer la fin du texte).

Tu n'es pas obligé de comprendre tout ce qui se passe, mais tu dois remarquer que :
1. On passe de la base 2 à la base 10.
2. Il faut obtenir ou fournir de la mémoire pour stocker le texte.
3. On passe de 4 octets à un nombre variable (entre 2 et 12 selon le nombre de chiffres dans le résultat).

Toutes ces différences te montrent que cette action de représenter un entier par du texte est difficile et donc ça ne peut pas être automatique comme en écrivant juste (const char *)mon_entier (ce qui est faux).

Si tu as déjà codé en C tu sauras que la fonction printf() sait faire cette représentation, avec ses formats qui ressemblent à "x=%d" où le %d se fait remplacer par la représentation textuelle d'en entier.

gint n'as pas de terminal mais il y a une fonction dprint() qui fait pareil, et je t'ai montré à l'instant comment t'en servir pour afficher des entiers :

dprint(1, 50, C_BLACK, "x=%d y=%d", x, y);

le bug est trouvé, la variable anim est dans les 210000

Bravo ! Voilà en quoi ça consiste, le debuggage : vérifier progressivement que tout se comporte correctement jusqu'à isoler quelque chose qui ne marche pas.

Voilà un indice : l'attribut frame de ton animation n'est pas initialisé, donc ton anim_playing.get_data(frame) non plus puisque dans cette méthode tu déclares une variable f mais comme frame ne vaut ni 1, ni 2, ni 3, ni 4, ni 5, tu renvoies f sans l'initialiser, et ça devient ta nouvelle valeur de anim.

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 - 2021 | Il y a 33 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