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
.
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.
Albert Einstein
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.
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 ?
Albert Einstein
Citer : Posté le 04/03/2023 13:25 | #
C'est très vague dis comme ça ! Tu peux mesurer le temps que prend chaque frame de la façon suivante avec libprof :
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.
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).
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'
Albert Einstein
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.
find_package(LibProf 2.1 REQUIRED)
# dans le target_link_libraries, rajouter libprof juste après PRIVATE :
target_link_libraries(myaddin PRIVATE LibProf::LibProf ...)
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)
Albert Einstein
Citer : Posté le 05/03/2023 08:56 | #
Impressionnant ! Ce multi-plateforme est certifié badass, tu as toute mon attention :3
Plus précisément "absolument tout" ça fait rentrer quoi ?
Citer : Posté le 05/03/2023 09:52 | #
C’est vraiment la classe Farhi. Bravo !!!
Citer : Posté le 05/03/2023 13:11 | #
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é.
Citer : Posté le 05/03/2023 14:23 | #
Merci beaucoup tout le monde !
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.
Albert Einstein
Citer : Posté le 01/04/2023 20:03 | #
En dehors de mon poisson d'avril annuel (vous devrez vous y habituer ), j'ai d'autres choses à vous montrer. Avant cela, laissez-moi vous expliquer ma situation. Je suis étudiant dans une école d'informatique qui monopolise tout mon temps. Malheureusement, la plupart de mes projets avancent lentement en raison de mes charges de travail. Cependant, pour ce projet, c'est un peu différent.
Mon école nous oblige à réaliser un projet de programmation chaque semestre. Vous voyez où je veux en venir ? En effet, le projet que je réalise pour mon école est similaire à celui-ci. Par conséquent, cela me permet d'avancer plus rapidement !
Les deux projets (celui de mon école et celui-ci) utilisent le même moteur, même s'ils n'ont pas la même finalité. Cela me permet de travailler plus efficacement sur les deux projets en même temps.
C'est pourquoi je vais vous partager des images de mon projet d'école, car il est plus abouti que RPG OpenWorld Online. Pour vous donner une idée, le sujet de mon projet d'école était libre, mais avec quelques contraintes : il devait être réalisé en C et fonctionner sur Linux.
J'ai choisi de réaliser un "jeu de la vie" en utilisant des réseaux de neurones. En d'autres termes, j'ai créé une véritable simulation de la vie !
Albert Einstein
Citer : Posté le 07/03/2024 23:09 | #
Et si je balançais une nouvelle dinguerie...
Albert Einstein
Citer : Posté le 08/03/2024 08:54 | #
Le résultat est impressionnant! Mais par contre, le add-in est fais en python apparemment, ou je me trompe? Sinon, ça me donne envie d'utiliser Particule
Citer : Posté le 08/03/2024 16:43 | #
Le résultat est impressionnant! Mais par contre, le add-in est fais en python apparemment, ou je me trompe? Sinon, ça me donne envie d'utiliser Particule