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 » RPG OpenWorld Online
Farhi Hors ligne Membre Points: 980 Défis: 0 Message

RPG OpenWorld Online

Posté le 17/02/2023 00:34

Bonjour tout le monde !
Ça faisait longtemps n'est-ce pas ? Je me suis absenté pendant un moment et je reviens vers vous avec du lourd ! Du très très lourd !

aparté
Cliquer pour enrouler

Petite aparté, non, le projet ParticuleEngine n'est pas mort. J'y travaille toujours, mais avec mes études qui prennent tout mon temps, c'est compliqué d'avancer dessus. Mais dites-vous qu'il y a eu pas mal de travail dessus, c'est juste que je n'ai rien montré pour l'instant. Mais revenons au cœur de ce projet.


Je vais commencer mon introduction en vous injectant une idée toute simple :
Et si on pouvait créer un jeu où tout le monde pourrait le modifier, rajouter des quêtes en temps réel, éditer la carte et jouer en multijoueur dessus, etc. En gros, un Zelda/Dofus/World of Warcraft modifiable par la communauté et validé par la communauté. Autrement dit : un RPG Maker Online.

Pour couronner le tout, imaginons que ce jeu soit multiplateforme, compatible avec les Casio, la Nintendo DS, 3DS, WII, Switch, PSP, Windows, Linux, Android, etc., afin de créer la fusion entre toutes les communautés existantes et de donner une seconde vie à ces anciennes consoles (et aussi les récentes).

Vous en pensez quoi ? Trop ambitieux ? Laissez-moi vous montrer que ce n'est pas si compliqué que ça si tout le monde rajoute sa pierre à l'édifice.

Vous voulez des preuves que c'est faisable, n'est-ce pas ? Et bien, je vais vous en donner !

Il y a un moment, j'ai créé un topic où j'ai montré que j'avais recréé RPG Maker ici. Vous vous en doutez, c'est sur cette base que ce projet repose. Car j'ai refait 80% de RPG Maker, ça m'a pris du temps, mais ça fonctionne !

De plus, j'ai non seulement créé le mode « joueur » mais aussi le mode éditeur ! Ce qui veut dire qu'on peut techniquement créer des cartes sur Casio (même si pour l'instant je l'ai fait que sur Windows, mais bon tkt).


