Добавление границ в Pygame с подвижными символами / изображениями - PullRequest
0 голосов
/ 10 октября 2018

Я создаю игру, в которой изображение перемещается в соответствии с вводом игрока с помощью методов Keydown и Keyup.Я хочу добавить границы, чтобы пользователь не мог переместить изображение / персонажа за пределы экрана (я не хочу, чтобы игра перебивала такие вещи, если на границу попадет, просто чтобы изображение / персонаж не смогло пройти за эту границу)

import pygame
pygame.init()#initiate pygame
black = (0,0,0)
white = (255,255,255)
red = (255,0,0)
display_width = 1200
display_height = 800
display = pygame.display.set_mode((display_width,display_height))
characterimg_left = pygame.image.load(r'/Users/ye57324/Desktop/Make/coding/python/characterimg_left.png')
characterimg_right = pygame.image.load(r'/Users/ye57324/Desktop/Make/coding/python/characterimg_right.png')
characterimg = characterimg_left
def soldier(x,y):
    display.blit(characterimg, (x,y))
x = (display_width * 0.30)
y = (display_height * 0.2)
pygame.display.set_caption('No U')
clock = pygame.time.Clock()#game clock
flip_right = False
x_change = 0
y_change = 0
bg_x = 0
start = True
bg = pygame.image.load(r'/Users/ye57324/Desktop/Make/coding/python/bg.png').convert()

class player:
    def __init__(self, x, y):
        self.jumping = False

p = player(x, y)
while start:
    for event in pygame.event.get():
        if event.type == pygame.QUIT or (event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE):
            start = False


        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                x_change += -4
                if flip_right == True:
                    characterimg = characterimg_left
                    flip_right = False
                    x += -150
            elif event.key == pygame.K_RIGHT:
                x_change += 4
                if flip_right == False:
                    characterimg = characterimg_right
                    flip_right = True
                    x += 150
            elif event.key == pygame.K_UP:
                    y_change += -4
            elif event.key == pygame.K_DOWN:
                y_change += 4
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT:
                x_change += 4
            elif event.key == pygame.K_RIGHT:
                x_change += -4
            elif event.key == pygame.K_UP:
                y_change += 4
            elif event.key == pygame.K_DOWN:
                y_change += -4

    x += x_change
    y += y_change
    display.fill(white)
    soldier(x,y)
    pygame.display.update()
    clock.tick(120)#fps
pygame.quit()

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

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Просто зажмите значения x и y между 0 и шириной и высотой дисплея.

# In the main while loop after the movement.
if x < 0:
    x = 0
elif x + image_width > display_width:
    x = display_width - image_width

if y < 0:
    y = 0
elif y + image_height > display_height:
    y = display_height - image_height

Я также рекомендую проверить, как pygame.Rect с Работа.Вы можете определить прямоугольник с размером дисплея,

display_rect = display.get_rect()

и прямоугольник для символа, который будет использоваться в качестве позиции блитта:

rect = characterimg_left.get_rect(center=(x, y))

Затем переместите и зажмитетаким образом:

rect.move_ip((x_change, y_change))
rect.clamp_ip(display_rect)

display.fill(white)
# Blit the image at the `rect.topleft` coordinates.
display.blit(characterimg, rect)
0 голосов
/ 11 октября 2018

По сути, вы хотите ограничить движение игрока.

Так что каждый раз, когда вы хотите "переместить" игрока (я предполагаю, что это "x_change" / "y_change"), вам нужно проверить, будут ли онивсе еще быть в ваших границах после переезда.

Пример. Граница вашего дисплея x составляет 0 пикселей слева от экрана и 500 справа.Я допускаю фактическое движение, только если результат движения находится в моих границах.

 boundary_x_lower = 0
 boundary_x_upper = 500

 if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                if boundary_x_lower < (x_change - 4): 
                    # I allow the movement if I'm still above the lower boundary after the move.
                    x_change -= 4
            elif event.key == pygame.K_RIGHT:
                if boundary_x_upper > (x_change +4): 
                     # I allow the movement if I'm still below the upper boundary after the move.
                     x_change += 4

PS: я смущен вашим кодом, когда вы вычитаете, когда вы двигаетесь вправо ... Я привык2D-игры, в которых вы увеличиваете положение игрока, если вы двигаетесь вправо ... и вычитаете, если вы идете влево.

Не стесняйтесь адаптировать код под свой проект.Основной принцип применим также к движению оси Y: с border_y_lower & _y_upper.если у вас есть дополнительные вопросы, просто спросите!

...