首页 > 解决方案 > 我正在使用 Pygame 制作游戏,尽管我指定了边界,但我的玩家正在拐角处

问题描述

我最近开始学习 Pygame 并尝试制作一个游戏,但在这中间我遇到了一个问题。我制作了一个不会移出屏幕的播放器,它一直到两侧都很好,但是当它到达角落时它会离开屏幕。如果您没有收到我的问题,请复制我的代码并在您的计算机中运行它,然后用箭头键移动播放器,然后移动到屏幕的末端和角落,您现在就会得到它。

import pygame
import random

pygame.init()

screen = pygame.display.set_mode((800, 600))
background = pygame.image.load('background.jpg')

# Title and Icon
title = pygame.display.set_caption('space')
icon = pygame.image.load('ufo.png')
pygame.display.set_icon(icon)

# player
playerIMG = pygame.image.load('spaceship.png')
playerX = 370
playerY = 480
playerX_change = 0
playerY_change = 0

# enemy
enemyIMG = pygame.image.load('enemy.png')
enemyX = random.randint(0, 768)
enemyY = random.randint(50, 150)
enemyX_change = 1
enemyY_change = 0

# bullet
bulletIMG = pygame.image.load('bullet.png')
bulletX = 0
bulletY = 480
bulletX_change = 0
bulletY_change = 1
bullet_state = "ready"


def player(X, Y):
    screen.blit(playerIMG, (X, Y))


def enemy(X, Y):
    screen.blit(enemyIMG, (X, Y))


def fire_bullet(X, Y):
    global bullet_state
    bullet_state = "fire"
    screen.blit(bulletIMG, (X+10, Y+10))


# Game loop
running = True
while running:

    screen.fill((0, 0, 0))
    screen.blit(background, (0, 0))
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        # key strokes
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                playerX_change = -1
            if event.key == pygame.K_RIGHT:
                playerX_change = +1
            if event.key == pygame.K_UP:
                playerY_change = -1
            if event.key == pygame.K_DOWN:
                playerY_change = 1
            if event.key == pygame.K_SPACE:
                if bullet_state is "ready":
                    bulletX = playerX
                    bulletY = playerY
                    fire_bullet(bulletX, bulletY)
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT:
                playerX_change = -0.3
            if event.key == pygame.K_RIGHT:
                playerX_change = 0.3
            if event.key == pygame.K_UP :
                playerY_change = -0.3
            if event.key == pygame.K_DOWN :
                playerY_change = +0.3

    player(playerX, playerY)
    enemy(enemyX, enemyY)

    # player boundaries
    playerX += playerX_change
    playerY += playerY_change

    if playerX < 0:
        playerX = 0
    elif playerX >= 736:
        playerX = 736
    elif playerY <= 0:
        playerY = 0
    elif playerY > 480:
        playerY = 480

    # enemy movement
    enemyX += enemyX_change
    if enemyX <= 0:
        enemyX_change = 1
    elif enemyX >= 736:
        enemyX_change = -1

    # bullet movement
    if bulletY <= 0:
        bulletY = 480
        bullet_state = "ready"
    if bullet_state is 'fire':
        fire_bullet(bulletX, bulletY)
        bulletY -= bulletY_change



    print(playerX, playerY)[enter image description here][1]
    pygame.display.update()

标签: pythonpygamegame-development

解决方案


您需要分别检查 x 和 y 方向。如果玩家超出 x 方向的限制,则不会评估 y 方向,因为您使用的是if-elif序列:

running = True
while running:
    # [...]
 
    if playerX < 0:
        playerX = 0
    elif playerX >= 736:
        playerX = 736

    # elif playerY <= 0:    <---  DELETE

    if playerY <= 0:      # <---  ADD
        playerY = 0
    elif playerY > 480:
        playerY = 480   

推荐阅读