2 votes

Pourquoi mon code de tir en pygame ne fonctionne-t-il pas ?

Je réalise un jeu de sous-marin en pygame et j'ai essayé de faire en sorte que mon sous-marin tire des balles. J'ai essayé le code, que j'ai utilisé dans mon autre projet pygame, mais il ne fonctionne pas dans celui-ci. Le compilateur ne donne pas d'erreur, mais quand j'appuie sur espace, il ne tire pas. J'ai essayé de trouver une erreur, mais je n'ai pas réussi. J'ai également essayé de parcourir Stack Overflow, mais je n'ai pas trouvé la réponse que je cherchais. Voici le code :

import pygame

pygame.init()
run = True
screen = pygame.display.set_mode((600, 500))
pygame.display.set_caption('Podmornca')
desno = pygame.image.load('podmornicaD.png')
levo = pygame.image.load('podmornica.png')
ozadje = pygame.image.load('ozadje.png')
torpedoD = pygame.image.load('torpedo.png')
torpedoL = pygame.image.load('torpedoL.png')
class podmornica():
    def __init__(self, x, y, v):
        self.x = x
        self.y = y
        self.v = v
        self.ziv = 100
        self.levo = False
        self.desno = True
    def naris(self):
        if self.levo:
            screen.blit(levo, (self.x, self.y))
        elif self.desno:
            screen.blit(desno, (self.x, self.y))
class torpedo():
    def __init__(self, x, y, smer):
        self.x = x
        self.y = y 
        self.smer = smer
        self.v = 5 * smer    
    def naris(self, screen):
        if self.smer < 0:
            screen.blit(torpedoD, (self.x, self.y))
        else:
            screen.blit(torpedoL, (self.x, self.y))     
igralec = podmornica(150, 300, 10)
#the list of bullets:
metki = []
def grafika():
    screen.blit(ozadje, (0,0))
    igralec.naris()
    #Here is code for displaying the bullets
    for metek in metki:
        metek.naris(screen)
    pygame.display.flip()
while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
    #This piece of code is for moving of bullets:
    for metek in metki:
        if metek.x < 600 and metek.x > 0:
            metek.x +=  metek.v
        else:
            metki.pop(metki.index(metek))        
    if event.type == pygame.KEYDOWN and event.key == pygame.K_UP and igralec.y > 10:
        igralec.y -= 3
    if event.type == pygame.KEYDOWN and event.key == pygame.K_DOWN and igralec.y < 350:
        igralec.y += 3
    if event.type == pygame.KEYDOWN and event.key == pygame.K_LEFT:
        igralec.levo = True
        igralec.desno = False
    if event.type == pygame.KEYDOWN and event.key == pygame.K_RIGHT:
        igralec.levo = False
        igralec.desno = True
    #the trigger for bullet:
    if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
        if igralec.levo:
            smer = -1
        else:
            smer = 1
        if len(metki) < 5:
            metki.append(torpedo(igralec.x, igralec.y, smer))
    grafika()
pygame.quit()

2voto

Rabbid76 Points 52493

Les événements doivent être traités dans la boucle d'événements. Si vous voulez obtenir un mouvement fluide, vous devez obtenir les états clés par pygame.key.get_pressed() . De plus, les balles se déplacent beaucoup trop vite. Contrôlez les images en pygame.time.Clock() respectivement .tick() . par exemple

FPS = 60
clock = pygame.time.Clock()   
while run:
    clock.tick(FPS)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
        elif event.type == pygame.KEYDOWN:
            #the trigger for bullet:
            if event.key == pygame.K_SPACE:
                if igralec.levo:
                    smer = -1
                else:
                    smer = 1
                if len(metki) < 5:
                    metki.append(torpedo(igralec.x, igralec.y, smer))

    # This piece of code is for moving of bullets:
    for metek in metki[:]:
        if metek.x < 600 and metek.x > 0:
            metek.x += metek.v
        else:
            metki.remove(metek) 

    keys = pygame.key.get_pressed()
    if keys[pygame.K_UP] and igralec.y > 10:
        igralec.y -= 3
    if keys[pygame.K_DOWN] and igralec.y < 350:
        igralec.y += 3
    if keys[pygame.K_LEFT]:
        igralec.levo = True
        igralec.desno = False
    if keys[pygame.K_RIGHT]:
        igralec.levo = False
        igralec.desno = True  
    grafika()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X