Прямо сейчас у меня есть код на Python с использованием графики Zelle, в которой есть изображение робота и некоторый текст, прокручивающийся вверх. Когда пользователь щелкает по окну, программа завершается.

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

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

Вот как выглядит мой код:

    from graphics import *
    from random import randint
    from time import sleep
    screen=GraphWin("Logo",500,700);
    screen.setBackground("#b3e2bf");
    #---------logo-----------

    robotHead=Image(Point(250,250),"robotHead.png");
    robotHead.draw(screen);

    robotEyes=Image(Point(250,310),"robotEyes.png");
    robotEyes.draw(screen);

    robotLeftEar=Image(Point(150,290),"robotLeftEar.png");
    robotLeftEar.draw(screen);

    robotRightEar=Image(Point(350,290),"robotRightEar.png");
    robotRightEar.draw(screen);


    #--------credits-----------
    programmer=Point(250,515);
    lineOne=Text(programmer,"Programmer Name");
    lineOne.draw(screen);

    className=Point(250,535);
    lineTwo=Text(className,"CSC 211");
    lineTwo.draw(screen);

    date=Point(250,555);
    lineThree=Text(date,"November 30th, 2017");
    lineThree.draw(screen);

    copyrightName=Point(250,575);
    lineFour=Text(copyrightName,"Copyright Line");
    lineFour.draw(screen);


    while screen.checkMouse()==None:
        robotHead.move(0,-1);
        robotEyes.move(0,-1);
        robotLeftEar.move(0,-1);
        robotRightEar.move(0,-1);
        lineOne.move(0,-1);
        lineTwo.move(0,-1);
        lineThree.move(0,-1);
        lineFour.move(0,-1);
        sleep(0.1);
    screen.close();
0
user8993750 23 Ноя 2017 в 03:11

1 ответ

Лучший ответ

Вы можете использовать robotHead.anchor.getY() и robotHead.anchor.getX(), чтобы проверить текущую позицию и переместить ее, только если она не находится в ожидаемой позиции.

Вы также можете использовать переменные с True/False, чтобы контролировать, какой элемент должен перемещаться (или даже какой элемент отображать на экране). В начале у вас должны быть moveHead = True и moveLineOne = False. Когда head находится в ожидаемой позиции, вы можете изменить moveHead = False и moveLineOne = True.

Кстати: graphics имеет функцию update(frames_per_second) для управления скоростью анимации, и вам не нужно sleep(). Кроме того, update() выполняет некоторые функции, которые могут потребоваться graphics для корректной работы. (graphics документация: Управление обновлениями дисплея (расширенное) )

Скорость 25-30 кадров в секунду вполне достаточна, чтобы человеческий глаз увидел плавную анимацию (при этом может потребоваться меньше мощности процессора, чем 60 кадров в секунду).

Простой пример

from graphics import *
from random import randint
from time import sleep

screen = GraphWin("Logo", 500, 700)

# --- objects ---

robot_head = Image(Point(250, 250), "robotHead.png")
robot_head.draw(screen)

programmer = Point(250, 515)
line_one = Text(programmer, "Programmer Name") 
#line_one.draw(screen) # don't show at start

# --- control objects ---

move_robot_head = True # move head at start
move_line_one = False  # don't move text at start

# --- mainloop ---

while not screen.checkMouse(): # while screen.checkMouse() is None:

    if move_robot_head: # if move_robot_head == True:
        # check if head is on destination position
        if robot_head.anchor.getY() <= 100:
            # stop head
            move_robot_head = False

            # show text
            line_one.draw(screen)

            # move text 
            move_line_one = True
        else:
            # move head
            robot_head.move(0, -10)

    if move_line_one: # if move_line_one == True:
        # check if head is on destination position
        if line_one.anchor.getY() <= 150:
            # stop text
            move_programmer = False
        else:
            # move text
            line_one.move(0, -10)

    # control speed of animation        
    update(30) # 30 FPS (frames per second)

# --- end ---

screen.close()
0
furas 27 Ноя 2017 в 14:03