首页 > 解决方案 > 为什么我的弹丸“hprojectile”不动?

问题描述

我是 python 和 pygame 的新手。我正在制作一个学校项目,这是一个简单的游戏。我的游戏中有些东西不起作用,我似乎找不到它。如果我按下空格键,玩家应该发射一个射弹(在代码中为 hprojectile)。一切都有效,甚至碰撞,除了它在 Y 轴上移动。

那么有人可以帮帮我吗?

import pygame, math, random, sys
from pygame import mixer

# pygame SETUP
pygame.init()
mainClock = pygame.time.Clock()

# opbouw van het scherm en de resolutie
screen = pygame.display.set_mode((1280, 720))

white = (255,255,255)
black =(0,0,0)

pause_font = pygame.font.Font('freesansbold.ttf', 64)
pause_under_font= pygame.font.Font('freesansbold.ttf', 32)
font = pygame.font.Font('freesansbold.ttf', 64)
fontbutton = pygame.font.Font('freesansbold.ttf', 32)

# Titel en Logo
pygame.display.set_caption("Codename Zeta")
icon = pygame.image.load('Visuals/halo.png')
pygame.display.set_icon(icon)

textX= 10
textY= 10

# Game Over
game_over_font = pygame.font.Font('freesansbold.ttf', 64)

#Menu
menubackground = pygame.image.load('Visuals/background.png')

def draw_text(text, font, color, surface, x, y):
    textobj = font.render(text, 1, color)
    textrect = textobj.get_rect()
    textrect.topleft = (x,y)
    surface.blit(textobj, textrect)


def main_menu():
    click = False
    # Achtergrond muziek
    mixer.music.load('Audio/MainMenu.mp3')
    mixer.music.play(-1)
    while True:
        screen.fill((0, 0, 0))
        screen.blit(menubackground, (0, 0))
        draw_text('Project Zeta', font, (255, 255, 255), screen, 0, 300)

        mx, my = pygame.mouse.get_pos()

        button_1 = pygame.Rect(0, 400, 200, 50)
        button_2 = pygame.Rect(0, 500, 200, 50)
        if button_1.collidepoint((mx, my)):
            if click:
                game()
        if button_2.collidepoint((mx, my)):
            if click:
                quit()
        pygame.draw.rect(screen, (0, 0, 0), button_1)
        draw_text('Play', fontbutton, (255, 255, 255), screen, 0, 400)
        pygame.draw.rect(screen, (0, 0, 0), button_2)
        draw_text('Quit', fontbutton, (255, 255, 255), screen, 0, 500)

        click = False
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_ESCAPE:
                    pygame.quit()
                    sys.exit()
            if event.type == pygame.MOUSEBUTTONDOWN:
                if event.button == 1:
                    click = True

        pygame.display.update()
        mainClock.tick(60)

def pause_text():
    paused_text = pause_font.render("PAUSED", True, (255, 255, 255))
    screen.blit(paused_text, (500, 175))

def pause():
    paused = True

    while paused:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()

            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_ESCAPE:
                    paused = False

                elif event.key == pygame.K_BACKSPACE:
                    pygame.quit()
                    quit()

        pause_text()
        pygame.display.update()

