Pygame Несколько пуль не нерестятся - PullRequest
0 голосов
/ 31 января 2019

Так что я новичок в Pygame и кодирую свой первый проект - шутер с боковой прокруткой.У меня проблема с пулями: когда я нажимаю клавишу пробела, некоторые пули появляются, но бывают моменты, когда ничего не происходит, и пули не появляются, когда я прыгаю.Не совсем уверен, как решить эту проблему - любые идеи будут с благодарностью.Код выглядит следующим образом:

import pygame
import math, random, sys, pygame.mixer
from pygame.locals import *
pygame.init()
pygame.mixer.pre_init(44100, -16, 2, 8192)
pygame.mixer.init()
jump = False
jump_offset = 0
jump_height = 250

k = pygame.key.get_pressed()

def events():
        for event in pygame.event.get():
                if event.type == QUIT or (event.type == KEYDOWN and event.key == K_ESCAPE):
                        pygame.quit()
                        sys.exit()

def do_jumping():
        global jump_height
        global jump
        global jump_offset
        if jump:
                jump_offset += 3

                if jump_offset >= jump_height:
                        jump = False
        elif jump_offset > 0 and jump == False:
                jump_offset -= 3

#Defining colours
BLACK = (   0,   0,   0)
WHITE = ( 255, 255, 255)

#Window Settings
w = 1280
h = 720
half_w = w /2
half_h = h /2
AREA = w*h

#Initialising the window
pygame.init()
display = pygame.display.set_mode((w,h)) #Sets the size of the window
pygame.display.set_caption("Cattleman") #Sets the title of the window
Clock = pygame.time.Clock() #clockspeed for the game ie. 60fps
FPS = 600

#pygame.mouse.set_visible(True) #Allows the mouse to be shown in the game window.

background = pygame.image.load("background.png").convert()
backgroundWidth, backgroundHeight = background.get_rect().size

stageWidth = backgroundWidth*2 #sets the area which the player can move in
stagePosX = 0 #Records position of stage as the player moves

startScrollPosX = half_w

circleRadius = 25
circlePosX = circleRadius

playerPosX = circleRadius
playerPosY = 602
playerVelocityX = 0

playersprite = pygame.image.load("player_spriteR2.png").convert_alpha()
playersprite = pygame.transform.scale(playersprite, (130,130))

bullets = []

bulletSprite = pygame.image.load("Bullet1.png").convert_alpha()
bulletSprite = pygame.transform.scale(bulletSprite, (20,10))

#Sounds
#gunSounds = ["pew1.wav", "pew2.wav", "pew3.wav", "pew4.wav"]
#SOUNDS
shot = pygame.mixer.Sound("pew1.wav")
#------------------------MAIN PROGRAM LOOP------------------------#
while True:
    events()
    do_jumping()
    k = pygame.key.get_pressed()
    if k[K_RIGHT]:
        playerVelocityX = 2 #Moves the player right
        playersprite = pygame.image.load("player_spriteR2.png").convert_alpha()
        playersprite = pygame.transform.scale(playersprite, (130,130))
    if k[K_LEFT]:
        playerVelocityX = -2 #Moves the player left
        playersprite = pygame.image.load("player_spriteL2.png").convert_alpha()
        playersprite = pygame.transform.scale(playersprite, (130,130))
    if k[K_UP] and jump == False and jump_offset == 0:
            jump = True
    if not k[K_RIGHT] and not k[K_LEFT]:
            playerVelocityX = 0 #If no input detected, the player does not move
    if k[K_SPACE]:
            for event in pygame.event.get():
                bullets.append([circlePosX-100, playerPosY-20])
            shot.play()

    playerPosX += playerVelocityX
    if playerPosX > stageWidth - circleRadius-25: playerPosX = stageWidth - circleRadius-25 #Checks if the player trie to go past the right boundary
    if playerPosX < circleRadius+55:playerPosX = circleRadius+55 #Checks if the player tries to go past the left boundary
    if playerPosX < startScrollPosX: circlePosX = playerPosX
    elif playerPosX > stageWidth - startScrollPosX: circlePosX = playerPosX - stageWidth + w
    else:
        circlePosX = startScrollPosX
        stagePosX += -playerVelocityX

    for b in range(len(bullets)):
            bullets[b][0] -= 3

    for bullet in bullets[:]:
            if bullet[0] < 0:
                    bullets.remove(bullet)

    rel_x = stagePosX % backgroundWidth
    display.blit(background,(rel_x - backgroundWidth, 0))
    if rel_x < w:
            display.blit(background, (rel_x, 0))

    for bullet in bullets:
            display.blit(bulletSprite, pygame.Rect(bullet[0], bullet[1], 0, 0,))

    #pygame.draw.circle(display,WHITE, (int(circlePosX),playerPosY - jump_offset), circleRadius, 0)
    display.blit(playersprite, (int(circlePosX-80),playerPosY-100 - jump_offset))

    pygame.display.update()
    Clock.tick(FPS)
    display.fill(BLACK)

1 Ответ

0 голосов
/ 31 января 2019

Я сделал это в своем коде, который оставляет несколько шаров похожими на пули:

class Bullet():

def __init__(self, x, y):
    # self.image = pygame.image.load("SingleBullet.png")
    self.image = pygame.image.load("ball.png")
    self.image = pygame.transform.scale(self.image, (25, 25))

    self.rect = self.image.get_rect()
    self.rect.centerx = x
    self.rect.centery = y

    self.is_alive = True

# --------------------

def update(self):
    self.rect.y -= 15

    if self.rect.y < 0:
        self.is_alive = False

# --------------------

def draw(self, screen):
    screen.blit(self.image, self.rect.topleft)

для получения клавиатуры:

 def event_handler(self, event):

    if event.type == KEYDOWN:
        if event.key == K_LEFT:
            self.move_x = -5
        elif event.key == K_RIGHT:
            self.move_x = 5
        elif event.key == K_SPACE:
            if len(self.shots) < self.max_shots:
                self.shots.append(Bullet(self.rect.centerx, self.rect.top))

    if event.type == KEYUP:
        if event.key in (K_LEFT, K_RIGHT):
            self.move_x = 0
...