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

Python Discussion :

Temporiser le tir ?


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 8
    Par défaut Temporiser le tir ?
    Bonjour tout le monde,

    Est-il possible de temporiser les tirs de mon avion via un delay ou autre sans bloquer le programme ? J'ai passé 3h à checher sur le forum et le net, j'ai vu des class et des defs mais je ne comprends pas comment implémenter ça dans mon programme.
    Je voudrais gérer les tirs de mon missile (via la touche espace, voir dans mon code) sans que cela interfère sur l'avion ou le fond qui défile, et mettre un intervalle de 3s entre deux tirs pour éviter ça : Nom : bug.JPG
Affichages : 955
Taille : 35,7 Ko
    import pygame
    from pygame.locals import *
    import time

    VERSION = "0.7"

    try:
    pygame.init()
    pygame.font.init()
    pygame.display.init()
    horloge = pygame.time.Clock()
    pygame.display.set_caption('Top Gun 2D')
    ecran = pygame.display.set_mode((1280, 720), pygame.FULLSCREEN) #Crée la fenêtre de tracé
    pygame.display.flip() #L'affichage devient effectif : l'image est rendue visible.
    pygame.key.set_repeat(50, 30) #Au bout de 50ms d'appui sur la touche, python ré-envoie une instruction d'appui sur celle ci, puis toutes les 30ms
    #variations de coordonées de 30ms choix excellent qui permet d'éviter de faire ramer le pc et n'est pas trop rapide pour l'oeil, qui voie les bords de l'avion en double sinon.
    continuer = 1 #Initialisation des variables
    fullscreen = 1
    abscisse = 720
    ordonnee = 480
    tir = 10
    tir = pygame.image.load("missile.png")
    son_tir = pygame.mixer.Sound("son_tir.ogg")
    list_missile=[] # tableau des missiles
    fond1 = pygame.image.load('fond.jpg')
    fond2 = pygame.image.load('fond.jpg') #charge deux fonds différents : ce procédé est expliqué sur le site de Dorian.
    ordonnee_fond1 = 0
    ordonnee_fond2 = fond1.get_height() #Permet de déifinir l'ordonnée du fond n°2 en fonction de la hauteur du premier : cela permet de changer l'image de fond sans redéfinir la hauteur du blit dans le script!
    chasseur_f14=pygame.image.load("f14.png")
    pos_f14 = pygame.Rect(abscisse,ordonnee,100,100)
    ecran.blit(chasseur_f14,pos_f14)

    while continuer:

    pygame.display.flip()
    ecran.blit(fond1, (0,ordonnee_fond1))
    ecran.blit(fond2, (0,ordonnee_fond2))
    ordonnee_fond1 -= 1
    ordonnee_fond2 -= 1

    if ordonnee_fond1 == -1 * fond1.get_height():
    ordonnee_fond1 = ordonnee_fond2 + fond2.get_height()
    if fond2 == -1 * fond2.get_height():
    ordonnee_fond2 = ordonnee_fond1 + fond1.get_height()

    ecran.blit(chasseur_f14,pos_f14)
    pygame.display.flip()

    # Fait apparaitre les missiles
    for missile in list_missile:
    missile[2]=missile[2]-5
    ecran.blit(missile[0],(missile[1],missile[2]))
    # Fait apparaitre les missiles(image)

    for event in pygame.event.get():
    clav=pygame.key.get_pressed()

    if clav[K_ESCAPE] : #Permet de quitter en appuyant sur la croix
    continuer = 0
    pygame.display.flip()

    if clav[K_F10]: #Permet de bassculer l'affichage en fullscreen ou en une fenêtre que l'on peut redimensionner!
    if fullscreen == 1:
    ecran=pygame.display.set_mode([1280,720],pygame.RESIZABLE)
    fullscreen = 0
    else :
    ecran = pygame.display.set_mode((1280, 720), pygame.FULLSCREEN)
    fullscreen = 1

    if clav[K_UP] :
    ordonnee-=7

    if clav[K_DOWN]:
    ordonnee+=7
    else :
    chasseur_f14=pygame.image.load("f14.png")

    if clav[K_LEFT]:
    abscisse-=7
    chasseur_f14=pygame.image.load("f14l.png")

    if clav[K_RIGHT]:
    abscisse+=7
    chasseur_f14=pygame.image.load("f14r.png")

    pos_f14 = pygame.Rect(abscisse,ordonnee,40,40)
    ecran.blit(chasseur_f14,pos_f14)
    pygame.display.flip()

    horloge.tick(30) #30 frames par seconde : cela influe sur la vitesse de défilement du fond

    if clav [K_SPACE] :
    missile=[tir,abscisse,ordonnee] #initialisation du missile
    pos_tir = pygame.Rect(abscisse,ordonnee,5,10)
    list_missile.append(missile)
    pos_tir= Rect.move(pos_tir, 0,0)
    ecran.blit(tir,pos_tir)
    son_tir.play()
    pygame.time.delay(100)

    finally:

    pygame.quit()
    Merci de me lire !

  2. #2
    Membre éclairé
    Avatar de Captain'Flam
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 273
    Billets dans le blog
    1
    Par défaut
    Bonjour dlang,

    je n'ai pas vraiment lu ton code, mais je pense à une solution toute simple, si tu veux limiter à un tir toutes les 3 secondes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if clav [K_SPACE] and get_time_ms() > next_missile :
        next_missile = get_time_ms()+3000
        missile=[tir,abscisse,ordonnee] #initialisation du missile
        ....
    get_time_ms est une fonction qui renvoie l'heure courante en millisecondes.

    Comme ça, tous les appuis sur ESPACE dans un intervalle inférieur à 3 secondes seront ignorés.

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 8
    Par défaut
    Merci beaucoup, je pense que ça sera encore plus simple! Mais je ne vois pas trop comment faire... La fonction n'est pas reconnue et le next_missile me questionne un peu je n'arrive pas à avancer : à quoi sert cette variable?

  4. #4
    Membre éclairé
    Avatar de Captain'Flam
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 273
    Billets dans le blog
    1
    Par défaut
    La variable next_missile contient l'heure (à la ms près) à partir de laquelle on pourra tirer le prochain missile.
    La fonction get_time_ms reste à écrire : elle doit renvoyer l'heure courante, à la ms près.

  5. #5
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 8
    Par défaut
    Bonjour, je reviens vers vous car je n'ai toujours par réussi à temporiser ce tir... trois semaines que je cherche mais j'arrive vraiment pas à le faire moi-même, quelqu'un peut montrer comment le faire sur mon script tplus haut ?

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 753
    Par défaut
    Citation Envoyé par dlang Voir le message
    Bonjour, je reviens vers vous car je n'ai toujours par réussi à temporiser ce tir... trois semaines que je cherche mais j'arrive vraiment pas à le faire moi-même, quelqu'un peut montrer comment le faire sur mon script tplus haut ?
    Le principe n'est pas si compliqué:
    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
    >>> import time
    >>> next_missile = time.time() + 3
    >>>
    >>> while True:
    ...     shoot = input('::: ')
    ...     now = time.time()
    ...     if now < next_missile:
    ...         print ('ignore')
    ...     else:
    ...         print ('launch missile')
    ...         break
    ...
    :::
    ignore
    :::
    ignore
    :::
    ignore
    :::
    ignore
    :::
    launch missile
    >>>
    >>>
    1. On initialize next_missile à la date où on pourra tirer
    2. Si on recoit un ordre de tir "avant", on l'ignore


    Vu le code que vous avez déjà été capable d'écrire, çà devrait être simple à intégrer.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 06/05/2005, 19h10
  2. [debutant]temporisation
    Par sly33 dans le forum Débuter
    Réponses: 4
    Dernier message: 12/08/2004, 13h56
  3. Temporisation pendant verouillage de l'objet matable
    Par Rdjedidene dans le forum Administration
    Réponses: 14
    Dernier message: 09/06/2004, 10h52
  4. temporisation
    Par forthx dans le forum C
    Réponses: 5
    Dernier message: 25/06/2003, 15h49

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