Et enfin, est-ce que vous connaissez devkitpro ? En gros, c'est une giga librairie qui permet de créer des programmes pour la DS, 3DS, Switch, wii, etc. Et il y a aussi pspsdk pour la PSP. Bref ! Vous avez compris là où je voulais en venir… Mais vous savez quoi ? Bah en fait, j'ai adapté ParticuleEngine pour qu'il puisse compiler sur tous ces supports. C'est bon pour vous ? (En vrai, il me reste à faire quelques ajustements, mais c'est bon trql).
Grosso modo, t'as un code source, mais genre un seul vraiment, et ça compile pour toutes les versions. Miam ! La petite dose de dopamine de satisfaction !

Mais là, vous vous dites : « Mais Farhi ! Comment vas-tu faire pour le mode Online sur Casio ? »
Sur ce, je vais vous répondre : Le port 3-pin ! (En vérité, j'ai prévu d'autres alternatives aussi).

Revenons un peu plus en détail sur l'idée. Ce projet est en d'autres termes une sorte de GitHub version jeu vidéo, c'est-à-dire que si tu veux créer une quête, étendre la carte, créer des donjons, etc., et bien tu peux ! Cela créera une sorte de branche dans le projet principal. Cependant, pour éviter que les gens fassent n'importe quoi, un vote sera organisé, par exemple tous les mois, pour valider une modification et ainsi fusionner ta branche avec la branche principale du projet. C'est donc un projet fait par la communauté pour la communauté et validé par celle-ci !

C'est donc, vous l'aurez compris, un jeu open world (puisque l'on peut étendre la carte). C'est le « nouveau Minecraft » version RPG.

Voilà ! Toutefois, ce que je vais dire est très important. Ce projet est un très gros projet. Je vous le dis directement, je ne pourrai pas le faire seul. Donc soit il y a des gens qui sont motivés pour faire naître ce projet, soit je l'enterre directement. Car seul, ce n'est pas possible, et de plus, c'est un projet communautaire. De plus, je vais publier toutes les sources du projet. Il sera donc open source.

Par exemple, j'aurais besoin de personnes qui m'aident à refaire les Tilesets de RPG Maker pour qu'on n'ait pas de problème de copyright et que le jeu ait sa propre identité. J'aurais aussi besoin de personnes qui m'aident pour la partie « serveur » et « fusion » (fusion des branches et structure d'envoi des modifications/push).
Moi, je m'engage à faire la partie programmation du jeu lui-même, c'est-à-dire ses mécaniques, compatibilité, système de base, mode éditeur, etc. Mais pour tout le reste, j'aurai besoin d'aide.

De plus, n'hésitez pas à ramener des gens venant des communautés de dev DS, 3DS, etc.
Voilà ! J'ai terminé d'expliquer mon idée, j'attends vos retours pour savoir si ce projet peut naître ou si je l'enterre dès maintenant .


Farhi Hors ligne Membre Points: 980 Défis: 0 Message

Citer : Posté le 04/03/2023 13:07 | #


D'accord j'ai changé la boucle.
La teinte est simplement une multiplication de couleur avec le pixel de l'image et la couleur passé en paramètre.
"La créativité est contagieuse faites la tourner"
Albert Einstein
Lephenixnoir Hors ligne Administrateur Points: 22987 Défis: 149 Message

Citer : Posté le 04/03/2023 13:10 | #


"simplement" haha si tu savais la complexité que ça représente. xD

Le système d'effets dynamiques ne supporte que des transformations plutôt simples qui ne nécessitent pas de mémoire supplémentaire et impactent peu les performances ; tu n'auras pas donc d'option ici. Je te conseille de refaire une boucle comme la précédente.

Note que si tu veux améliorer la boucle en question, tu as une option assez facile : calcule à l'avance le clipping (ie. quelle portion du dessin va tenir à l'écran) et limite les boucles à l'intervalle approprié. Comme ça tu pourrais remplacer dpixel(x+col, y+row, color) par gint_vram[(y+row)*DWIDTH+(x+col)] = color, ce qui donnera un coup de boost sensible.
Farhi Hors ligne Membre Points: 980 Défis: 0 Message

Citer : Posté le 04/03/2023 13:21 | #


Pas facile de coder de façon optimisé sur calculatrice
Ok je prend note.
J'ai deux dernière question pour terminer le system de base du jeu.
1- Est-ce qu'il y a moyen de récupérer le fps et si oui quel est la fonction ?
2- J'aimerai récupérer les lettre du "clavier" quelque chose dans le style de :

char keydownchar()
{
return 0 //si aucune touche n'est pressé ou n'est pas une lettre
return lettre //si c'est une lettre
}

Est-ce qu'il y a moyen de le faire simplement (ou peut-être qu'elle existe déjà) ou je suis obligé de faire un switch ?
"La créativité est contagieuse faites la tourner"
Albert Einstein
Lephenixnoir Hors ligne Administrateur Points: 22987 Défis: 149 Message

Citer : Posté le 04/03/2023 13:25 | #


1- Est-ce qu'il y a moyen de récupérer le fps et si oui quel est la fonction ?

C'est très vague dis comme ça ! Tu peux mesurer le temps que prend chaque frame de la façon suivante avec libprof :

#include <libprof.h>

main(...) {
    // initialisation de libprof
    prof_init();
    prof_t compteur_FPS;

    // ta boucle principale
    while(...) {
        compteur_FPS = prof_make();
        prof_enter(compteur_FPS);

        // le code de ton jeu

        prof_leave(compteur_FPS);
        int duree_frame_us = prof_time(compteur_FPS);
    }

    prof_quit();
}

duree_frame_us sera la durée du frame en microsecondes. Si tu divises 1000000 par ça tu auras un nombre de FPS approximé. Mais généralement tu veux mesurer les FPS sur 3/4 frames consécutifs pour ne pas que la mesure fasse trop des dents de scie.

2- J'aimerai récupérer les lettre du "clavier" (...)

Ah je l'ai pas dans gint celle-là. Tu peux t'inspirer de celle-ci de JustUI si tu veux (ça te renvoie le caractère associé pour une touche avec ou sans shift/alpha).
Farhi Hors ligne Membre Points: 980 Défis: 0 Message

Citer : Posté le 04/03/2023 14:43 | #


j'ai cette erreur là :
Alors que j'ai installé libprof et que j'ai inclut l'en-tête

/root/.local/share/fxsdk/sysroot/lib/gcc/sh3eb-elf/11.1.0/../../../../sh3eb-elf/bin/ld: CMakeFiles/myaddin.dir/src/ParticuleEngine/ParticuleEngine.c.obj: in function `_PC_Init':
ParticuleEngine.c:(.text+0x40): undefined reference to `_prof_init'
/root/.local/share/fxsdk/sysroot/lib/gcc/sh3eb-elf/11.1.0/../../../../sh3eb-elf/bin/ld: CMakeFiles/myaddin.dir/src/ParticuleEngine/ParticuleEngine.c.obj: in function `_PC_Quit':
ParticuleEngine.c:(.text+0x64): undefined reference to `_prof_quit'
/root/.local/share/fxsdk/sysroot/lib/gcc/sh3eb-elf/11.1.0/../../../../sh3eb-elf/bin/ld: CMakeFiles/myaddin.dir/src/ParticuleEngine/ParticuleEngine.c.obj: in function `_GetFPS':
ParticuleEngine.c:(.text+0xcc): undefined reference to `_prof_tcnt'
/root/.local/share/fxsdk/sysroot/lib/gcc/sh3eb-elf/11.1.0/../../../../sh3eb-elf/bin/ld: ParticuleEngine.c:(.text+0xd0): undefined reference to `_prof_time'

"La créativité est contagieuse faites la tourner"
Albert Einstein
Lephenixnoir Hors ligne Administrateur Points: 22987 Défis: 149 Message

Citer : Posté le 04/03/2023 15:05 | #


Ah oui oups j'ai oublié de préciser qu'il faut lier avec dans le CMakeLists.txt.

# au début
find_package(LibProf 2.1 REQUIRED)
# dans le target_link_libraries, rajouter libprof juste après PRIVATE :
target_link_libraries(myaddin PRIVATE LibProf::LibProf ...)
Farhi Hors ligne Membre Points: 980 Défis: 0 Message

Citer : Posté le 04/03/2023 23:30 | #


Hey Hey Hey !
J'ai enfin finis de faire les "bases" du moteur (la gestion des tilesets RPG Maker et le système d'interface).
Le système d'interface est très complexe car il gère absolument tout de façon automatique ce qui rend sont utilisation extrêmement simple !
Voici une petite démo.
(Je sais, le texte sur DS à un soucis, ça va être réglé plus tard)


"La créativité est contagieuse faites la tourner"
Albert Einstein
Lephenixnoir Hors ligne Administrateur Points: 22987 Défis: 149 Message

Citer : Posté le 05/03/2023 08:56 | #


Impressionnant ! Ce multi-plateforme est certifié badass, tu as toute mon attention :3

Le système d'interface est très complexe car il gère absolument tout de façon automatique ce qui rend sont utilisation extrêmement simple !

Plus précisément "absolument tout" ça fait rentrer quoi ?
Slyvtt Hors ligne Community Manager Points: 1057 Défis: 0 Message

Citer : Posté le 05/03/2023 09:52 | #


C’est vraiment la classe Farhi. Bravo !!!
------------------------------------------------------------------
Le monde est dangereux à vivre ! Non pas tant à cause de ceux qui font le mal, mais à cause de ceux qui regardent et laissent faire.
-------------------------------------------------------------------
Albert Einstein
Mathématicien, Physicien, Scientifique (1879 - 1955)
Inikiwi Hors ligne Membre Points: 462 Défis: 0 Message

Citer : Posté le 05/03/2023 13:11 | #


#include "keyboard.h"

uint8_t keyboard_wait_b_done = 0;
uint8_t keyboard_wait_b(keys_t* keys){
    if(keys->b == 1 && keyboard_wait_b_done==0){
        keyboard_wait_b_done = 1;
        return 0;
    }
    else if(keys->b == 0 && keyboard_wait_b_done==1){
        keyboard_wait_b_done = 0;
        return 1;
    }
    return 0;
}

uint8_t keyboard_wait_a_done = 0;
uint8_t keyboard_wait_a(keys_t* keys){
    if(keys->a == 1 && keyboard_wait_a_done==0){
        keyboard_wait_a_done = 1;
        return 0;
    }
    else if(keys->a == 0 && keyboard_wait_a_done==1){
        keyboard_wait_a_done = 0;
        return 1;
    }
    return 0;
}

uint8_t keyboard_wait_left_done = 0;
uint8_t keyboard_wait_left(keys_t* keys){
    if(keys->left == 1 && keyboard_wait_left_done==0){
        keyboard_wait_left_done = 1;
        return 0;
    }
    else if(keys->left == 0 && keyboard_wait_left_done==1){
        keyboard_wait_left_done = 0;
        return 1;
    }
    return 0;
}

uint8_t keyboard_wait_right_done = 0;
uint8_t keyboard_wait_right(keys_t* keys){
    if(keys->right == 1 && keyboard_wait_right_done==0){
        keyboard_wait_right_done = 1;
        return 0;
    }
    else if(keys->right == 0 && keyboard_wait_right_done==1){
        keyboard_wait_right_done = 0;
        return 1;
    }
    return 0;
}

uint8_t keyboard_wait_up_done = 0;
uint8_t keyboard_wait_up(keys_t* keys){
    if(keys->up == 1 && keyboard_wait_up_done==0){
        keyboard_wait_up_done = 1;
        return 0;
    }
    else if(keys->up == 0 && keyboard_wait_up_done==1){
        keyboard_wait_up_done = 0;
        return 1;
    }
    return 0;
}

uint8_t keyboard_wait_down_done = 0;
uint8_t keyboard_wait_down(keys_t* keys){
    if(keys->down == 1 && keyboard_wait_down_done==0){
        keyboard_wait_down_done = 1;
        return 0;
    }
    else if(keys->down == 0 && keyboard_wait_down_done==1){
        keyboard_wait_down_done = 0;
        return 1;
    }
    return 0;
}

uint8_t keyboard_wait_select_done = 0;
uint8_t keyboard_wait_select(keys_t* keys){
    if(keys->select == 1 && keyboard_wait_select_done==0){
        keyboard_wait_select_done = 1;
        return 0;
    }
    else if(keys->select == 0 && keyboard_wait_select_done==1){
        keyboard_wait_select_done = 0;
        return 1;
    }
    return 0;
}

uint8_t keyboard_wait_start_done = 0;
uint8_t keyboard_wait_start(keys_t* keys){
    if(keys->start == 1 && keyboard_wait_start_done==0){
        keyboard_wait_start_done = 1;
        return 0;
    }
    else if(keys->start == 0 && keyboard_wait_start_done==1){
        keyboard_wait_start_done = 0;
        return 1;
    }
    return 0;
}

ci cela peux aider... ce code provient d'un projet abandonné.
Farhi Hors ligne Membre Points: 980 Défis: 0 Message

Citer : Posté le 05/03/2023 14:23 | #


Merci beaucoup tout le monde !
Lephenixnoir a écrit :
Plus précisément "absolument tout" ça fait rentrer quoi ?

J'entend par la :
-La gestion des priorités : lorsque deux éléments se superposent, seul celui du dessus peut interagir.
-Le déplacement du curseur en fonction de la position des éléments.
-Les barres de défilement sont indépendantes, tout comme les boutons, et possèdent leur propre rappel.
On ne le voit pas sur la vidéo, mais le rectangle rouge se trouve dans un panneau (un sous-menu), qui est essentiellement un ensemble d'éléments. Cela signifie que tous les éléments qu'il contient se déplacent si on utilise les barres de défilement.
Il y a également beaucoup d'autres petites choses que j'ai ajoutées.
De plus, "InterfaceSystem" est indépendant du support, ce qui signifie que si je crée une nouvelle distribution, comme la 3DS, je n'aurai pas besoin de modifier une seule ligne de code de "InterfaceSystem", mais seulement de "ParticuleEngine".

Merci Inikiwi, mais j'ai déjà réussi à faire le keyboard ainsi que la détection des fronts montant et descendant.
"La créativité est contagieuse faites la tourner"
Albert Einstein

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 - 2023 | Il y a 39 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