Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: [C++][RTS 2D] PolygonWars  (Lu 4160 fois)

0 Membres et 1 Invité sur ce sujet

marchred

  • Newbie
  • *
  • Messages: 19
    • Voir le profil
    • E-mail
[C++][RTS 2D] PolygonWars
« le: Juillet 26, 2012, 11:19:12 am »
Moi

Hello, marchred, 23ans, survie en France.


le Jeu

PolygonWars (nom honteusement pompe d'un jeu du même nom) est un RTS 2D multiple-joueurs

Comme il n'y a aucune IA vous devrez être plusieurs pour jouer, il n'y a pas de limite de joueur au passage.

L’idée c'est de commander a plusieurs une armée ou chacun peut avoir son rôle.
Si par contre les taches viennent a manquer les joueurs peuvent directement prendre le contrôle d'une unité tout en gérant les unités a portée de vue

Il s'agit ici d’être un minimum original en proposant un gameplay a peu près potable.
Car oui, le jeu est moche (bourre de sf::Shape), le titre est pas original et les unités se déplacent case par case.


Gamplay

Vue de dessus

Contrôle a la souris :
  • clic gauche → sélectionner
  • clic gauche enfonce → rectangle de sélection
  • clique droit → déplacer
Les unités sont des polygones :
  • Elles se déplacent par cases, dans les 8 directions
  • Elles possèdent des points de vie
  • Peuvent posséder un effet actif gérer automatiquement
    • Quand elles le peuvent, elles attaquent l’unité ennemis la plus proche
    • Quand elles le peuvent, elles soigne l’unité amis la plus proche
  • Peut posséder un effet passif gérer automatiquement (une sorte d'aura)
  • peuvent évoluer vers un meilleur type si on y met le prix
  • peuvent s’étendre pour devenir des bâtiments si on y met le prix
  • peuvent être contrôle par un joueur, possède alors des avantages :
    • peut passer au dessus des bâtiments et des unités
    • possède un caractéristique lie a son type (vision++, attaque++, etc …)
    • les effets actifs comme l'attaque ou le soin deviennent manuel (c'est plus automatique quoi)
    • doit être relâcher sur une case vide (a moins de la sacrifier ou de mourir...)
Les bâtiments sont des unités plus grande et immobiles :
  • Prennent 3*3cases et sont immobiles
  • Elles possèdent 3 fois + de points de vie que leurs ancienne forme
  • prise du contrôle des joueurs et le sacrifice est toujours possible
  • 255 bâtiments max
Ressource dans le jeu : le triangle
  • vous pouvez obtenir cette ressource en sacrifiant vos unités/bâtiments (sa dépend de son état, sacrifier un truc a 1PV ne rapporte presque rien)
  • un bâtiment (l'octogone étendu) produit constamment l’unité de base, s'il ne peut pas créer de nouvelle unité il la sacrifie automatiquement :
    • 255 unités max
    • plus de place sur la map
Une partie

Vous démarrez une partie dans un des deux seuls camps (bleu et rouge), vous ne possédez qu'une unité, un octogone
sa capacité de base est de pouvoir tirer des projectile qui convertissent toute unité ennemis en unité allie
sa deuxième capacité est qu'une fois devenu un bâtiment, elle produit des triangles, l’unité de base, a une vitesse de 1 toute les 3 secondes

A vous de voir si vous voulez déplacer l'octogone avant d'en faire un bâtiments, bien qu'en général, la production soit plutôt urgente

Le triangle est un unité faible, capable d'attaquer, mais possède surtout la meilleur vision de toute les unités.
A partir de la vous avez le choix
  • explorer la map avec le triangle
  • le sacrifier pour peut être faire évoluer le prochain triangle
  • le muter en bâtiment pour qu'il deviennent l’équivalent d'une tour de guet (avec un encore meilleur champs de vision)

Puis vous êtes tenté de faire évoluer un triangle, il deviendra un carré, le carré n'attaque pas, mais possède un champs de force
Le carré régénère sont champs de force et c'est tant mieux car il est a peine plus résistant qu'un triangle.
Son champs de force mesure 3*3 cases, il peut donc protéger d'autre unité, il passera a 9*9 case si il devient un bâtiment

Viens ensuite le pentagone, équivalent d'un soldat.
Il attaque plus loin, plus vite et plus fort qu'un triangle, et c'est tout ce qu'on lui demandera
Le transformer en bâtiment en fera une parfaite tourelle de défense

La nouvelle évolution sera l'hexagone, un soigneur, il vise les allies les plus faible en point de vie.
En bâtiment, il générera un aura de régénération pour les bâtiments et les unités (non cumulable).

Avec 7 cote, l'heptagone est une unité d'artillerie, ses tirs explosent et font des dégâts de zone.
Inutile de décrire les effets d'une tel unité une fois devenu un bâtiments, un massacre.
Son point faible? sa très faible vision du terrain.

Viens ensuite l'octogone, mais passons, nous la connaissons déjà.

Le Nonagone est une unité invisible quand rien le la touche, même en déplacement.
Elle n'attaque pas et deviens visible en bâtiment tout en rendant invisible tout ce qui se trouve a sa portée (9*9 cases)

Enfin, le décagone est l’unité ultime, il attaque avec des projectiles perforants passant aux des travers des unités, bâtiments et des boucliers
Sa version bâtiment est l’équivalent d'un générateur avec une aura qui boost les autres bâtiment, et si cela cachait quelque-chose ?


Technique

Ce projet est pure SFML, pas d'OpenGL, rien d'exotique donc « il devrais pouvoir marcher sous Windows » (oui je suis sous Linux ;) )

Tout action est « Server-side », recherche de chemin, déplacement, construction, sacrifice, upgrade, action automatique et brouillard de guerre
  • Donc lors des déplacement c'est le serveur qui calcul le chemin des unités, les client reçoivent juste les coordonnes de mouvement pour l'affichage.
  • Lors d'une construction/sacrifice/upgrade d’unité c'est le serveur qui vérifie si les conditions sont remplis
  • Si quelque-chose n'est pas visible pour un camps il n'est pas transmis aux clients du camps en question, explication :
    • si une unité est invisible ou dans le brouillard de guerre, elle n'existe pas pour les client du camps adverse
    • quand elle devient visible, elle est crée est mise a jour pour les clients adverses
    • quand elle n'est plus visible, elle est détruite et n'est plus mise a jour pour les clients adverses
    • cette « technique » me permet d’économiser des envois réseaux et d’empêcher toute triche

J'utilise la version 1.6 de la SFML (juste pour préciser)

Le jeu est Full TCP (pas d'UDP), il faut regarder le protocole réseau si cela vous semble bizarre car sa marche du tonnerre !

Le programme démarre sur une Shell en SFML, pas de menu, c'est plus pratique pour tester, plusieurs commandes :
  • /help : décrit chaque commandes disponible.
  • /duplex (port) : reset les données du programme et lance un serveur puis un client, très pratique pour joueur rapidement
  • /server (port) : lance un serveur de jeu, très pratique pour spécialiser un machine comme serveur sur le réseau
  • /client (port) (IP) : lance un client et le connecte a un serveur
  • /reset : éteins le client et le serveur si ils étaient lance.
  • /msg (string) : demande au serveur de broadcast un message a tous les client
  • /stat : informe si un client ou un serveur sont en cours d'utilisation
  • /exit : ancienne commande (Alt+F4 marche mieux;) ) pour quitter le programme
  • /join (color) : prend « red » ou « blue » comme argument, sert a rejoindre un camps
  • /ip : affiche l'IP locale de la machine, très pratique pour informer les autres de l'IP sur laquelle se connecter si on héberge la partie.



Avancement (dimanche 29 juillet 2012)

  • les unités  et leurs effets actifs/passifs sont finie (enfin, je cheat encore un peu l’unité finale)
  • Tous les bâtiment et leurs effets actifs/passifs sont fait
  • Système d’évolution des unités fonctionnel
  • Système des buffs d'unités et bâtiments fonctionnel
  • Système d'attaque/soin et d'aura fonctionnel
  • Système de camouflage et aura d’invisibilité fonctionnel
  • Réseau stable est optimisé
  • Carte maximale de 255x255 cases
  • transmission et affichage des modification des HP, shieldHP et buff
  • priorité aux bouclier pour les collisions des projectiles adverses
  • Projectiles avec durée de vie et non coordonnée a atteindre
  • optimisation du rendu du brouillard de guerre

En cours :
  • Je pars 2 semaines en Angleterre, je ne pense pas que le projet avancera vite, dsl

Reste :
  • Nettoyage du code avant diffusion
    • revue de la conception globale du programme
    • rendre la partie Network générique
    • Concentrer dans des class communes les nouveaux éléments communs de manière logique
    • Séparer proprement le projet dans des fichier source nommée de manière logique
    • Séparer proprement le projet dans des répertoire nommée de manière logique

A venir :
  • HUD avec les ressources actuelles en triangles
  • HUD avec statut de l’unité sélectionné
  • HUD avec Minimap
  • représentation plus graphique de la vie et de l’état des boucliers
  • Contrôle manuel des unités
  • Véritable carte stockable et loadable

Idees a confirmer :
  • XP aux unités et bâtiments, attribution d'un grade augmentant l'efficacité
  • HUD avec explication de l’unité sélectionnée
  • nouvelle race aerienne : les "double polygon"
  • nouvelle race modifiant le terrain : les "spheres"
  • nouvelle race specialiste des debuff : les "electrons"
  • modification de la carte par certaine attaques
  • unité kamikaze
  • unité poseuse de mine
  • unité avec un tir orbital
  • unité pouvant modifier le terrain
  • unité avec tir d'attaque ou de soin rebondissant plusieurs fois
  • unité avec aura de debuff
  • unité avec aura infligeant des dégâts et laissant juste 1 PV a ses victimes
  • unité radar (différent du triangle, on sait qu'il y a quelque-chose sans savoir quoi)
  • unité avec un tir (ou une aura) ralentissant le temps des ennemis
  • unité pulsar infligeant des degats de zone tout autour d'elle
  • Carte avec élément interactifs, voir des aura fixe qui buff/debuff
  • capacités spéciales obtenu lors de certaine construction
    • balayage radar d'une zone de la carte
    • groupe d’unité clone en leurre holographique
    • bouclier géant temporaire et impénétrable
    • berzerk doublant la fréquence/puissance de tir d'un groupe d’unité
    • surproduction sans pouvoir faire de sacrifice/évolution pendant un temps
    • soin de zone sur les unités et bâtiments
  • arbre de talent modifiant les unités/bâtiments
  • unité expérimentales prenant + d'une case d'espace

Notes Diverses :
  • Le déplacement de plus de 100 unités ralentit le serveur, mettre une limite ou optimiser le pathfinder
  • prévoir ce qu'un tricheur pourra faire des infos reçu du serveur



[attachment deleted by admin]
« Modifié: Août 01, 2012, 11:47:15 am par marchred »

actuenligne

  • Full Member
  • ***
  • Messages: 129
    • Voir le profil
Re : [C++][RTS 2D] PolygonWars
« Réponse #1 le: Juillet 26, 2012, 12:12:09 pm »
Salut !

Ton jeu a l'air très intéressant. J'aime beaucoup les RTS, et j'ai hâte de pouvoir le tester  :D

Pourrais-tu m'en dire un peu plus sur le choix du protocole TCP ? Ca peut sembler étrange pour un jeu en temps réel (c'est bien en temps réel hein ?)

Bonne continuation !

marchred

  • Newbie
  • *
  • Messages: 19
    • Voir le profil
    • E-mail
Re : [C++][RTS 2D] PolygonWars
« Réponse #2 le: Juillet 26, 2012, 01:35:38 pm »
@actuenligne

Hello!

Merci de porter de l’intérêt a mon petit projet :), c'est la première fois que j'en publie un donc c'est plutôt cool !

Pour le tester je pensais fournir directement les sources (je pense beaucoup a faire de l'Open Source), de cette manière cela marchera sur plein de machines tout en ayant des avis externe sur ma façon de programmer, mais avant je souhaite finir plusieurs petite choses, et nettoyer mon code ;), d'ici une semaine ce sera bon je pense.

Sinon oui oui! C'est en temps réel ne t’inquiète pas!
Pour ce qui est du réseau, je comprend que cela choque, pourtant c'est tout bête :
  • a la base, les unités se déplacent case par case
  • donc quand une unité est en mouvement, je précise sa case actuelle et la case voisine ou elle va se rendre
  • le client reçois ces deux case et effectue l'animation de déplacement de l’unité entre les deux cases
  • si la vitesse de déplacement de l’unité cote serveur et cote client est la même alors il n'y a aucun ralentissement
  • A cela se rajoute quelque petite astuce pour économiser des octets a l'envoi des packets
    • l'ID le la requête de déplacement d'une unité tiens sur 1 sf::Uint8, cela me limite a 255 requêtes, mais cela me va
    • l'ID d'une unité tiens sur 1 sf::Uint8, de cette manière je peut créer et gérer 255 unités par camps, honnêtement c'est beaucoup
    • la position d'une case tiens sur 2 sf::Uint8,cela limite a des maps de 255*255, mais c'est pas mal non?
    • donc en résumer mon packet d'update ressemble a cela:
      • (1o requête de déplacement)(1o ID unité)(1o x source)(1o y source)(1o x destination)(1o y destination)
      • 6 octets pour une seule requête de déplacement d'une seule unité, pas trop mauvais non ?
  • Puis je concatène chaque requête de chaque unité de la frame dans un sf::packet encrypté
  • Enfin, j'envoie aux clients du même camps que l’unité, et au client du camps ennemis si ils voient l’unité
PS: je suis sur une clavier QWERTY, dsl d'avance pour les accents qui manquent ;)

actuenligne

  • Full Member
  • ***
  • Messages: 129
    • Voir le profil
Re : [C++][RTS 2D] PolygonWars
« Réponse #3 le: Juillet 26, 2012, 01:44:05 pm »
Merci pour ta réponse  :)

