Как установить положение изображения в pygame? - PullRequest
1 голос
/ 09 июля 2020

Я создал в своей игре объект под названием «пришелец». Загрузил изображение для "alien" и использовал "get_rect ()", чтобы установить его атрибуты rect.

Теперь я хочу изменить значение x-координаты "alien". Какой из двух способов верен?

alien.x = ...... или alien.rect.x = ......

Я видел в учебнике, что используются следующие коды:

alien.x = alien_width + 2 * alien_width * alien_number
alien.rect.x = alien.x 

Почему Разве автор напрямую не использовал alien.rect.x, чтобы изменить значение x-координаты "alien"? Вроде:

alien.rect.x = alien_width + 2 * alien_width * alien_number

Почему должно быть alien.x?

1 Ответ

0 голосов
/ 09 июля 2020

К сожалению, ответ "зависит от обстоятельств". Код некоторых людей поддерживает положение объекта во внутренних x и y, используя rect для обработки коллизий. Другой код просто поддерживает rect, используя rect.x и rect.y, если (когда-либо) требуется одна позиция.

Это действительно ваше дело, но я советую хранить все это внутри PyGame Rect, так как он имеет преимущества легкого обнаружения столкновений, если вы используете sh, чтобы использовать его в дальнейшем.

class Alien:

    def __init__( self, x, y, image ):
        self.image  = image
        self.rect   = image.get_rect()  # copy the image dimensions
        self.rect.x = x
        self.rect.y = y                 # move to location

    def draw( self, window ):
        window.blit( self.image, self.rect )    # paint it

Когда пришло время переместить Alien, вы можете так же легко настроить прямоугольник как x и y

class Alien:
    ...

    def moveBy( self, by_x, by_y ):
        self.rect.move_ip( by_x, by_y )

    def moveTo( self, x, y ):
        self.rect.x = x
        self.rect.y = y
    

Возможно, автор подумал, что наличие отдельных x и y упростило понимание кода. Это первостепенная причина, влияющая на стиль программирования. Программный код читается во много раз чаще, чем написан, поэтому часто добавляются дополнительные переменные, чтобы лучше проиллюстрировать выполнение программы.

Например, как проверка события щелчка мыши:

for event in pygame.event.get( ):
    if event.type == pygame.QUIT:
        running = False
    elif event.type == pygame.MOUSEBUTTONUP:
        handleGameClick( mouse2Board( event.pos ) )  # <-- HERE

Добавление дополнительных переменных указывает, что происходит:

    elif event.type == pygame.MOUSEBUTTONUP:
        mouse_click_coord = event.pos
        game_board_coord  = mouse2Board( mouse_click_coord )
        handleGameClick( game_board_coord )

Здесь читателю сообщается, что event.pos - это координата (вероятно, пара значений) и это от мыши. Затем он усиливает, что координата затем преобразуется в пространство игрового поля перед передачей в handleGameClick() для обработки.

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

ИМХО, в идеале нужно писать такой код, чтобы кто-то, не знакомый с языком (но все же программист), мог понять его без особых проблем. Вот почему в моих ответах вы не увидите много "pythoni c" l oop -in-list, например:

[[col +1 for col in row] for row in a]   # Taken from 10 vote answer

Потому что, если вы не очень знакомы с синтаксисом python, он нечитаем.

...