#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()
Вероятно, когда у вас будет намного больше элементов экрана, вы могли бы упорядочить их в удобные списки, чтобы сделать код рисования более кратким.