как бы я мог переместить фигуру в моей игре pygame, используя координаты x и y

#python-3.x #image #animation #pygame #mouse

#python-3.x #изображение #Анимация #pygame #мышь

Вопрос:

Мне нужна помощь в перемещении фигуры по определенной координате. Вот часть моего кода, которая перемещает фигуру:

     screen.blit(mountain, (300, 500))
    screen.blit(mountain, (300, 400))
def enemy_castle():
    castle = pygame.image.load('castle.png')
    castle = pygame.transform.scale(castle, (100, 100))
    screen.blit(castle, (0, 500))
def player_castle():
    castle = pygame.image.load('castle.png')
    castle = pygame.transform.scale(castle, (100, 100))
    screen.blit(castle, (500, 0))
def enemy_sorcerer():
    s_piece = pygame.image.load('sorcerer.png')
    s_piece = pygame.transform.scale(s_piece, (100, 100))
    screen.blit(s_piece, (400, 0))
    screen.blit(s_piece, (500, 100))
  

Комментарии:

1. создание игры, похожей на шахматы

Ответ №1:

Итак, у вас есть изображение, которое нужно отрисовать в определенном месте. Итак, вместо «жесткого кодирования» этого (500, 0) , начните сохранять это в переменной.

Класс PyGame Rect идеально подошел бы для этого, поскольку он также может использоваться с blit() функцией и уже имеет множество удобных функций столкновения.

Вы можете создать прямоугольную фигуру, просто запросив у изображения ее прямоугольную форму — за исключением того, что она расположена в (0,0) , потому что изображение не имеет понятия о местоположении.

 castle_image = pygame.image.load('castle.png').convert_alpha()
castle_image = pygame.transform.scale(castle_image, (100, 100))
castle_rect  = castle_image.get_rect()
castle_rect.topleft = ( 500, 0 )
screen.blit( castle_image, castle_rect )
  

Итак, теперь переменная castle_rect была бы чем-то вроде [ x=500, y=0, width=100, height=100 ]

Чтобы переместить положение рисунка изображения, теперь все, что вам нужно сделать, это настроить координаты castle_rect , например:

 castle_rect.x  = 10
castle_rect.y  = 100
screen.blit( castle_image, castle_rect )
  

Или просто переместите все изображение, снова сбросив его координаты:

 castle_rect.topleft = ( 200, 200 )
screen.blit( castle_image, castle_rect )
  

Что было бы более эффективным, так это загрузить и масштабировать ваши изображения один раз при запуске, но затем нарисовать их все внутри основного цикла в их текущих положениях прямоугольника.

 def loadImageWithScale( image_filename, size=(100,100) ):
    """ Load the given image file, then rescale the image to size """
    new_image = pygame.image.load( image_filename ).convert_alpha()
    new_image = pygame.transform.scale( new_image, size )
    return new_image

def getImageRectAt( image, position ):
    return image.get_rect( topleft=position )

# Load images
enemy_castle   = loadImageWithScale( 'castle.png' )
enemy_sorcerer = loadImageWithScale( 'sorcerer.png' )
player_castle  = loadImageWithScale( 'castle.png' )

# Set initial positions
enemy_castle_rect   = getImageRectAt( enemy_castle,   ( 0, 500 ) )
enemy_sorceror_rect = getImageRectAt( enemy_sorceror, ( 400, 0 ) )
player_castle_rect  = getImageRectAt( player_castle,  ( 500, 0 ) )

### Main Loop
clock = pygame.time.Clock()
exiting = False
while not exiting:

    # Handle user-input
    for event in pygame.event.get():
        if ( event.type == pygame.QUIT ):
            exiting = True

    # Update the window, but not more than 60fps
    window.fill( ( 128, 128, 128 ) )
    window.blit( enemy_castle,   enemy_castle_rect )
    window.blit( enemy_sorceror, enemy_sorceror_rect )
    window.blit( player_castle,  player_castle_rect )

    pygame.display.flip()

    # Clamp FPS
    clock.tick_busy_loop( 60 )

pygame.quit()
  

Вероятно, когда у вас будет намного больше элементов экрана, вы могли бы упорядочить их в удобные списки, чтобы сделать код рисования более кратким.