Bonsoir,
Je me permet de passer ici pour vous signaler que mon moteur de jeu spécialement développé à l'occasion de mon remake de Lionheart (et de Warcraft Remake actuellement) est disponible en téléchargement ici:
- http://www.b3dgs.com/v4/page.php?lang=fr&section=lionengine
Vous y trouverez la librairie prête à être utilisée avec Java, et pour les plus curieux, j'ai aussi mis les sources à disposition.
Énième rappel (cependant en lien avec le moteur) pour dire que si vous avez des difficultés à l'utiliser, j'ai fais un cours/tp basé sur mon moteur:
- http://www.b3dgs.com/v4/tutorials/game_programming/jeux_plateforme_tp.php
En exemple, vous avez les sources (non complètes pour le moment, j'y travaille toujours) de mon remake de Lionheart utilisant le moteur:
- http://www.b3dgs.com/v4/page.php?lang=fr&section=lionheart_remake
Si vous avez toujours des difficultés ou des incompréhension autour du moteur, je vous pris d'utiliser plutôt le forum que j'ai récemment mis à disposition plutôt que les mails ...
(section LionEngine)
- http://www.b3dgs.com/v4/forum/
Trois screens rapides pour illustrer ce post:
- http://www.b3dgs.com/v4/projects/lionengine/screen2.png
- http://www.b3dgs.com/v4/projects/lionengine/screen3.png
- http://www.b3dgs.com/v4/projects/lionengine/screen4.png
Bonne lecture aux intéressés ;)
Bonjour,
Le moteur passe maintenant en version 2.
Rien à voir avec la version précédente qui est largement obsolète comparé à cette nouvelle monture.
Il est maintenant possible de créer un Mario-like en moins de 2 avec de simples connaissance en programmation objet !
Le moteur propose en effet un ensemble de fonction bas niveau, pour la gestion des ressources, mais aussi des classes abstraites pour simplifier le développement des jeux (pour par exemple gérer une TileMap, ou un Raster, ou encore un joueur pour un jeu de plateforme...)
La partie abstraite concernant les jeux de stratégie est en cours de développement et progresse bien.
Les demos viendront dans le même temps (tout comme la partie plateforme).
Nouvelle page du projet:
http://www.b3dgs.com/v5/page.php?lang=fr&section=lionengine
Petites notes à propos de l'état du moteur à l'heure actuelle:
La version 3 se profile (mais ce n'est pas encore pour demain).
En résumé, j'ai apporté énormément de couches abstraites pour aider à la réalisation d'un jeu de type Stratégie (et conjointement Hack'N Slash).
Entre autre, l'architecture est découpé de cette façon:
- AbstractBuilding : première couche plus spécifique, réalisant un contrôle bas niveau de ce que peut être un bâtiment
- AbstractUnit : comme précédemment, mais pour les unités.
Dans un but d'architecture propre, et de modularité la plus extrême possible (afin de ne pas brider les volontés du développeur), j'ai organisé les "habilités" principales en module, afin d'avoir un couplage le plus faible possible:
On pourra aussi définir un temps d'extraction/dépôt, avec les animations qui vont bien, et des effets supplémentaire en remplissant la fonction prévue à cet effet.
Ces principales habilités sont donc applicables à n'importe quoi. Tout ce qu'il faut, c'est ajouter un champs à la classe l'utilisant, implémenter l'interface, et effectuer une délégation pour chaque méthode.
Exemple avec une classe générique utilisée par tout mes bâtiments:
// ...
private final ProducerAbility<SkillModel, Attributes> producer;
// Constructeur
// ...
@Override
public void addToProductionQueue(String name, int time) {
this.producer.addToProductionQueue(name, time);
}
@Override
public void updateProduction() {
this.producer.updateProduction();
}
@Override
public int getProductionProgress() {
return this.producer.getProductionProgress();
}
@Override
public void stopProduction() {
this.producer.stopProduction();
}
@Override
public int getQueueLength() {
return this.producer.getQueueLength();
}
Il est aussi possible de redéfinir une habilité en héritant de la version abstraite (pour des cas plus particulier).
Ensuite, c'est un peu de même pour des classes moins générale, telles que StrategyCamera (gérant le point de vue du joueur), et StrategyCursor (pour cliquer sur la map ou le panel de contrôle, ou encore effectuer une sélection avec filtrage des éléments selon ce que l'on souhaite).
Même chose pour les deux principales routines: AbstractEntryHandler (qui s'occupe de mettre à jour tous les objets), et AbstractControlPanel (pour gérer le panel, afin d'avoir des infos sur les unités sélectionnées, leur actions...)
Concernant les compétences, j'ai essayé de construire quelque chose de solide et efficace:
Que ce soit pour lancer un sort (Heal, Firebolt...), déplacer, attaquer, construire; tout est mis au rang de Skill au sens large.
Il suffit de décrire dans un fichier externe, des infos (nom, description, icone...), de créer une classe pour chacune d'elles, d'appeler la méthode addSkill(...) d'une AbstractEntity, et cette dernière apparait dans le Panel de contrôle, et on peut interagir avec celle-ci. Tout est paramétrable à souhait et facilement (je veux afficher les compétences sur 3 colonnes, avec un espacement X Y, et rajouter un cadre de sélection; ou cacher ce bloc, dans le cas d'un grand nombre).
Il suffit ensuite de définir l'action de cette compétence (appeler la BuildAbility pour construire un bâtiment à partir de son nom; produire une unité en l'ajoutant à la file de production; donner de la vie à un blessé...)
Il est évidemment aussi facile d'ajouter des effets visuel et sonore.
Je travaille en parallèle sur un remake de Warcraft I, et je m’étonne moi même de la facilité à développer un tel jeu en utilisant mon moteur !
Il y a encore beaucoup de secrets, que je ne détaillerais pas pour le moment.
Pour cette prochaine version, j'axe beaucoup le travail sur la doc. En effet, j'essaye de donner une explication sur chaque méthodes et interface/classe abstraites, afin d'en comprendre rapidement le fonctionnement.
De toute façon, lorsque j'arriverai à quelque chose de très productif, je préparerai un tuto pour réaliser un jeu de stratégie; ainsi qu'une doc expliquant l'architecture globale du moteur (qui commence à devenir sacrément complexe...)
Affaire à suivre ;)
ce serait donc un moteur de jeu de stratégie? je vois qu'il est axé, entre autre, sur la production de bâtiments. ![]()
Pour le moment, le moteur supporte pleinement les jeux de plateforme (voir Lionheart Remake), et les jeux de stratégie (mais pas encore assez facilement; voir Warcraft Remake)
Et concernant mon explication, c'était juste à titre d'exemple (pour le code en citation).
Sinon, bien évidemment que tout ce qui touche au STR est traité en interne (Affichage d'une map, chargement/sauvegarde/conversion depuis une map rip, pathfinding, construction, production, sélection multiples, gestion d'un panel de contrôle... enfin, tout est déjà détaillé dans mon explication).
Ce sera peut être plus clair quand j'apporterai un exemple plus concret que des explications ![]()
Nice, ça m'a l'air super intéressant, je regarde tout ça demain, merci ![]()
Un peu plus de concret, avec cette petite vidéo montrant les automatismes gérées par le moteur: http://www.b3dgs.com/v5/projects/lionengine/videos/attack.mp4
Ici, après avoir défini ses petites classes (dire que telle unité à la capacité d'être attaquante, et lui avoir ajouté la compétence d'attaque), une fois l'ordre donnée, l'unité va se diriger sur sa cible, et la visée en s'orientant dans sa direction.
De plus, les animations sont gérées aussi automatiquement, quelque soit l'angle du personnage (dans les 8 angles possibles, dont 5 ont une image propre [NORD, NORD-EST, EST, SUD-EST, SUD], et les 3 autres sont issus d'un mirroir [SUD-OUEST, OUEST, NORD-OUEST])
Il suffit ensuite d'intercepter la routine gérant l'attaque, pour dire à quel moment on veut appliquer des dégâts (ou autre), jouer un son...
Il est possible de fixer la cible (continuer à la poursuivre si elle fuit).
Tout élément sous-jacent est également modifiable (afin de ne brider aucune volonté de modification; je ne pourrais jamais faire un moteur qui fait tout )
Voilà voilà; je vais m’atteler aux déplacement multiples, qui ne sont toujours pas parfaits...
Voici une nouvelle vidéo montrant la progression actuelle (extraction de différents types de ressources, déplacements multiples, attaque en groupe, suivit d'unité, filtrage des actions selon les unités sélectionnées)
http://www.b3dgs.com/v5/projects/lionengine/videos/extract_group.mp4
Je rappelle que cette vidéo ne met pas en évidence un jeu, mais bien des routines sous-jacentes prête à être utilisée (entre autre, je ne me suis pas attelé à afficher l'arbre coupé, ou faire disparaitre le travailleur dans la mine...)
Cette vidéo montre qu'il est possible de distinguer plusieurs types de ressource (ici en exemple: gold & wood), et donc de traiter chaque cas (comme jouer une animation spécifique).
Il est possible de déplacer un bon petit nombre d'unité en même temps sans qu'elles se gênent abusivement (mais il faut encore améliorer ce point).
Un filtrage est intégré dans le cas d'une sélection multiple, afin de n'afficher que les compétences en communs des unité (ex: travailleur + fantassin = marcher & stop)
La routine d'attaque marche, en solo comme en groupe, avec un suivit de la cible.
le style graphique est joli dans son genre, ça fait rétro.
mais le scrolling sur la carte semble beaucoup trop rapide, tu devrais implémenter un truc à accéleration progressive à l'occasion. ![]()
Juste une question, il faut coder en quoi ![]()
Ah java desolé j'avais pas vu
@caelacanthe:
Je ne l'ai peut être pas explicité, mais il s'agit des graphismes de Warcraft I pour la démonstration vidéo.
Pour continuer, j'ai rajouté une gestion des projectiles.
On peut maintenant définir des projectiles, avec leur vitesse, dégâts, image... et bien sur une cible depuis une source.
http://www.b3dgs.com/v5/projects/lionengine/videos/projectiles.mp4
Comme vous le voyez, l'orientation des projectiles est aussi gérer selon l'orientation du tireur, et le vecteur de déplacement est calculé automatiquement en fonction de la trajectoire.
De plus, concernant les collisions, elles sont vectorielles, donc pas de soucis liées au bounding box (passage "au travers" si le projectile va trop vite).
Là, pas moyen de tricher, si ce n'est en esquivant ![]()
Ce n'est pas trop un soucis que les projectiles puissent travers les bois et que les PNJ non ?
Je vois un gros exploit là ^^'
Sinon ... tu comptes recréer tout warcraft 1 ? ![]()
En supprimant cette foutue limite de 4 unités sélectionnable en même temps ?
Joli boulot en tout cas.
@Bunyan: Si tu souhaites que les flèches ne traversent pas certains éléments, c'est facilement définissable. Là c'est juste une démo technique, pas de gameplay.
Pour poursuivre dans le même registre, je trouvais qu'un seul projectile n'était pas suffisant, alors j'ai complété pour pouvoir gérer tout aussi facilement de multiples projectiles à partir de la même source.
En résumé, voici le résultat: http://www.b3dgs.com/v5/projects/lionengine/videos/multiples_projectiles.mp4
Les projectiles sont toujours contrôlé par la même instance de projectile (la version originale); les autres sont des instances partagée de la version originale, possédant leur propre location.
Entre autre, ces contrôles peuvent être transparent pour l'utilisateur (tout est géré en interne). Il suffit juste d'appeler une fonction this.projectile.launch(target); et pi c'est tout !
Inutile de préciser qu'il est possible de définir son propre type de projectile, tout en restant compatible. On peut simplement définir des propriétés telles que: vitesse, durée de vie, dégats, animation, effets...
Entre autre, la classe AttackerAbility a vu naitre deux nouvelles classe: AttackerMeleeAbility (pour les attaques directe, bien que pas nécessairement au corps à corps), et AttackerDistanceAbility (pour les attaques projetant quelque chose)
Bon je suis désolé de m'acharner sur ce pauvre paysan... promis, les essais avec de nouveau cobayes arriveront prochainement
Voilà, j'ai enlevé le paysan, pour le remplacer par... une petite armée de grunt !
http://www.b3dgs.com/v5/projects/lionengine/videos/fight.mp4"
J'ai ajouté un système de détection d'ennemis dans un rayon définissable.
Comme ça, les unités pouvant attaquer ne resteront pas passives lors d'une attaque, sauf si on leur demande.
ah oui, c'est joli, c'est bien animé, et ça marche parfaitement, de visu. ![]()
Cela me fait juste dire qu'aujourd'hui un développeur seul peut faire des jeux qui se seraient vendus à des millions d'exemplaires il y a 20 ans
Sinon pour les vidéos pourquoi ne les uploades tu pas sur youtube ?
"aujourd'hui un développeur seul peut faire des jeux qui se seraient vendus à des millions d'exemplaires il y a 20 ans
"
il y a 20 ans, un tas de jeux étaient développés par des équipes très réduites, voire des personnes seules.
frontier: elite ![]()
@Tbop2: je veux pas que youtube se les approprie... non je déconne !
Simple fleme, ça va plus vite à mettre sur mon ftp rapido, surtout que c'est vraiment des vidéos temporaires.
J'en mettrais quand j'aurai quelque chose de complet à présenter ;)
A propos du dev de jeu solo, il faut pas oublier que j'ai repris les graphismes (certes les ripper ça prend du temps, mais quand même
Toujours dans les automatismes de base, à savoir la détection de choses à attaquer dans un certain rayon, j'ai inclus le choix d'objets.
Par défaut, l'objet le plus proche est choisis.
Si il n'est plus accessible (trop de monde autour, bloqué), il cherchera le suivant et l'attaquera.
Petite illustration, avec un rush d'orcs dans une ville vide:
http://www.b3dgs.com/v5/projects/lionengine/videos/auto_attack.mp4
En principe, on ne devrait pas trouver d'adversaire oisif à proximité d'une cible potentielle. A moins qu'aucune ne soit accessible.
Ces opérations sont quasiment "gratuites" en terme de perf, puisque j'ai indexé un ID dans la structure de la map, me permettant de savoir qui occupe telle case.
Si vous voyez un attaquant oisif, c'est que la cible n'est pas dans son champs de vision (là aussi, définissable).
Cette meute d'orcs qui tapent c'est mimi ![]()