IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Programmation multimédia/Jeux Python Discussion :

Développement d'un tower Defense


Sujet :

Programmation multimédia/Jeux Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Avril 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Avril 2019
    Messages : 6
    Par défaut Développement d'un tower Defense
    Bonjour à tous, je suis Dorian, élève de Terminale S, spécialité ISN
    Je poste ici ce message car j'ai besoin d'aide. Avec mon camarade, on a décidé comme projet de fin d'année de réaliser un jeu du style 'tower defense' (Un peu a la Plant VS Zombies)
    Seulement je suis un peu bloqué, je sais pas trop par ou chercher...
    J'ai commencé à développer un programme et j'ai une idée claire et précise de ce que je souhaite faire, mais c'est compliquer a mettre en place.
    Nous utilisons pygame.
    Je vous met en lien le développement actuel du projet.
    Le but et de défendre le château, situé au milieu, à gauche de la grille de jeu en utilisant des obstacles et des tours pour ralentir l'ennemi (l'ordinateur).
    J'ai essayer plus ou moins d'avancer. L'interface graphique est super simple mais c'est en gros ce que je recherche.

    Mon problème:
    -Gérer des zones cliquable pour sélectionner des obstacles.
    -Une fois que l'obstacle et sélectionné pouvoir le placer sur la grille
    -Gérer les ennemis, qui peuvent se déplacer de droite vers la gauche, de haut en bas mais pas vers la droite. (Que je symbolise par un point rouge plus ou moins gros en fonction de la quantité d'ennemis sur la case
    -Gérer le scoreboard.

    J'ai l'impression que c'est assez compliqué. Mais si quelqu’un a quelques minutes à perdre pour m'aider, en me donnant des pistes ou des bouts de codes, je lui en remercie d'avance.

    Je suis joignable ici ou via discord: Nelion_ #5719

    Un GRAND merci d'avance. Dorian

    Maquette:
    Nom : thumbnail_Image-6.png
Affichages : 1729
Taille : 1,77 Mo

    Programme 'A jour'
    https://www.dropbox.com/sh/plgfkzefh...EpdAOXl0a?dl=0

  2. #2
    Membre très actif

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Billets dans le blog
    1
    Par défaut
    Salut.

    C'est quand même pas très bien embarqué, car pour le moment à part afficher des images, il n'y a rien d'autres.

    Il faut pour chacun de tes problèmes, faire de simples tests jusqu'à réussir à le faire fonctionner indépendament comme souhaité.

    => Gérer des zones cliquable pour sélectionner des obstacles.

    Pour ça déjà, on peut simplifier en commencant par créer une simple grille virtuelle de telle dimension.
    Ensuite on cherche :
    - Comment détecter un clic souris avec pygame.
    - Comment récupérer la coordonée d'un clic souris avec pygame.

    Une fois que l'on a récupérer ces infos, on réfléchi comment faire pour dupliquer un élement dans la fenêtre.
    On en arrive à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    import pygame as pg
    from pygame import gfxdraw
     
    LARGEUR_ECRAN = 600
    HAUTEUR_ECRAN = 400
    COULEUR_ECRAN = (0, 0, 0, 255)
    FPS = 30
     
     
    ecran = pg.display.set_mode((LARGEUR_ECRAN, HAUTEUR_ECRAN))
     
    groupe_affichage = pg.sprite.Group()
     
     
    attributs_grille = dict(
        dimension=(400, 200), # grille de 10 × 5 avec dimension de 40px
        position=(25, 100),
    )
    image_grille = pg.Surface(attributs_grille['dimension'])
    image_grille.fill(pg.Color('lightBlue'))
    grille = pg.sprite.Sprite(groupe_affichage)
    grille.image = image_grille
    grille.rect = image_grille.get_rect()
    grille.rect.topleft = attributs_grille['position']
     
     
    attributs_cercle = dict(
        dimension=(40, 40),
        position=(20, 20),
        couleur=pg.Color('red'),
    )
    image_cercle = pg.Surface(attributs_cercle['dimension'])
    image_cercle.fill((33, 33, 33, 255))
    gfxdraw.filled_circle(image_cercle, 20, 20, 15, attributs_cercle['couleur'])
    cercle = pg.sprite.Sprite(groupe_affichage)
    cercle.image = image_cercle
    cercle.rect = image_cercle.get_rect()
    cercle.rect.topleft = attributs_cercle['position']
     
     
    attributs_focus = dict(dimension=(44, 44), couleur=pg.Color('yellow'))
    image_focus = pg.Surface(attributs_focus['dimension']).convert_alpha()
    image_focus.fill((0, 0, 0, 0))
    focus = pg.sprite.Sprite()
    focus.image = image_focus
    focus.rect = image_focus.get_rect()
    gfxdraw.rectangle(image_focus, focus.rect, attributs_focus['couleur'])
     
     
    def selectionner_item(item):
        global item_en_selection
        item_en_selection = item
        focus.add(groupe_affichage)
        focus.rect.center = item.rect.center
     
     
    def deselectionner_item():
        global item_en_selection
        item_en_selection = None
        focus.remove(groupe_affichage)
     
     
    def dupliquer_item(x, y, item_a_dupliquer):
        dx = (x - attributs_grille['position'][0]) // 40
        dy = (y - attributs_grille['position'][1]) // 40
        x = attributs_grille['position'][0] + dx * 40
        y = attributs_grille['position'][1] + dy * 40
        if (x, y) in items_places:
            return False
        item = pg.sprite.Sprite(groupe_affichage)
        item.image = item_a_dupliquer.image.copy()
        item.rect = item.image.get_rect()
        item.rect.topleft = x, y
        items_places[(x, y)] = item
        return True
     
     
    items_places = {}
    item_en_selection = None
    clock = pg.time.Clock()
    tournicoton = True
     
    while tournicoton:
        clock.tick(FPS)
        for event in pg.event.get():
            if event.type == pg.QUIT:
                tournicoton = False
                break
            elif event.type == pg.MOUSEBUTTONDOWN:
                if item_en_selection:
                    if focus.rect.collidepoint(event.pos):
                        print('désélection du cercle')
                        deselectionner_item()
                    elif grille.rect.collidepoint(event.pos):
                        print('clic sur la grille')
                        if dupliquer_item(*event.pos, item_en_selection):
                            print('cercle placé sur la grille')
                            deselectionner_item()
                        else:
                            print('position déjà occupée')
                else:
                    if cercle.rect.collidepoint(event.pos):
                        print('sélection du cercle')
                        selectionner_item(cercle)
     
        ecran.fill(COULEUR_ECRAN)
        groupe_affichage.draw(ecran)
        pg.display.update()
     
    pg.quit()
    Bien évidemment, ce n'est qu'un simple exemple et il faut déjà avoir tâté un peu de pygame pour en arriver là, dans ton jeu les surfaces seront tes images, dans ce code je n'ai volontairement pas utilisé d'objet, car déjà comme ça, je pense que tu ne vas pas comprendre facilement le fonctionnement. Les sprites sont un composant essentiels de pygame, et il y a tout intérêt à les utiliser. Vu que ta grille contiendra des bordures, il faudra en tenir compte lorsque tu voudras placer tes obstacles sur ta grille.

    Je ne sais pas dans combien de temps tu dois rendre ton projet, ni combien de temps tu comptes y consacrer, mais si ce temps esr relativement court, tu devrais revoir ton objectif à la baisse en faisant quelque chose de plus simple, car ce que tu souhaites réaliser est tout de même assez compliqué pour un néophyte en python et pygame.

    Bonne chance.

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 252
    Par défaut
    Citation Envoyé par bistouille Voir le message
    C'est quand même pas très bien embarqué, car pour le moment à part afficher des images, il n'y a rien d'autres.

    Il faut pour chacun de tes problèmes, faire de simples tests jusqu'à réussir à le faire fonctionner indépendament comme souhaité.
    Sa démarche est quand même encourageante et c'est déjà un bon début de lister quelques "problèmes". Pour ces derniers je préfère raisonner en terme de besoins, fonctionnalités, éléments de jouabilité… C'est quand même plus sympa !

    Citation Envoyé par bistouille Voir le message
    tu devrais revoir ton objectif à la baisse en faisant quelque chose de plus simple, car ce que tu souhaites réaliser est tout de même assez compliqué pour un néophyte en python et pygame.
    En effet et il faudrait clarifier les règles car le piège serait de proposer trop d'obstacles/tours et rendre ainsi la jouabilité déséquilibrée. Quand j'avais envisagé un projet similaire je m'étais dit que le plus simple serait sans doute de la baser sur un titre existant et auquel j'avais beaucoup joué.

    Sinon pour le reste comme tu es nouveau je t'invite comme d'autres à fouiner sur les forums et le site. Certaines dernières discussions (Ton histoire de gauche/droite, interface graphique en SDL…) te seront utiles, les nombreux didacticiels "gamedev" dont certains 100% Python. Je me souviens de celui pour un morpion notamment. Une grille, des ronds/croix à placer… Des similitudes avec ton projet !

    Bon courage et n'hésite pas à créer une discussion pour ton projet dans le forum dédié.

  4. #4
    Membre très actif

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Billets dans le blog
    1
    Par défaut
    Salut.

    Citation Envoyé par ohnomorejmmings Voir le message
    Sa démarche est quand même encourageante et c'est déjà un bon début de lister quelques "problèmes". Pour ces derniers je préfère raisonner en terme de besoins, fonctionnalités, éléments de jouabilité… C'est quand même plus sympa !
    Je n'ai jamais dit le contraire, mais les quelques problèmes sont en réalités les bases du fonctionnement d'un jeu, surtout la gestion des événements qui n'est pas chose aisée si on n'a pas au moins expérimenté un tant soit peu le fonctionnement d'une interface graphique bac à sable. Et comme c'est un projet de fin d'année, cela me parait un peu court en temps pour assimiler tout ça tout en développant en même temps ce jeu. Mais seul Nelion peut nous en dire plus sur ce point, si un jour il repasse par ici

    Citation Envoyé par ohnomorejmmings Voir le message
    Quand j'avais envisagé un projet similaire je m'étais dit que le plus simple serait sans doute de la baser sur un titre existant et auquel j'avais beaucoup joué.
    C'est ce qu'il a fait, son jeu se veut être un plants vs zombies très simplifié

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Avril 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Avril 2019
    Messages : 6
    Par défaut
    Merci beaucoup pour vos réponses.
    Je pense que je vais simplifier le programme dans un premier temps en disant que la partie a défendre et la ligne de gauche et en interdisant les mouvement haut bas et diagonales des ennemis en les faisant apparaître aléatoirement sur la colonne de droite, ce qui simplifiera pas mal le programme.
    Ensuite je pense mettre 3 types de défense
    -Une mine, permettant de recharger en crédits,
    -Une tour d'archer, faible dégâts, faible résistance mais low cost
    -Une tour un peu plus évoluée. Plus chère mais plus résistante.

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 252
    Par défaut
    Citation Envoyé par Nelion Voir le message
    Je pense que je vais simplifier le programme dans un premier temps en disant que la partie a défendre et la ligne de gauche et en interdisant les mouvement haut bas et diagonales des ennemis en les faisant apparaître aléatoirement sur la colonne de droite, ce qui simplifiera pas mal le programme.
    Bonne idée pour les directions même si un déplacement gauche ou droite change pas grand chose. Quant au côté aléatoire une fois que ça sera fait on en reparlera sans doute… Suspens chaque chose en son temps mon seigneur !
    Citation Envoyé par Nelion Voir le message
    -Une mine, permettant de recharger en crédits,
    Une mine au temps des chevaliers ?!
    Citation Envoyé par Nelion Voir le message
    -Une tour d'archer, faible dégâts, faible résistance mais low cost
    -Une tour un peu plus évoluée. Plus chère mais plus résistante.
    On pourra les améliorer ? Leurs tirs seront représentés comment ? Elles pourront tirer dans quelles directions ? C'est important de clarifier ta jouabilité afin de gagner du temps pour coder.

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 252
    Par défaut
    Citation Envoyé par bistouille Voir le message
    la gestion des événements qui n'est pas chose aisée si on n'a pas au moins expérimenté un tant soit peu le fonctionnement d'une interface graphique bac à sable.
    On est pas obligé d'en faire une très élaborée et rien qu'en se basant sur la doc officielle on gère rapidement la souris & Cie. Astuce : Penser au début à utiliser le clavier pour déclencher certains évènements comme par exemple l'apparition d'un ennemi ou le placement de ses défenses. Ensuite on peut rendre l'interface plus ergonomique…

    Citation Envoyé par bistouille Voir le message
    C'est ce qu'il a fait, son jeu se veut être un plants vs zombies très simplifié
    Oui mais je pensais carrément copier une jouabilité afin d'en tester une déjà éprouvée. Château, maintenant des archers sont mentionnés… Ça me fait penser au petit jeu Flash Tudors Defense ! On le trouvait sur le site officiel de la série et peut-être qu'il est encore dispo.

Discussions similaires

  1. [Projet en cours] Arcane's Tower defense : Wrath of the Gob King (XNA WP7)
    Par CriPpLe dans le forum Projets
    Réponses: 67
    Dernier message: 17/10/2011, 10h29
  2. [Projet terminé] Extreme Carnage [2D SDL] (shoot/tower defense)
    Par Lightness1024 dans le forum Projets
    Réponses: 2
    Dernier message: 14/04/2010, 15h34
  3. [Projet en cours] Recherche Artistes - Empire Defense - Multijoueur Tower Defense
    Par Crystalin dans le forum Projets
    Réponses: 2
    Dernier message: 17/11/2009, 12h18
  4. [DS] [homebrew] Warcraft : tower defense
    Par gege2061 dans le forum Consoles
    Réponses: 0
    Dernier message: 17/09/2008, 10h33
  5. Warcraft 3 Tower Defense
    Par bakaneko dans le forum Web
    Réponses: 23
    Dernier message: 26/01/2007, 17h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo