Crunchez vos adresses URL
|
Rejoignez notre discord
|
Hébergez vos photos
Page 1 sur 5 12345 DernièreDernière
Affichage des résultats 1 à 30 sur 123
  1. #1
    Il y a quelques temps j'avais posté ici mon projet de RTS sans nom pour le moment
    Je n'étais pas bloqué par quoi que ce soit (ni même par le temps), mais j'ai décidé de réorienter le projet vers un truc un peu plus simple, et qui sera jouable plus rapidement : un dwarf-fortress-like (que c'est original!)

    Les règles sont donc les mêmes : pas de moteur 3D, tout est codé main en C++ et à l'aide de DirectX
    Evidemment j'utilise tout de même quelques librairies, mais ce ne sont en aucun cas des frameworks : libavcodec (pour décoder l'audio/vidéo), libarchive (pour dézipper), freeimage (pour charger les images), freetype (pour charger les polices de caractères)


    Description

    Le jeu proposera donc de gérer en vue de côté des vers de terre qui peuvent creuser le sol et s'aménageront une petite forteresse

    Voilà déjà un petit screenshot pour vous faire une idée :
    (les petites boules vertes ce sont des vers, le truc bleu c'est le ciel, le truc marron c'est le sol )



    Ce qui est déjà fait : (beaucoup de copié-collé )
    - tout ce qui est moteur graphique, c'est à dire que si je veux dessiner quelque chose à un endroit particulier, ça se fait facilement
    - tout ce qui est input, en lisant simplement les entrées clavier/souris
    - le picking, c'est à dire déterminer quel(s) objet(s) se situe(nt) aux coordonnées où j'ai la souris
    - le texte, je peux afficher du texte à l'écran, ça paraît con mais c'est pas simple
    - le son, grâce à XAudio2 et libavcodec je peux charger n'importe quel son et le jouer
    - le rendu du sol, j'en suis assez satisfait et je ne pense pas en changer avant un bon bout de temps (probablement pour rajouter de l'herbe à la surface ou bien une petite perspective)

    Les prochaines étapes :
    - l'UI
    - le système de jeu (la gravité, l'impossibilité de passer à travers le sol, etc.)

    Contrairement au projet de RTS qui était plus là pour le fun et pour apprendre (je l'avais dit dès l'OP), ce jeu-là je compte bien le mener le plus loin possible, d'où l'ouverture d'un topic dédié


    Téléchargement

    La toute première version compilée il y a tout juste 5mn est disponible ici (23 Mo)
    Utilisez les touches fléchées et la molette de la souris pour déplacer la caméra
    C'est très limité, vous pouvez juste voir la même chose que les screenshots mais en vrai, et si vous cliquez sur une case de terre les vers iront la creuser
    Mais surtout, vous pourrez me dire ce que vous en pensez, et si le programme fonctionne chez vous, et ça ça n'a pas de prix

    Vous aurez besoin de directx 10+ et du runtime VC++ 2012

    S'il vous dit "msvc-quelque chose introuvable", téléchargez le runtime VC++ 2012 (dans 6 mois/1 an tous les logiciels et jeux vous le demanderont de toute manière)

    Si jamais le programme plante, ce serait sympa de me copier-coller le contenu de "log.txt" qui s'est normalement créé dans le même répertoire que le programme

    Dernière modification par Tomaka17 ; 16/10/2012 à 16h31.
    Rust fanboy

  2. #2
    L'idée est très original. Je suis curieux de voir jusqu’où tu vas mener ton projet .


    J'ai une erreur en exécutant ta démo : Il me manque le fichier "MSVCR110.dll", alors que j'ai installé le runtime VC++ (via ton lien).
    Dernière modification par Louck ; 16/10/2012 à 22h43.

  3. #3
    Citation Envoyé par lucskywalker Voir le message
    J'ai une erreur en exécutant ta démo : Il me manque le fichier "MSVCR110.dll", alors que j'ai installé le runtime VC++ (via ton lien).
    Ouaip je pense que tout le monde aura cette erreur en fait
    Tous les jeux et logiciels dont le développement commence en ce moment demanderont d'installer ce truc pour y jouer, et le mien ne fait pas exception


    Sinon j'avais parlé dans mon précédent projet du moteur de rendu CSS
    Celui-ci avance pas trop mal

    Voici une mini interface que j'ai faite en 5mn l'autre jour quand je l'ouvre dans mon navigateur :



    Voici la même une fois intégrée au jeu :



    Je ne gère pas encore le font-family, les images, le text-align, les retours à la ligne (qui sont désactivés car un bug fait ramer le jeu) et les dégradés (ça ne se voit pas bien mais c'est un dégradé sur le premier screen) mais sinon ça commence à être sympa je trouve

    Bientôt j'en serai au même niveau qu'IE
    Rust fanboy

  4. #4
    Vous pouvez télécharger ici le build d'aujourd'hui pour ceux qui sont intéressés



    J'ai pas mal avancé depuis avant-hier :
    - on peut faire click droit pour placer une pente (vers la gauche uniquement, pour vers la droite je n'ai pas encore fait le code pour l'afficher à l'écran et j'ai pas autorisé à en placer)
    - un début d'UI
    - la gravité et le pathfinding sont implémentés (mais ça reste très buggé, faut que je nettoie tout ça)

    Attention : si vous donnez trop d'ordres hors d'atteinte, ça va commencer à ramer
    En fait à chaque frame les vers inoccupés essayent d'atteindre les endroits à creuser via l'algo de pathfinding
    Je pense pouvoir optimiser grandement tout ça en vérifiant simplement si la case est théoriquement accessible par un des côtés avant de balancer une recherche de chemin
    Et puis le pathfinding en soi est assez lent car j'ai fait ça vraiment en mode bourrin

    Les boutons de l'UI ne marchent toujours pas, mais on peut commencer à creuser des galleries avec click gauche/click droit
    Cela dit il y a énormément d'ajustements à faire : les vers cachent la moitié de l'écran, parfois il devrait pouvoir passer mais il ne peut pas, si vous cliquez sur une case déjà vide ben il ira quand même creuser, si vous double-cliquez il creuse deux fois, etc.

    Prochaines étapes :
    - nettoyer le code du pathfinding et de la gravité
    - l'UI qui fonctionne
    - jouer un petit son quand on creuse

    Et sinon vous pouvez vous amuser à modifier game_ui.htm pour mettre un petit code html dedans, mais si c'est trop complexe il y a de grandes chances que ça fasse planter le jeu
    Rust fanboy

  5. #5
    Un petit screen avant d'aller bosser pour de vrai :



    Fonctionnent désormais :
    - les cases désignées pour être creusées apparaissent maintenant en surbrillance
    - les boutons de l'UI marchent, malgré qu'ils soient déformé : on clique sur le bouton ("dig", "g" pour "gauche" ou "dr" pour "droite" en attendant d'avoir des icônes), puis on clique sur la/les cases ; click droit annule la sélection, et en maintenant appuyé on peut désigner plein de cases d'un coup
    - les vers se baladent à nouveau aléatoirement quand ils n'ont rien à faire
    - de bien meilleurs perfs en faisant juste 2/3 ajustements

    J'ai sauté la partie "ajouter un son quand on creuse", car je vais rajouter les sons en même temps que les petites animations

    À noter que les lignes grises bizarres n'apparaissent que quand j'active l'anti-aliasing, j'ai pas encore déterminé d'où ça venait

    Prochaine étape :
    - le bouton "cancel" qui marche (c'est à dire "annuler la désignation")
    - affichage correct de l'UI

    Après je vais probablement implémenter quelque chose de neuf, par exemple les objets, les besoins (soifs, faim, repos, etc.), l'eau, etc.
    Je ne sais pas encore quoi

    J'ai pas l'impression de déchaîner les foules pour l'instant
    Rust fanboy

  6. #6
    J'ai pas l'impression de déchaîner les foules pour l'instant
    C'est à mon avis le plus difficile quand on bosse sur un projet.
    J'admire les gens qui arrivent à garder leur motivation jusqu'au bout et je te souhaite bien du courage, mais je vais être honnête et je vais dire que pour le moment c'est bien trop au stade de prototype (et assez moche pour le moment, désolé mais ne nous voilons pas la face) pour déchaîner les foules.
    D'autant plus que des DF-like tu en trouves des tripotées à présent et que comparé à l'original, la barre est très très haute pour avoir quelque chose d'attractif.

    Mais bon, si je peux te donner un conseil, ce serait de continuer à faire ce qui te plait, et ne pas trop compter sur l'enthousiasme des gens. Tu peux parler de ton avancement, et c'est intéressant à suivre, mais ne fais pas ça juste pour avoir des retours ou tu risques d'être déçu.
    "Dieu est mort" · "Si le téléchargement c’est du vol, Linux c’est de la prostitution."

  7. #7
    Je ne m'attends pas à ce qu'on me dise "lol, je kiffe ton projet", mais juste un peu d'animation sur le topic, comme sur mon précédent topic par exemple
    Par exemple en montrant où en était mon moteur CSS, je m'attendais à ce qu'on me demande les perfs ou le code par exemple
    Mais sinon je sais très bien que vu de l'extérieur ça ne ressemble à rien pour le moment

    Après c'est pas une histoire de déception ou quoi que ce soit, c'est juste que c'est dommage de poster dans le vent
    Si j'ai une réponse toutes les 3 semaines, autant ne pas perdre de temps à alimenter le topic si tu vois le raisonnement

    Si je faisais ça pour les retours ou la reconnaissance je posterais beaucoup plus souvent d'ailleurs
    Là par exemple j'ai bossé dessus 8h/jour ce week end sans que ça ne me préoccupe de montrer ce que j'avais accompli, à part tout à l'heure en diagonale
    Rust fanboy

  8. #8
    Si ça peut te rassurer, j'ai pas vu beaucoup de topics sur ce sous-forum déchaîner les foules.

    Personnellement, je suis de loin, sans intervenir forcément sur les topics. Ou pas.

    Edit : good luck, sinon

  9. #9
    Je pense aussi que dans les lecteurs, il y a ceux qui savent faire la même chose et ne se posent pas trop de questions, et ceux qui débutent et à qui un projet aussi jeune ne parlera pas. Ou alors il faudrait que tu décrives à chaque fois ce que tu voulais faire, la méthode employée, et pourquoi elle est pertinente, mais tu passerais plus de temps à faire de la doc qu'à bosser sur ton projet.
    Sebum le fait (détailler un peu le pourquoi de chaque bout de code), mais c'est relativement concis pour pas nécessiter 10 pages par magazine, et les projets developpez couché restent assez simples pour être accessibles aux débutants. Le temps de rédaction / temps de dev est sûrement assez élevé.

  10. #10
    Bon je commence à être vraiment content de mon moteur CSS là

    Résultat voulu : http://cssdesk.com/KEuJP

    Résultat obtenu :



    Par contre je vois pas comment je peux centrer le texte à l'intérieur d'un bouton (EDIT : verticalement)
    On voit que si on remplace par exemple <button> par <span> dans mon HTML (et en spécifiant inline-block pour les span), le texte n'est pas centré en utilisant un navigateur classique, ça prouve bien que les navigateurs classiques ont une règle spéciale pour centrer le texte dans les <button>
    Et moi je voudrais une règle CSS qui fasse ça...

    À part ça il me manque le box-shadow et le text-align, et tout sera bon
    Dernière modification par Tomaka17 ; 23/10/2012 à 19h35.
    Rust fanboy

  11. #11
    Hop, petit screenshot :



    J'ai rajouté vite fait les pierres, ce sont les cases blanches qui sont pour le moment distribuées aléatoirement.
    Quand j'en aurai l'envie je ferai le code pour générer un monde, comme ça la surface aura des reliefs, et les pierres (ainsi que les ressources) seront distribuées de manière logiques dans le sous-sol.

    Sinon comme vous le voyez, on peut maintenant placer des échelles. Celles-ci ne fonctionnent pas encore (c'est à dire qu'on ne peut pas y grimper) mais ça ne saurait tarder.
    Rust fanboy

  12. #12
    J'ai commencé à mettre en place le système d'objets.
    J'ai prévu le chargement des types d'objets au moment du runtime, de façon à ce que ce soit à la fois plus facile pour moi à modifier et potentiellement moddable :

    Code:
    itemTypes = {
    	-- basic materials
    	wood = {
    		graphics = "textures/items/wood"
    	},
    	stone = { graphics = "textures/items/rock" },
    	
    	-- trees
    	tree = {
    		isTree = true,
    		onChop = { wood = 2 }
    	},
    
    	-- workshops
    
    
    	-- wood items
    	ladder = {
    		graphics = "textures/items/ladder",
    		isLadder = true,
    		craft = 
    			{	input = { wood = 2 },
    				output = 1
    			}
    	}
    
    }
    J'ai déjà un bon petit wrapper lua fait maison (quand je dis "petit", en fait il 1200 lignes, c'est un gros truc à base de templates que j'ai développé il y a quelques années et dont je suis assez fier), donc ça devrait être assez simple de charger ça.


    EDIT : sans erreur dans le lua c'est mieux
    Dernière modification par Tomaka17 ; 29/10/2012 à 22h07.
    Rust fanboy

  13. #13
    Je viens de trouver le topic et de finir de le lire, et bien c'est un régal

    J'ai lu un peu ton ancien topic aussi du coup, et j'aime beaucoup ta façon de nous donner des nouvelles, comme d'autres, je n'interviens pas forcement mais compte sur moi pour suivre le topic et tester les prochains builds !

    Bonne chance

  14. #14
    Voilà, les types d'objets sont désormais chargés depuis le fichier lua.

    Il est également désormais possible de donner l'ordre de placer un objet quelque part. Par exemple si je clique sur le bouton "lit" puis à un endroit, je donne en fait l'ordre de placer un "objet lit" à cet endroit, pour qu'il devienne un "bâtiment lit" où on pourra dormir.
    La prochaine étape ça va être le craft. Je n'ai pas encore d'interface pour ça, mais je vais temporairement rendre ça automatique (c'est à dire un ordre de craft d'un objet est automatiquement donné quand on veut placer un objet de ce type).

    Une fois le craft fait, je vais rajouter des arbres qu'on pourra couper, et j'aurai déjà un bon petit résultat sympatique.
    Rust fanboy

  15. #15
    Tiens tu gères comment le picking d'ailleurs ? Tu stockes un genre de quadtree de tous les objets affichés et ensuite à chaque clic tu vas voir dedans quel objet correspond ? Ou bien différemment ?
    "Dieu est mort" · "Si le téléchargement c’est du vol, Linux c’est de la prostitution."

  16. #16
    Citation Envoyé par rOut Voir le message
    Tiens tu gères comment le picking d'ailleurs ? Tu stockes un genre de quadtree de tous les objets affichés et ensuite à chaque clic tu vas voir dedans quel objet correspond ? Ou bien différemment ?
    Pour l'instant chaque objet a une petite fonction "collisionTest", et je prends tous les objets un par un du plus au dessus jusqu'à tout en dessous, et je regarde s'il touche le point en question (multiplié par l'inverse de la matrice de l'objet).
    C'est basique et pour l'instant c'est suffisant.

    J'ai pas d'implémentation de quadtree sous la main, mais je sais que je vais devoir m'y coller tôt ou tard si je ne veux pas que mon jeu rame avec trop d'objets affichés.
    Rust fanboy

  17. #17
    Perso j'avais pensé ajouter, à la phrase de rendu, un rendu rapide dans une texture de tous les objets, en ne rendant que leur "id" en tant que couleur, et ensuite en récupérant la couleur à la position du pixel, tu obtenais directement l'id de l'objet touché, mais je ne sais pas trop si c'est plus efficace, ca alourdit peut être un peu la passe de rendu et ça nécessite de récupérer ensuite le contenu de la texture depuis le GPU (mais ça à la limite ca peut s'alléger en ne récupérant que les alentours des la position du curseur).
    "Dieu est mort" · "Si le téléchargement c’est du vol, Linux c’est de la prostitution."

  18. #18
    Plus simple que de stocker l'id de l'objet, tu peux carrément stocker un pointeur void* dans la texture. Par contre faut éviter le multisampling

    Mais le problème de ta technique c'est que tu ne peux au final connaître que l'objet le plus au dessus.

    Par exemple si je clique sur la commande "Déplacer un objet" et que je veux cliquer sur une échelle sous un personnage, ben je serais emmerdé car je ne pourrais pas "filtrer" le perso.
    Rust fanboy

  19. #19
    Bon ben j'ai pas mal avancé.
    Le craft "fonctionne", dans le sens où les personnages vont vers le composant le plus proche (par exemple du bois), et le résultat (par exemple une échelle) pop par miracle quelque part sans que le composant ne soit détruit.

    En fait il faut que je refasse ça plus proprement, car selon les cas soit on va ramener tous les composants au même endroit que le premier et crafter sur place, soit on va ramener tous les composants sur le lieu final (par exemple pour créer un atelier), soit on va ramener tous les composants à un atelier. Du coup là je me suis pas pris la tête et j'ai fait ça à l'arrache.

    Là je pense avoir finalisé mon interface serveur-client, c'est à dire que j'ai clairement défini les limites du jeu.
    Cela signifie que je peux maintenant coder entièrement l'UI et la partie client.

    Les prochains trucs à faire c'est :
    * faire fonctionner les échelles, car les personnages ne peuvent pas encore s'en servir pour monter/descendre
    * faire le code qui génère le monde, avec des reliefs et des arbres
    * faire le code UI qui permet de signaler au serveur qu'on veut couper un arbre
    * faire le code qui affiche un objet transparent à l'endroit où on veut placer le-dit objet (pour l'instant ça s'affiche mais il est opaque, du coup on comprend pas)

    Le but c'est d'arriver à un milestone "on peut couper des arbres pour fabriquer des échelles et ainsi creuser les galeries comme on veut".
    Une fois tout ça fait je sortirai un p'tit build.

    Il ne me restera plus alors qu'à créer l'UI, décrire les propriétés de tous les types d'objets possibles dans mon fichier lua, dessiner tout ça (le plus difficile), débugger le code du serveur qui est pour l'instant pas très robuste, et enfin rendre le tout le plus joli possible.
    Rust fanboy

  20. #20
    Comme beaucoup d'autres je suis avec intérêt sans participer, sache le

    Tu parles de ton wrapper lua, un peu plus de détails dessus (une release ) c'est possible ? Je m'intéresse un peu à voir comment on peut utiliser lua comme langage de script dans un jeu mais sans vraiment d'exemple concret ni d'expérience personnelle. Vu de loin les wrappers existants ont pas l'air folichons.

  21. #21
    Hop, une petite release.
    Ca compile et ça fonctionne, mais c'est encore un p'tit peu bancal (ça le sera moins quand MSVC++ supportera les templates variadiques).

    Exemple avec mon wrapper :
    Code:
    LuaContext lua;
    lua.writeVariable("x", 5);
    lua.executeCode("x = x+1");
    lua.readVariable<int>("x");    // renvoie 6
    En gros dans Lua, tout est considéré comme une variable, même les fonctions.
    Du coup tu peux aisément fournir des fonctions à un script lua qui va ensuite les utiliser :

    Code:
    // attention c'est de la syntaxe C++11, si tu comprends pas c'est normal
    lua.writeVariable("log", std::function<void (std::string)>([](const std::string& str) {
       std::cout << str << std::endl;
    }));
    
    lua.executeCode("log('bonjour');");   // va appeller la fonction plus haut et donc std::cout
    Tu peux également fournir des objets :

    Code:
    class Personnage {
       void deplacer();
    };
    
    Personnage* p;
    
    lua.registerFunction("deplacer", &Personnage::deplacer);
    lua.writeVariable("joueur", p);
    lua.executeCode("joueur:deplacer();");  // appelle p->deplacer();
    Evidemment en pratique tu vas rarement appeller executeCode avec du code directement dedans, mais plutôt lire le contenu d'un fichier .lua.
    Après la limite c'est ton imagination.
    Rust fanboy

  22. #22
    Super je vais regarder ça, merci

  23. #23
    Cela dit il est possible que mes deux derniers exemples ne fonctionnent plus, vu que j'ai un peu retouché le code pour ce jeu -.-'
    Rust fanboy

  24. #24
    Bon ben le bouton "gather" fonctionne

    On clique sur "gather", on clique sur un arbre, et un personnage vient pour couper l'arbre.
    L'idée c'est que le bouton "gather" servira à désigner les arbres et les plantes pour être récoltées.

    (note : le screen est orange, c'est à cause de l'utilitaire f.lux)

    Ci-dessous : un arbre normal, un arbre désigné pour être coupé, un arbre une fois coupé (le tas de bois).

    Dernière modification par Tomaka17 ; 04/11/2012 à 20h47.
    Rust fanboy

  25. #25
    J'ai dessiné des petits arbres, qui sont plus agréables visuellement même si ça manque un peu de cohérence.

    Rust fanboy

  26. #26
    Bon ben le relief est désormais généré aléatoirement grâce à un algo fractal.

    L'idée c'est que je détermine d'abord aléatoirement la hauteur du sol aux extrémités gauche et droite de la map. La surface forme alors une ligne qui relie les deux extrémités. Je la coupe en deux au milieu et j'ajoute une valeur aléatoire à la hauteur à cet endroit.
    J'ai donc à ce moment là deux lignes, que je coupe chacune en deux à leur milieu pour en obtenir quatre, avec comme avant une valeur aléatoire ajoutée à l'endroit de la coupure. Et ainsi de suite.
    Plus on avance plus la valeur aléatoire est faible, ce qui fait que les premières coupures sculptent le relief général, et les coupures suivantes ajoutent à chaque fois des détails.

    Evidemment l'algo est pas réellement aléatoire, c'est à dire que je peux rentrer une seed, et si je rentre deux fois la même seed ça me génèrera deux fois le même terrain.

    Là pour le screen j'ai pris un coin avec un gros relief mais dans l'ensemble c'est relativement plat, et c'est ce que je veux. Après faudra éventuellement ajuster tout ça en fonction de la taille définitive des personnages.



    Par contre j'ai une hésitation au niveau des cases là. J'hésite entre mettre les définitions dans un fichier lua que je charge au moment du lancement, ou alors les ancrer directement dans le code du jeu.
    Ce serait pas mal si je prenais cette décision rapidement, ça me permettrait de finaliser la partie terrain.
    Rust fanboy

  27. #27
    Chouette boulot !
    Tu entends quoi par "Par contre j'ai une hésitation au niveau des cases là" ?

  28. #28
    Ben j'ai découpé tout le terrain, et même tout le monde, en cases.
    Ca se voit bien sur le screenshot avec les petits carrés blancs et marrons ; ce sont à chaque fois des cases.
    La grande majorité des jeux type RTS/gestion utilisent cette "technique", sauf qu'ils le masquent bien.
    Rust fanboy

  29. #29
    Citation Envoyé par Tomaka17 Voir le message
    Ben j'ai découpé tout le terrain, et même tout le monde, en cases.
    Ca se voit bien sur le screenshot avec les petits carrés blancs et marrons ; ce sont à chaque fois des cases.
    La grande majorité des jeux type RTS/gestion utilisent cette "technique", sauf qu'ils le masquent bien.
    Mais comment se fait-il alors que la taille de chaque case semble différente et qu'aucune ne semble avoir d'angle droit?
    Si c'est juste une histoire de dessin de sprite alors ça signifie que tu ne pourrais pas en mettre deux côte à côte sans qu'elle se superpose donc je m'interroge...

  30. #30
    Citation Envoyé par Poussin Joyeux Voir le message
    Mais comment se fait-il alors que la taille de chaque case semble différente et qu'aucune ne semble avoir d'angle droit?
    Si c'est juste une histoire de dessin de sprite alors ça signifie que tu ne pourrais pas en mettre deux côte à côte sans qu'elle se superpose donc je m'interroge...
    Justement, je masque un peu le subterfuge

    Dans la mémoire vive et dans le système de jeu tout est découpé sous forme de carrés. Par contre au moment d'afficher le terrain je rajoute une petite translation.
    L'astuce c'est que la translation est calculée en fonction de la position du sprite. Par exemple la case à (-10,-5) sera toujours en réalité à (-10.07,-4.9) (ce sont des nombres que je donne au pif, pas forcément ça).
    Du coup les cases sont quand même collées entre elles.

    En fait les sprites sont carrés, mais je les déforme. Comme c'est une déformation très légère et que les sprites ne sont pas des images très détaillées, ça ne se voit pas.
    Rust fanboy

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •