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

  1. #1
    Candidat au 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
    Points : 3
    Points
    3
    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 : 1573
Taille : 1,77 Mo

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

  2. #2
    Membre confirmé

    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
    Points : 503
    Points
    503
    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.
    Le temps ronge l'amour comme l'acide.

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 252
    Points : 649
    Points
    649
    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 confirmé

    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
    Points : 503
    Points
    503
    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é
    Le temps ronge l'amour comme l'acide.

  5. #5
    Candidat au 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
    Points : 3
    Points
    3
    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 confirmé
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 252
    Points : 649
    Points
    649
    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.

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 252
    Points : 649
    Points
    649
    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.

  8. #8
    Candidat au 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
    Points : 3
    Points
    3
    Par défaut
    Merci une nouvelle fois pour vos réponses, c'est hyper intéressant. J'ai essayé de travailler un peu en accordant le programme que bistouille à fait et le mien.
    Seulement je bloque...
    Déjà dans le programme que Bistouille a fait, je n'arrive pas a poser le cercle sur la grille, python me renvoie une erreur systématiquement...

    De plus, il est vrai que je ne me suis pas posé encore toute les questions pour avancer le programme...

    Ensuite oui je vois notre jeu a l'époque des chevalier, puisqu'il faut défendre un château :p

    En ce qui concerne les tours, j'ai prévu un model économique du style
    - 100 crédit pour une tour simple
    - 300 crédit pour une tour plus avancée
    - seulement 200 crédit pour transformer une tour simple en avancée.
    (model économique a étudier pour que ce ne soit ni trop facile, ni trop difficile)

    Les tours ne tireront uniquement de droite a gauche,
    donc première vague, les ennemis n’apparaîtront qu'au milieu, vague numéro 2, les ennemis apparaîtront sur les 3 lignes du centre, à partir de la vague 3, il apparaîtront partout.

    Pour représenter les tirs je ferai une petite image de flèche sous piskel.

    Nouvelle version, selec.py
    Nom : vide3.png
