Почему мой код стрельбы в Pygame не работает? - PullRequest
2 голосов
/ 24 февраля 2020

Я играю в подводную лодку в пигме и пытаюсь заставить мою подводную лодку стрелять пулями. Я попробовал код, который я использовал в моем другом проекте Pygame, однако в этом он не работает. Компилятор не выдает никакой ошибки, но когда я нажимаю пробел, он не стреляет. Я пытался найти ошибку, но не смог. Я также попытался просмотреть Переполнение стека, но не нашел ответ, который искал. Вот код:

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()

1 Ответ

2 голосов
/ 24 февраля 2020

События должны быть обработаны в событии l oop. Если вы хотите добиться плавного движения, то вы получите ключевые состояния на pygame.key.get_pressed(). Кроме того, пули движутся очень быстро. Управляйте кадрами с помощью pygame.time.Clock() соответственно .tick(). Например:

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()
...