Search code examples
pythonturtle-graphicspython-turtle

Use of ontimer function to make two turtles move at same time


I 've been struggling to make both turtles move at the same time. Either one moves or they are both are frozen. I'm currently using the ontimer() function but still don't understand it completely. The game is if you are wondering based of the paperio game but two players go against each other on the same keyboard and screen My code:

from turtle import *
import turtle

p1f = True
p2f = True
title("1v1 Paperio")
p1move = Turtle()
p2move = Turtle()
t1 = Turtle()
t2 = Turtle()
screen = Screen()


def Setup1():
    t1.pencolor("aquamarine")
    t1.pensize(5)
    t1.speed(10)
    t1.fillcolor("light sea green")
    t1.hideturtle()
    t1.penup()
    t1.goto(-200, -200)
    t1.pendown()
    t1.begin_fill()
    for i in range(4):
        t1.forward(50)
        t1.left(90)
    t1.end_fill()
    p1move.penup()
    p1move.goto(-175, -175)
    p1move.pendown()


def Setup2():
    t2.pencolor("crimson")
    t2.pensize(5)
    t2.speed(10)
    t2.fillcolor("red")
    t2.hideturtle()
    t2.penup()
    t2.goto(200, 200)
    t2.pendown()
    t2.begin_fill()
    for i in range(4):
        t2.forward(50)
        t2.left(90)
    t2.end_fill()
    p2move.penup()
    p2move.goto(225, 225)
    p2move.pendown()


def p1setup():
    p1move.pencolor("aquamarine")
    p1move.pensize(5)
    p1move.speed(10)
    p1move.fillcolor("light sea green")


def p2setup():
    p2move.pencolor("crimson")
    p2move.pensize(5)
    p2move.speed(10)
    p2move.fillcolor("red")


# ycord
# heading
def p1moving():
    def p1k1():
        p1x1 = p1move.xcor()
        p1y1 = p1move.ycor()
        while p1f == True:
            p1move.forward(1)
            screen.ontimer(p1moving, 1)

    def p1k2():
        p1move.left(90)

    def p1k3():
        p1move.right(90)





def p2moving():
    def p2k1():
        p2f = True
        p2x2 = p2move.xcor()
        p2y2 = p2move.ycor()
        while p2f == True:
            p2move.forward(1)
            screen.ontimer(p2moving, 1)

    def p2k2():
        p2move.left(90)

    def p2k3():
        p2move.right(90)

screen.listen()
screen.onkey(p1k1, "w")
screen.onkey(p1k2, "a")
screen.onkey(p1k3, "d")
screen.onkey(p2k1, "Up")
screen.onkey(p2k2, "Left")
screen.onkey(p2k3, "Right")



if __name__ == "__main__":
    Setup1()
    Setup2()
    p1setup()
    p2setup()

    screen.mainloop()

Solution

  • Most of your code seems reasonable until you get to the key and timer event functions -- you have unused variables and functions that don't get called. Your functions defined inside functions are particularly problematic. I've reworked your code below to run as you describe. I've also done some speed optimizations to make it "play" a little better:

    from turtle import Screen, Turtle
    
    def setup1():
        base1.hideturtle()
        base1.color("light sea green", "aquamarine")
        base1.pensize(5)
    
        base1.penup()
        base1.goto(-200, -200)
        base1.pendown()
    
        base1.begin_fill()
    
        for _ in range(4):
            base1.forward(50)
            base1.left(90)
    
        base1.end_fill()
    
        pen1.color("light sea green", "aquamarine")
        pen1.pensize(5)
        pen1.setheading(0)
    
        pen1.penup()
        pen1.goto(-175, -175)
        pen1.pendown()
    
    def setup2():
        base2.hideturtle()
        base2.color("red", "pink")
        base2.pensize(5)
    
        base2.penup()
        base2.goto(200, 200)
        base2.pendown()
    
        base2.begin_fill()
    
        for _ in range(4):
            base2.forward(50)
            base2.left(90)
    
        base2.end_fill()
    
        pen2.color("red", "pink")
        pen2.pensize(5)
        pen2.setheading(180)
    
        pen2.penup()
        pen2.goto(225, 225)
        pen2.pendown()
    
    def p1k1():
        screen.onkey(None, 'w')
    
        def p1forward():
            pen1.forward(1)
            screen.update()
            screen.ontimer(p1forward, 10)
    
        p1forward()
    
    def p1k2():
        pen1.left(90)
        screen.update()
    
    def p1k3():
        pen1.right(90)
        screen.update()
    
    def p2k1():
        screen.onkey(None, 'Up')
    
        def p2forward():
            pen2.forward(1)
            screen.update()
            screen.ontimer(p2forward, 10)
    
        p2forward()
    
    def p2k2():
        pen2.left(90)
        screen.update()
    
    def p2k3():
        pen2.right(90)
        screen.update()
    
    screen = Screen()
    screen.title("1v1 Paperio")
    screen.tracer(False)
    
    base1 = Turtle()
    pen1 = Turtle()
    setup1()
    
    base2 = Turtle()
    pen2 = Turtle()
    setup2()
    
    screen.onkey(p1k1, 'w')
    screen.onkey(p1k2, 'a')
    screen.onkey(p1k3, 'd')
    
    screen.onkey(p2k1, 'Up')
    screen.onkey(p2k2, 'Left')
    screen.onkey(p2k3, 'Right')
    
    screen.update()
    screen.listen()
    screen.mainloop()
    

    enter image description here