Affichages : 1334
Taille : 228 octets

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 252
    Points : 649
    Points
    649
    Par défaut
    Citation Envoyé par Nelion Voir le message
    J'ai essayé de travailler un peu en accordant le programme que bistouille à fait et le mien.
    Certes mais attention que le code reste bien le tien, que tu le comprennes surtout, car là j'ai l'impression que 2 personnes sont derrière.
    Citation Envoyé par Nelion Voir le message
    Déjà dans le programme que Bistouille a fait, je n'arrive pas a poser le cercle sur la grille, python me renvoie une erreur systématiquement...
    Comme conseillé faut découper ton travail, faire les tests séparemment… Déjà afficher la grille par toi-même en t'aidant de son code. Pense aussi vraiment aux articles du site car apprendre par l'erreur ça a ses limites et certains couvrent exactement ces sujets. Sinon quelle erreur ? Faut aussi être plus descriptif dans ton problème car c'est pas à nous de décrypter ton code.

    Cool concernant les précisions de la jouabilité tant mieux si ça progresse. Une nouvelle révolution contre les nobles est en marche !!

  10. #10
    Candidat au 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
    Points : 3
    Points
    3
    Par défaut
    Le soucis dans le code que Bistouille m'a gentiment aidé se situe à la ligne 96, python renvoie une erreur systématique...

    Traceback (most recent call last):
      File "<string>", line 368, in rem_compile
      File "H:\Projet DorianTed\module1.py", line 96
        if dupliquer_item(*event.pos, item_en_selection):
                                                        ^
    SyntaxError: only named arguments may follow *expression

    la ligne 96 d'origine:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if dupliquer_item(*event.pos, item_en_selection):
    J'ai regardé, et je me suis dit que cela venait peu être de l'étoile (*), je l'ai donc retirée et ai relancé programme, ce coup ci, il fonctionne, je peu sélectionner le rond rouge, il s'encadre alors en jaune, mais lorsque je décide de le placer sur la grille le programme plante, python me renvoie une erreur:

    Traceback (most recent call last):
      File "<string>", line 420, in run_nodebug
      File "H:\Projet DorianTed\module1.py", line 96, in <module>
        if dupliquer_item(event.pos, item_en_selection):
    TypeError: dupliquer_item() missing 1 required positional argument: 'item_a_dupliquer'
    La ligne 96 (modifiée) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if dupliquer_item(event.pos, item_en_selection):
    Je ne comprend pas trop pourquoi cela ne fonctionne pas, j'ai essayer d'étudier le petit programme en détail, mais mes connaissances sont trop manquante, si vous avez une réponse je vous en remercie.
    Bonne soirée, Nelion

  11. #11
    Membre confirmé

    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
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Salut.

    Cette syntaxe ne fonctionne pas, car tu dois certainement utiliser une version de python antérieure à la 3.5.

    Il faut alors modifier en conséquence.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    x, y = event.pos
    if dupliquer_item(x, y, item_en_selection):
        # reste de la condition
    Ou alors garder event.pos en paramètre, et modifier la fonction dupliquer_item afin qu'elle reçoive 2 paramètres au lieu de 3, et modifier ce qu'il y a à modifier dans le corps de la fonction.
    Le temps ronge l'amour comme l'acide.

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 252
    Points : 649
    Points
    649
    Par défaut
    Citation Envoyé par Nelion Voir le message
    Je ne comprend pas trop pourquoi cela ne fonctionne pas, j'ai essayer d'étudier le petit programme en détail, mais mes connaissances sont trop manquante
    Je réitère donc que partir d'un code qui n'est pas le tien est à double-tranchant. Ça serait mieux d'en produire un à partir de tes connaissances justement ! Qu'est-ce qu'on t'a appris ? De quels outils tu disposes pour réaliser ton projet ? Après la solution qu'on t'a donné reste une piste utile mais faut pas chercher à la décortiquer dans tous les sens.

  13. #13
    Candidat au 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
    Points : 3
    Points
    3
    Par défaut
    Merci pour cette précision bistouille,
    En ce qui conserne ce que l'on a vu... pas grand chose. Le cours sur Pygame etait un cours sur internet. Donc on se débrouille pour faire plus ou moins comme on peu.

    J'ai décidé de changer le jeu, pour le simplifier un peu plus.
    Il ne s'agit plus de jouer sur une grille, j'ai simplement fait un itinéraire obligatoire.

    J'ai seulement changé la facon de faire la grille, je l'ai fait avec une liste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    plan=[
        [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
        [0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0],
        [0,1,1,1,1,1,1,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0],
        [0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0],
        [1,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,1,1,1,1,1],
        [0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0],
        [0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0],
        [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
        ]

    Avec, en 1 le chemin que les ennemis doivent emprunter.
    et en 0 les zones constructibles.

    Mon code ressemble a ça désormais:
    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
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    import pygame, sys, random
    from pygame.locals import *
    import pygame as pg
    from pygame import gfxdraw
     
    pygame.init()
    fen=pygame.display.set_mode((1280,720))
    pygame.display.set_caption("Casse MATH")
    FPS = 30
    BLANC=(255,255,255)
    NOIR=(0,0,0)
    COULEUR_ECRAN = (0, 0, 0, 255)
    JAUNE=(255,255,0)
    pygame.init()
    pygame.key.set_repeat(400,10)
     
    plan=[
    #----0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3
        [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
        [0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0],
        [0,1,1,1,1,1,1,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0],
        [0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0],
        [1,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,1,1,1,1,1],
        [0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0],
        [0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0],
        [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
        ]
     
    chemin=pygame.image.load("path.jpg")
    terre=pygame.image.load("Grass.jpg")
    groupe_affichage = pg.sprite.Group()
     
    attributs_tour = dict(
        dimension=(80, 80),
        position=(100, 600),
        couleur=pg.Color('red'),
    )
    attributs_tour2 = dict(
        dimension=(80, 80),
        position=(500, 600),
        couleur=pg.Color('orange'),
    )
    attributs_tour3 = dict(
        dimension=(80, 80),
        position=(900, 600),
        couleur=pg.Color('green'),
    )
     
    image_cercle = pg.Surface(attributs_tour['dimension'])
    image_cercle.fill((70, 70, 70, 255))
    gfxdraw.filled_circle(image_cercle, 40, 40, 35, attributs_tour['couleur'])
    cercle = pg.sprite.Sprite(groupe_affichage)
    cercle.image = image_cercle
    cercle.rect = image_cercle.get_rect()
    cercle.rect.topleft = attributs_tour['position']
     
    image_cercle2 = pg.Surface(attributs_tour2['dimension'])
    image_cercle2.fill((70, 70, 70, 255))
    gfxdraw.filled_circle(image_cercle2, 40, 40, 35, attributs_tour2['couleur'])
    cercle = pg.sprite.Sprite(groupe_affichage)
    cercle.image = image_cercle2
    cercle.rect = image_cercle2.get_rect()
    cercle.rect.topleft = attributs_tour2['position']
     
    image_cercle3 = pg.Surface(attributs_tour3['dimension'])
    image_cercle3.fill((70, 70, 70, 255))
    gfxdraw.filled_circle(image_cercle2, 40, 40, 35, attributs_tour3['couleur'])
    cercle = pg.sprite.Sprite(groupe_affichage)
    cercle.image = image_cercle3
    cercle.rect = image_cercle3.get_rect()
    cercle.rect.topleft = attributs_tour3['position']
     
    attributs_focus = dict(dimension=(84, 84), 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 dessineChemin(fen,x,y):
        return(fen.blit(chemin,(x,y)))
     
     
    rectChem=[]
    for x in range(24):
            for y in range(8):
                if plan[y][x]==1:
                    rectChem.append(fen.blit(chemin,(53*x,67*y)))
    rectterre=[]
    for x in range(24):
            for y in range(8):
                if plan[y][x]==0:
                    rectterre.append(fen.blit(terre,(53*x,67*y)))
     
     
     
    def dessineFond(fen,rectChem):
        for br in rectChem:
            fen.blit(chemin,br)
     
    def dessineTerre(fen,rectterre):
        for br in rectterre:
            fen.blit(terre,br)
     
    fen.fill(NOIR)
    dessineFond(fen,rectChem)
    dessineTerre(fen,rectterre)
    pygame.display.update()
     
     
     
     
    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]) // 80
        dy = (y - attributs_grille['position'][1]) // 80
        x = attributs_grille['position'][0] + dx * 80
        y = attributs_grille['position'][1] + dy * 80
        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')
                        x, y = event.pos
                        if dupliquer_item(x, y, 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)
        groupe_affichage.draw(fen)
        pg.display.update()
     
    pg.quit()
    Seulement, comme j'ai modifié la façon dont j'initialise la grille, je n'arrive plus a placer les tours (symbolisées par des ronds pour le moment)
    J'ai ensuite aucune idée de comment faire pour créer les ennemis et leurs déplacements...
    Images attachées Images attachées   

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 252
    Points : 649
    Points
    649
    Par défaut TD vs. shmup
    Citation Envoyé par Nelion Voir le message
    En ce qui conserne ce que l'on a vu... pas grand chose. Le cours sur Pygame etait un cours sur internet. Donc on se débrouille pour faire plus ou moins comme on peu.
    Bizarre généralement le but d'un exercice c'est de mettre en pratique. Ça me semblerait bizarre qu'on vous ait juste appris à ouvrir une fenêtre avec la biblio. Gestion des fichiers ? Les tableaux et autres chaînes de caractères ?

    Citation Envoyé par Nelion Voir le message
    J'ai décidé de changer le jeu, pour le simplifier un peu plus.
    Il ne s'agit plus de jouer sur une grille, j'ai simplement fait un itinéraire obligatoire.
    Grille, plan… Ça reste un niveau constitué de tuiles ! Par contre comment procéder pour que les ennemis suivent cet itinéraire ? Ahah !!

    Citation Envoyé par Nelion Voir le message
    Seulement, comme j'ai modifié la façon dont j'initialise la grille, je n'arrive plus a placer les tours (symbolisées par des ronds pour le moment)
    Tu les plaçais seulement visuellement ou aussi dans un tableau ? Quel est leur numéro dans ton "plan" ?
    Citation Envoyé par Nelion Voir le message
    J'ai ensuite aucune idée de comment faire pour créer les ennemis et leurs déplacements...
    D'où ma question sournoise héhé. Déjà en déplacer un à l'horizontal ça aurait été un bon début…

    Comme modèle pour pas trop t'éloigner dans ton imaginaire débordant je te renvois à des classiques comme Space Invaders. Une flotte d'aliens serpentant de haut en bas, un vaisseau capable de tirer et des blocs destructibles pour se cacher derrière… Un TD c'est pas loin d'un shoot them up parfois ! Une évolution dans la série Galaga ça avait été justement que les ennemis suivaient des trajectoires plus élaborées, se déplaçaient selon des courbes… La stratégie pour gagner ? GAME OVER ! Galaga '88 forever !!

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, 11h29
  2. [Projet terminé] Extreme Carnage [2D SDL] (shoot/tower defense)
    Par Lightness1024 dans le forum Projets
    Réponses: 2
    Dernier message: 14/04/2010, 16h34
  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, 13h18
  4. [DS] [homebrew] Warcraft : tower defense
    Par gege2061 dans le forum Consoles
    Réponses: 0
    Dernier message: 17/09/2008, 11h33
  5. Warcraft 3 Tower Defense
    Par bakaneko dans le forum Web
    Réponses: 23
    Dernier message: 26/01/2007, 18h14

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