Как заставить экран холста Turtle двигаться с модулем Turtle? - PullRequest
0 голосов
/ 28 апреля 2019

Для классного проекта я пытаюсь сделать Rogue-подобную игру с Python (3.7.3) Turtle.Я хочу знать, возможно ли, чтобы экран холста центрировался на моем модуле "игрока" черепахи, чтобы он не выходил за пределы поля зрения пользователя и пользователю не приходилось использовать полосу прокрутки.

Я пытался найти несколько разных решений, но, похоже, ни одно из них не касалось моего вопроса.Я также попытался просмотреть раздел «Черепаха» на веб-сайте Python и не знаю, что поможет.

# Draw border
border_pen = turtle.Turtle()
border_pen.speed(0)
border_pen.color('black')
border_pen.penup()
border_pen.setposition(-600,-600)
border_pen.pendown()
border_pen.pensize(3)
for side in range(4):
    border_pen.fd(600)
    border_pen.lt(90)
border_pen.hideturtle()

Выше приведен только код, который я использовал для создания самого холста.Как видите, он довольно большой (так и должно быть).Сначала я не думал, что это проблема, но теперь вижу, что это довольно сложно.Мой модуль, как я уже сказал, может сойти с экрана.

1 Ответ

1 голос
/ 29 апреля 2019

Ниже приведен пример манипулирования прокруткой на уровне tkinter для получения желаемого поведения. В этом случае я держу черепаху в центре экрана, но с помощью клавиш со стрелками перемещаю пейзаж под ней.

Код между ### Generate a landscape ... и ### Finished generating a ... взят из SO-вопроса, на который я ответил ранее, и предназначен для изучения интересного фрактального ландшафта:

from turtle import Turtle, Screen
from random import random

MAGNIFICATION = 10

def move_left():
    canvas.xview_scroll(-1, "units")
    turtle.setx(turtle.xcor() - MAGNIFICATION)

def move_right():
    canvas.xview_scroll(1, "units")
    turtle.setx(turtle.xcor() + MAGNIFICATION)

def move_up():
    canvas.yview_scroll(-1, "units")
    turtle.sety(turtle.ycor() + MAGNIFICATION)

def move_down():
    canvas.yview_scroll(1, "units")
    turtle.sety(turtle.ycor() - MAGNIFICATION)

screen = Screen()
width, height = screen.screensize()
screen.screensize(width * MAGNIFICATION, height * MAGNIFICATION)

canvas = screen.getcanvas()
canvas.config(xscrollincrement=str(MAGNIFICATION))
canvas.config(yscrollincrement=str(MAGNIFICATION))

# turtle initialization
turtle = Turtle("turtle", visible=False)
turtle.width(MAGNIFICATION)
turtle.resizemode('auto')

### Generate a landscape to explore

screen.tracer(False)

RULES = {'x':'x+yf+', 'y':'-fx-y', 'f':'f', '+':'+', '-':'-'}
sub_string = string = "fx"
LEVEL = 13

for _ in range(LEVEL):

    turtle.pencolor(random(), random(), random())

    for character in sub_string:
        if character == '+':
            turtle.right(90)
        elif character == '-':
            turtle.left(90)
        elif character == 'f':
            turtle.forward(5 * MAGNIFICATION)

    screen.update()

    full_string = "".join(RULES[character] for character in string)
    sub_string = full_string[len(string):]
    string = full_string

screen.tracer(True)

### Finished generating a landscape to explore

turtle.penup()
turtle.home()
turtle.setheading(90)
turtle.color('dark green', 'light green')
turtle.showturtle()

screen.onkey(move_left, "Left")
screen.onkey(move_right, "Right")
screen.onkey(move_up, "Up")
screen.onkey(move_down, "Down")
screen.listen()

screen.mainloop()

Полосы прокрутки отражают движение по всему пространству. К сожалению, полосы прокрутки по-прежнему активны и будут перебрасывать вещи (используйте вместо них клавиши со стрелками), и нужно работать около краев ландшафта, но это просто пример, чтобы показать, что почти все возможно, если вы потратите время на исследуйте основы Tkinter / Tk.

enter image description here

...