Невозможно переместить изображение по экрану в Pygame - PullRequest
2 голосов
/ 27 мая 2020

Я новичок в Python, и я пытаюсь придумать функцию для рисования квадрата, который перемещается по экрану горизонтально и вертикально с помощью Pygame. Квадрат должен двигаться, когда мы нажимаем стрелки на клавиатуре.

Моя проблема: хотя квадрат отображается на экране, он вообще не перемещается, но Python не показывает никаких ошибок.

Кто-нибудь знает, чего не хватает? Заранее спасибо!

Вот что я уже написал:

import pygame

altura_tela = 600
largura_tela = 800
tela = pygame.display.set_mode((largura_tela, altura_tela))

vermelho = (255, 0, 0)

altura_quadrado = 100
largura_quadrado = 100

def desenhaQuadrado(quadrado):
    pygame.draw.rect(tela, vermelho, (350,250,largura_quadrado, altura_quadrado))

def posicaoquadrado(quadradoPos):
    tela.blit(quadrado, (quadradoPos[0],quadradoPos[1]))

def moveQuadrado(teclas, quadradoPos):
    if teclas[0] and quadradoPos[1] > 0:
        quadradoPos[1] -= 20
    elif teclas[2] and quadradoPos[1] < 420:
        quadradoPos[1] += 20
    if teclas[1] and quadradoPos[0] > 0:
        quadradoPos[0] -= 20
    elif teclas[3]and quadradoPos[0] < 570:
        quadradoPos[0] += 20
    return quadradoPos

def main():
    pygame.init()
    teclas = [False, False, False, False]
    quadradoPos = [350,250]

    pygame.display.set_caption('Movimentação do Quadrado')

    terminou = False
    while not terminou:

        for event in pygame.event.get():

            if event.type == pygame.QUIT:
                terminou = True

            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_UP:
                    teclas[0] = True
                elif event.key == pygame.K_DOWN:
                    teclas[1] = True
                elif event.key == pygame.K_LEFT:
                    teclas[2] = True
                elif event.key == pygame.K_RIGHT:
                    teclas[3] = True

            if event.type == pygame.KEYUP:
                if event.key == pygame.K_UP:
                    teclas[0] = False
                elif event.key == pygame.K_DOWN:
                    teclas[1] = False
                elif event.key == pygame.K_LEFT:
                    teclas[2] = False
                elif event.key == pygame.K_RIGHT:
                    teclas[3] = False

            quadradoPos = moveQuadrado(teclas, quadradoPos)
            desenhaQuadrado(quadradoPos)

            pygame.display.update()


    pygame.display.quit()

    pygame.quit()

if __name__ == '__main__':
    main()

Ответы [ 2 ]

0 голосов
/ 27 мая 2020

В функции desenhaQuadrado есть несколько c значений stati

def desenhaQuadrado(quadrado):
    pygame.draw.rect(tela, vermelho, (350,250,largura_quadrado, altura_quadrado))

Измените его на приведенный ниже код, и он переместится.

def desenhaQuadrado(quadrado):
    pygame.draw.rect(tela, vermelho, (quadrado[0],quadrado[1],largura_quadrado, altura_quadrado))

Хотя у вас будут другие проблемы, которые нужно решить, как вы увидите. Я создал сценарий, который в основном является тем, что вы хотите, проверьте его, если вам нужна помощь https://github.com/eng-robsonsampaio/pygame_move_square.git

import pygame
from pygame.locals import *

UP = 0
DOWN = 1
LEFT = 2
RIGHT = 3
GAME_ON = True
SPEED = 20

screen = pygame.display.set_mode((400, 400))
clock = pygame.time.Clock()

square = pygame.Surface((50,50))
square.fill((255,0,0))
POS = [(200,200)]

def move_square(direction):
    if UP == direction:
        POS.append((POS[0][0], POS[0][1] - 20))
    elif direction == DOWN:
        POS.append((POS[0][0], POS[0][1] + 20))
    elif direction == LEFT:
        POS.append((POS[0][0] - 20, POS[0][1]))
    else:
        POS.append((POS[0][0] + 20, POS[0][1]))
    POS.pop(0)


while GAME_ON:

    for event in pygame.event.get():
        if event.type == QUIT:
            GAME_ON = False
        if event.type == KEYDOWN:
            if event.key==K_UP:
                print("UP")
                move_square(UP)                
            elif event.key==K_LEFT:
                print("LEFT")
                move_square(LEFT)               
            elif event.key==K_DOWN:
                print("DOWN")
                move_square(DOWN)                
            elif event.key==K_RIGHT:
                print("RIGHT")
                move_square(RIGHT)

    screen.fill((0,0,0))
    screen.blit(square, POS[0])
    pygame.display.update()

pygame.quit()

У меня также есть учебник по игре в змейку на среднем уровне: https://medium.com/@robsonsampaio90 / snake-game-in- python -with-pygame-291f5206a35e

Вы можете найти помощь по этим ссылкам.

0 голосов
/ 27 мая 2020

В вашей функции:

def desenhaQuadrado(quadrado):
    pygame.draw.rect(tela, vermelho, (350,250,largura_quadrado, altura_quadrado))

Вы передаете аргумент quadrado, но никогда его не используете. Также ваши координаты никогда не обновляются 350, 250. Итак, эта функция в основном повторяет aws тот же прямоугольник снова и снова.

Я изменил ваш код:

import pygame

clock = pygame.time.Clock()

altura_tela = 600
largura_tela = 800
tela = pygame.display.set_mode((largura_tela, altura_tela))

FPS = 30

vermelho = (255, 0, 0)

altura_quadrado = 100
largura_quadrado = 100


def redraw(quadradoPos):
    tela.fill(pygame.Color("white"))
    pygame.draw.rect(tela, vermelho, (quadradoPos[0], quadradoPos[1], largura_quadrado, altura_quadrado))
    pygame.display.update()


def main():
    pygame.init()
    quadradoPos = [300,250]
    pygame.display.set_caption('Movimentação do Quadrado')

    terminou = False
    while not terminou:

        clock.tick(FPS)

        for event in pygame.event.get():

            if event.type == pygame.QUIT:
                terminou = True

            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_UP and quadradoPos[1] > 0:
                    quadradoPos[1] -= 50
                elif event.key == pygame.K_DOWN and quadradoPos[1] <= altura_tela - altura_quadrado:
                    quadradoPos[1] += 50
                elif event.key == pygame.K_LEFT and quadradoPos[0] >= 0:
                    quadradoPos[0] -= 50
                elif event.key == pygame.K_RIGHT and quadradoPos[0] <= largura_tela - largura_quadrado:
                    quadradoPos[0] += 50

            redraw(quadradoPos)

    pygame.quit()

if __name__ == '__main__':
    main()

ПРИМЕЧАНИЕ:

- не забывайте tela.fill(pygame.Color("white")), иначе вы получите «следы» всех прямоугольников, которые нарисованы на

-Я добавил clock, чтобы контролировать частоту кадров.

-Вы не можете мигать rect на экране, как вы делали в posicaoquadrado(quadradoPos), это вызовет TypeError. Вы можете использовать только Surface.

Надеюсь, это ответит на ваш вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...