C'est une vision intéressante d'un sujet très riche : l'architecture réseau.
Si j'ai bien compris, c'est le fait que les unités se déplacent cases par cases qui permet l'utilisation du TCP !

Je reviendrai sur le topic de temps à autre pour voir si une version jouable est disponible (mais je ne veux surtout pas mettre une quelconque pression hein !)  ;)

Rexou

  • Newbie
  • *
  • Messages: 9
    • Voir le profil
    • E-mail
Re : [C++][RTS 2D] PolygonWars
« Réponse #4 le: Juillet 27, 2012, 09:44:10 am »
Une idée ma foi plutôt pas mal avec un gameplay qui promet !
Tu as pris pas mal de recul sur ton projet et ça c'est cool, ça change des projets un peu trop ambitieux
qui ne verront malheureusement jamais le jour.

J'attends avec impatience les premières démos :)
Un petit github quand tu auras une version propre et stable ? Ton protocole réseau et la manière dont tu gères
le dispatching des events pourraient servir a pas mal de monde ici.

PS (Hors sujet ):
- Je ne suis pas un exemple pour les accents sur clavier qwerty mais si tu y tiens regarde du cote de la commande setxkbmap
avec une certaine compose key :)

marchred

  • Newbie
  • *
  • Messages: 19
    • Voir le profil
    • E-mail
