如何在循环中移动对象?

How to move objects in loops?

我想循环移动 "Flappy Bird" 的管道和地面,但它不起作用。我需要做什么? 我试图用 "if" 移动管道和地面,但它不起作用。 我希望管道和地面在一个循环中移动。

def deplacement():
    global tuyx,tuyx2,h,H,oisx,oisy,solx,sol2x

    x0, y0, x1, y1 = canvas.bbox(image_oiseau)
    if y1 < 510:
        canvas.move(image_oiseau, 0, DY)

    canvas.coords(image_sol,solx,512)  
    if solx >= -144:
        solx=solx-5
    else:
        solx=144

    canvas.coords(image_sol2,sol2x,512)
    if sol2x >= -144:
        sol2x=sol2x-5
    else:
        sol2x=432

    canvas.coords(image_tuyau_haut,tuyx,h)
    canvas.coords(image_tuyau_bas,tuyx,h-241)
    h = randint(128,385)
    if tuyx>=-28:
        tuyx=tuyx-5
    else:
        tuyx=316

    canvas.coords(image_tuyau_haut2,tuyx2,H)
    canvas.coords(image_tuyau_bas2,tuyx2,H-241)
    H = randint(128,385)
    if tuyx2>=-28:
        tuyx2=tuyx-5
    else:
        tuyx2=488

    canvas.after(40,deplacement)

可以用canvas.move的方法将canvas item的位置改变为dx,dy;在after的帮助下,这个move可以重复调用,创造一个连续的运动。

这里是一个示例,其中您未提供的图像被替换为 canvas 项目,但在 canvas 上移动对象的原理保持不变:

import random
import tkinter as tk


WIDTH, HEIGHT = 500, 500


def create_pipes():
    pipes = []
    for x in range(0, WIDTH, 40):
        y1 = random.randrange(50, HEIGHT - 50)
        y0 = y1 + 50
        pipes.append(canvas.create_line(x, 0, x, y1))
        pipes.append(canvas.create_line(x, y0, x, HEIGHT))
    return pipes

def move_pipes():
    for pipe in pipes:
        canvas.move(pipe, -2, 0)
        x, y0, _, y1 = canvas.coords(pipe)
        if x < 0:   # reset pipe to the right of the canvas
            canvas.coords(pipe, WIDTH+20, y0, WIDTH+20, y1)
    root.after(40, move_pipes)


root = tk.Tk()
tk.Button(root, text='start', command=move_pipes).pack()
canvas = tk.Canvas(root, width=WIDTH, height=HEIGHT, bg="cyan")
canvas.pack()

pipes = create_pipes()

root.mainloop()