#'The Game Loop'
def game():
    # Achtergrond
    background = pygame.image.load('Visuals/background.png')
    # Achtergrond muziek
    mixer.music.load('Audio/backgroundmusic.mp3')
    mixer.music.play(-1)
    # Player
    playerImg = pygame.image.load('Visuals/Longsword.png')
    playerX = 608
    playerY = 500
    playerX_change = 0
    playerY_change = 0

    # Enemy
    enemyImg = []
    enemyX = []
    enemyY = []
    enemyX_change = []
    enemyY_change = []
    num_of_enemies = 6

    for i in range(num_of_enemies):
        enemyImg.append(pygame.image.load('Visuals/Banshee.png'))
        enemyX.append(random.randint(0, 1215))
        enemyY.append(random.randint(-64, 0))
        enemyX_change.append(0)
        enemyY_change.append(0.6)

    # ProjectileHuman
    hprojectileImg = pygame.image.load('Visuals/hprojectile.png')
    hprojectileX = 0
    hprojectileY = 500
    hprojectileX_change = 0
    hprojectileY_change = 10
    hprojectile_state = "ready"

    # Score
    score_value = 0
    font = pygame.font.Font('freesansbold.ttf', 32)

    def show_score(x, y):
        score = font.render("Score:" + str(score_value), True, (255, 255, 255))
        screen.blit(score, (x, y))

    def game_over_text():
        over_text = game_over_font.render("GAME OVER", True, (255, 255, 255))
        screen.blit(over_text, (450, 175))

    def player(x, y):
        screen.blit(playerImg, (x, y))

    def enemy(x, y, i):
        screen.blit(enemyImg[i], (x, y))

    def fire_hprojectile(x, y):
        global hprojectile_state
        hprojectile_state = "fire"
        screen.blit(hprojectileImg, (x + 16, y + 10))

    def defCollision(enemyX, enemyY, hprojectileX, hprojectileY):
        distance = math.sqrt(math.pow(enemyX - hprojectileX, 2)) + (math.pow(enemyY - hprojectileY, 2))
        if distance < 27:
            return True
        else:
            return False

    running = True
    while running:


        # Achtergrond
        screen.fill((0, 0, 0))
        screen.blit(background, (0, 0))

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False

            # Als een toets is gedrukt, kijk of het links of rechts is
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_ESCAPE:
                    pause()
                if event.key == pygame.K_LEFT:
                    playerX_change = -5
                if event.key == pygame.K_RIGHT:
                    playerX_change = 5
                if event.key == pygame.K_UP:
                    playerY_change = -5
                if event.key == pygame.K_DOWN:
                    playerY_change = 5
                if event.key == pygame.K_SPACE:
                    if hprojectile_state == "ready":
                        hprojectile_sound = mixer.Sound('Audio/hprojectile.mp3')
                        hprojectile_sound.play()
                        hprojectileX = playerX
                        hprojectileY = playerY
                        fire_hprojectile(hprojectileX, hprojectileY)
            if event.type == pygame.KEYUP:
                if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT or event.key == pygame.K_UP or event.key == pygame.K_DOWN:
                    playerX_change = 0
                    playerY_change = 0

        # Borders
        playerX += playerX_change
        playerY += playerY_change

        if playerX <= 0:
            playerX = 0
        elif playerX >= 1216:
            playerX = 1216
        if playerY <= 400:
            playerY = 400
        elif playerY >= 656:
            playerY = 656

        for i in range(num_of_enemies):
            # Game Over
            if enemyY[i] > 656:
                for j in range(num_of_enemies):
                    enemyY[j] = 2000
                game_over_text()
                break

            enemyX[i] += enemyX_change[i]
            enemyY[i] += enemyY_change[i]


            # Collision
            collision = defCollision(enemyX[i], enemyY[i], hprojectileX, hprojectileY)
            if collision:
                hprojectileY = 500
                hprojectile_state = "ready"
                score_value += 1
                enemyX[i] = random.randint(0, 1215)
                enemyY[i] = random.randint(-64, 0)
                bansheedestroyed_sound = mixer.Sound('Audio/enemydestroyed.wav')
                bansheedestroyed_sound.play()
            enemy(enemyX[i], enemyY[i], i)

        # Projectiles
        if hprojectileY <= -32:
            hprojectileY = 500
            hprojectile_state = "ready"
        if hprojectile_state == "fire":
            fire_hprojectile(hprojectileX, hprojectileY)
            hprojectileY -= hprojectileY_change

        player(playerX, playerY)
        show_score(textX, textY)
        pygame.display.update()
        mainClock.tick(60)
main_menu()

标签: pythonpygame

解决方案


您需要在应用程序循环中连续绘制弹丸,hprojectile_statefire不是在事件循环中。SPCAE请注意,事件循环中的代码仅在按下时执行一次。

def game():
    # [...]

    def fire_hprojectile(x, y):
        screen.blit(hprojectileImg, (x + 16, y + 10))

    # [...]

    while running:
        # [...]
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False

            # Als een toets is gedrukt, kijk of het links of rechts is
            if event.type == pygame.KEYDOWN:
                # [...]

                if event.key == pygame.K_SPACE:
                    if hprojectile_state == "ready":
                        hprojectileX = playerX
                        hprojectileY = playerY
                        hprojectile_state = "fire"        # <----
        # [...]

        # Projectiles
        if hprojectileY <= -32:
            hprojectileY = 500
            hprojectile_state = "ready"
        if hprojectile_state == "fire":
            fire_hprojectile(hprojectileX, hprojectileY)
            hprojectileY -= hprojectileY_change
            fire_hprojectile(hprojectileX, hprojectileY)   # <----

如果您想在一段时间内发射多个弹丸,请参阅问题的答案:


推荐阅读