Re : [C++][RTS 2D] PolygonWars
« Réponse #5 le: Juillet 27, 2012, 10:54:59 am »

@actuenligne

« Si j'ai bien compris, c'est le fait que les unités se déplacent cases par cases qui permet l'utilisation du TCP ! »

C'est peut être valable pour les déplacements 'normaux' je réfléchis beaucoup a ce que sera PolygonWars2 (oui je sais le 1 est pas encore finis ;) ) et je me dis que c'est finalement hautement faisable, mais la priorité c'est de finir correctement ce projet, il est a la portée de beaucoup de monde, il pourra peut-être devenir ce 'tremplin' qui manque dans le domaine des RTS open source (c'est ce que je pense après j'ai peut être mal cherché).

@Rexou

« Tu as pris pas mal de recul sur ton projet et ça c'est cool, ça change des projets un peu trop ambitieux qui ne verront malheureusement jamais le jour. »

Je ne m'en étais pas rendu compte mais tu as raison, sur le coups j'ai compté le nombre de projet personnel inachevé que j'ai produit depuis que je sais programmer, il y en a une bonne centaine, cela va du FPS bancal aux Shoot comme Ikaruga (sans parler de mes tentative de refaire Minecraft...), ils sont fonctionnels mais ne représente pas de jeux a eux seul, la, avec PolygonWars, je compte changer, d'ou mon post sur ce forum, car ce projet la, je vais le finir ! ;)


« Un petit github quand tu auras une version propre et stable ? »

Volontiers ! :)


« Je ne suis pas un exemple pour les accents sur clavier qwerty mais si tu y tiens regarde du cote de la commande setxkbmap »

Je note ! Merci ! :)

 

anything