Pygame - поворот изображения при нажатии клавиши

Как я могу заставить изображение / спрайт вращаться влево / вправо при нажатии клавиши со стрелкой влево / вправо? ... Как колесо.

Итак, вот код, который запускает игровой цикл:

def gameplay_loop():
    exitgame = False
    cellpos_x = 0
    cellpos_y = cancer_cell.get_rect().height*2
    while not exitgame:
        for event in pygame.event.get():
            if event.type == pygame.QUIT or (event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE):
                exitgame = True
                quitgame()
        key_pressed = pygame.key.get_pressed()
        if key_pressed[pygame.K_LEFT]:
            cellpos_x -= 10
        if key_pressed[pygame.K_RIGHT]:
            cellpos_x += 10

        gameplay_bg = pygame.image.load("/Users/nedimkanat/Desktop/python/img/gameplay_bg.png").convert()
        main_screen.fill(white)
        main_screen.blit(gameplay_bg, [0,0])
        main_screen.blit(cancer_cell, [cellpos_x, cellpos_y])
        pygame.display.flip()
        clock.tick(20)

Я попытался добавить его в условиях key_pressed, но ничего не произошло, и я сделал, как говорит этот парень: https://stackoverflow.com/a/19316827/6256879

Спрайт называется cancer_cell, и, как я уже упоминал выше, я хочу, чтобы он вращался влево / вправо, пока нажата клавиша «Влево / вправо».


person Community    schedule 29.08.2016    source источник
comment
Что у вас уже есть? Цель этого сайта не в том, чтобы писать для вас целые программы.   -  person jsbueno    schedule 29.08.2016
comment
В Pygame вы должны использовать функцию pygame.transform.rotozoom, передавая ей ваше изображение как поверхность pygame, но вам понадобится целая программа для этого вызова, чтобы она работала.   -  person jsbueno    schedule 29.08.2016
comment
1. Узнайте, как обрабатывать такие события, как нажатия клавиш. . 2. Узнайте о функциях, которые повернуть поверхности. 3. Пробуйте, совершайте ошибки, пробуйте снова, набирайтесь опыта и выясняйте это или задавайте более конкретные вопросы о том, чего вы не понимаете здесь, на Stack Overflow, где вы показываете нам, что вы пробовали. , чего вы ожидали и что пошло не так.   -  person Ted Klein Bergman    schedule 29.08.2016
comment
Посмотрите мой комментарий к вашему ответу в этом сообщении: stackoverflow.com/ вопросы / 39201171 / pygame-smooth-motion /. Я думаю, это будет важно для вас здесь, в зависимости от того, хотите ли вы, чтобы спрайт продолжал вращаться, пока нажата клавиша, или вращался на заданную величину только один раз при каждом нажатии клавиши. Как предложил Тед Кляйн, проверьте документацию Pygame на предмет ротации и задайте более конкретный вопрос с образцом кода, когда вы сделали несколько попыток.   -  person Sorade    schedule 29.08.2016
comment
Обновленный вопрос ..   -  person    schedule 29.08.2016
comment
@sorade, я не уверен, какое отношение mouse_getpos () имеет к вращающемуся изображению. теперь будьте конкретны.   -  person    schedule 29.08.2016


Ответы (1)


Что-то вроде этого может сработать, если вы хотите поворачивать на один градус каждый раз, когда нажимаете стрелку влево или вправо. Если вы хотите, чтобы изображение вращалось непрерывно, вам нужно использовать get_pressed() для интересующего ключа, чтобы угол применялся в каждом кадре.

def gameplay_loop():
    exitgame = False
    cellpos_x = 0
    cellpos_y = cancer_cell.get_rect().height*2
    while not exitgame:
        angle = 0 #reset the angle at each iteration
        for event in pygame.event.get():
            if event.type == pygame.QUIT or (event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE):
                exitgame = True
                quitgame()
        key_pressed = pygame.key.get_pressed()
        if key_pressed[pygame.K_LEFT]:
            cellpos_x -= 10
            angle += 1.0
        if key_pressed[pygame.K_RIGHT]:
            cellpos_x += 10
            angle -= 1.0

        gameplay_bg = pygame.image.load("/Users/nedimkanat/Desktop/python/img/gameplay_bg.png").convert()
        main_screen.fill(white)
        main_screen.blit(gameplay_bg, [0,0])
        cancer_cell = pygame.transform.rotate(cancer_cell,angle)
        main_screen.blit(cancer_cell, [cellpos_x, cellpos_y])
        pygame.display.flip()
        clock.tick(20)

для непрерывного вращения можно:

def gameplay_loop():
    exitgame = False
    cellpos_x = 0
    cellpos_y = cancer_cell.get_rect().height*2
    while not exitgame:
        angle = 0 #reset the angle at each iteration
        for event in pygame.event.get():
            if event.type == pygame.QUIT or (event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE):
                exitgame = True
                quitgame()
        key_pressed = pygame.key.get_pressed()
        if key_pressed[pygame.K_LEFT]:
            cellpos_x -= 10

        if key_pressed[pygame.K_RIGHT]:
            cellpos_x += 10


        gameplay_bg = pygame.image.load("/Users/nedimkanat/Desktop/python/img/gameplay_bg.png").convert()
        main_screen.fill(white)
        main_screen.blit(gameplay_bg, [0,0])
        key_pressed = pygame.key.get_pressed()
        if key_pressed[pygame.K_LEFT]: #do the same for the other key
               angle += 1              #and put -= instead of +=

        cancer_cell = pygame.transform.rotate(cancer_cell,angle)
        main_screen.blit(cancer_cell, [cellpos_x, cellpos_y])
        pygame.display.flip()
        clock.tick(20)
person Sorade    schedule 30.08.2016
comment
строка 81: cellpos_y = cancer_cell.get_rect().height*2 строка 99: cancer_cell = pygame.transform.rotate(cancer_cell,angle) - person ; 30.08.2016
comment
это нормально, посмотрите на код из предоставленного вами вопроса, там также используется cancer_cell, прежде чем вы его назначите. Я предположил, что вы определили свою cancer_cell поверхность где-то еще в своем коде. Чтобы этот код работал, переменная cancer_cell должна быть поверхностью Pygame. - person Sorade; 30.08.2016
comment
у меня есть, лол. строка 28: cancer_cell = pygame.image.load("/Users/wolf/Desktop/python/img/thornyball.png").convert_alpha() - person ; 30.08.2016
comment
Извините, я не вижу этого в вашем коде. Просто определите его дальше, и это должно решить вашу проблему. - person Sorade; 30.08.2016
comment
Понятия не имею, как это происходит. Вы используете два изображения для создания своей клетки? Если вы используете одну поверхность, она должна работать. Одно исправление к моему ответу заключается в том, что угол должен быть в градусах, а не в радианах. - person Sorade; 30.08.2016
comment
Позвольте нам продолжить это обсуждение в чате. - person Sorade; 30.08.2016
comment
Возможно, стоит проверить эту страницу, поскольку на ней много примеров и прочего. на что следует обратить внимание, когда вы думаете о повороте изображения в Pygame. - person Sorade; 31.08.2016