Я попытался оптимизировать ваш код чуть ниже, чтобы пуля реагировала быстрее при выстреле.Я сделал пробел квадратным, а не прямоугольным, чтобы в одних направлениях не происходило больше задержки, чем в других.Я также параметризовал его, чтобы вы могли выбрать другой размер, и он должен быть отрегулирован.Я исключил переменную shot
и вместо этого использую состояние видимости черепахи:
from turtle import Screen, Turtle, Vec2D
SPACE = 825
CURSOR_SIZE = 20
BULLET_SIZE = 10
BULLET_BOUNDS = SPACE/2 + BULLET_SIZE/2
SHIP_SIZE = 60
SHIP_BOUNDS = SPACE/2 - SHIP_SIZE/2
def onmove(self, fun, add=None):
if fun is None:
self.cv.unbind('<Motion>')
else:
def eventfun(event):
fun(Vec2D(self.cv.canvasx(event.x) / self.xscale, -self.cv.canvasy(event.y) / self.yscale))
self.cv.bind('<Motion>', eventfun, add)
def goto_handler(position):
global target
onmove(screen, None)
target = position
onmove(screen, goto_handler)
def move():
x, y = bullet.position()
if -BULLET_BOUNDS < x < BULLET_BOUNDS and -BULLET_BOUNDS < y < BULLET_BOUNDS:
bullet.forward(15)
else:
bullet.hideturtle()
ship.setheading(ship.towards(target))
if coin:
x, y = ship.position()
if -SHIP_BOUNDS < x < SHIP_BOUNDS and -SHIP_BOUNDS < y < SHIP_BOUNDS:
pass
else:
ship.setheading(ship.towards((0, 0)))
ship.forward(5)
screen.ontimer(move, 50)
def shoot(x, y):
screen.onscreenclick(None)
if not bullet.isvisible():
bullet.goto(ship.position())
bullet.setheading(ship.heading())
bullet.showturtle()
bullet.forward(30)
screen.onscreenclick(shoot)
def forward():
global coin
coin = not coin
screen = Screen()
screen.setup(width=SPACE, height=SPACE)
ship = Turtle("triangle")
ship.turtlesize(SHIP_SIZE / CURSOR_SIZE)
ship.speed('fastest')
ship.penup()
bullet = Turtle("circle", visible=False)
bullet.turtlesize(BULLET_SIZE / CURSOR_SIZE)
bullet.speed('fastest')
bullet.color("green")
bullet.penup()
coin = False
target = (0, 0)
onmove(screen, goto_handler)
move()
screen.onscreenclick(shoot)
screen.onkeypress(forward, "q")
screen.listen()
screen.mainloop()
Чтобы установить фон, найдите космическое изображение в формате GIF (но не анимированное) размером больше необходимого.,Отредактируйте его до размера и используйте screen.bgpic("space.gif")
, чтобы сделать его фоном.
Использовать изображение корабля сложнее.Настроить черепаху на использование изображения в формате GIF просто, но изображение не будет поворачиваться вместе с черепахой.Это требует больше изображений, больше кода и больше времени.Я бы придерживался вашего треугольного курсора над космическим кораблем на основе изображений.
В качестве альтернативы, вы можете нарисовать космический корабль в черепахе, используя несколько цветных многоугольников, и установить его в качестве курсора - он должен корректно поворачиваться с курсором.Посмотрите этот пример с использованием курсора в форме танка .