Как заставить корабль не остановиться при стрельбе? - PullRequest
0 голосов
/ 05 февраля 2019

«q» должен двигаться, поэтому, когда вы нажимаете «q», вы двигаетесь в направлении мыши, а когда вы нажимаете «q» снова, вы останавливаетесь.Когда вы щелкнете мышью, корабль выстрелит, но на секунду остановится.Есть ли способ заставить его не останавливаться.Также вы можете сделать треугольник изображением ракеты?Или фоновое изображение пробела.

Код:

from turtle import Screen, Turtle, Vec2D, Turtle
import turtle
import time

screen = turtle.Screen()
screen.title("Test")
screen.setup(width=1000, height=650)

ship = turtle.Turtle()
ship.shape("triangle")
ship.turtlesize(3)
ship.speed('fast')
ship.penup()

bullet = turtle.Turtle()
bullet.shape("circle")
bullet.speed('fast')
bullet.color("green")
bullet.penup()
bullet.hideturtle()
bullet.goto(-525, -350)
bullet.hideturtle()
bullet.turtlesize(0.5)

shot=0

coin=-1
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():
    global shot
    if -350<bullet.ycor() and bullet.ycor()<350 and -525<bullet.xcor() and bullet.xcor()<525:
        bullet.forward(15)
    ship.setheading(ship.towards(target))
    if coin==1:
        ship.forward(5)
    if shot==1:
        bullet.hideturtle()
        bullet.goto(ship.xcor(), ship.ycor())
        bullet.setheading(ship.heading())
        bullet.forward(15)
        bullet.showturtle()
        shot=0

    if -275>ship.ycor() or ship.ycor()>275 or -450>ship.xcor() or ship.xcor()>450:
        ship.backward(5)
    screen.ontimer(move, 50)


def shoot(x, y):
    global shot
    if not(-350<bullet.ycor() and bullet.ycor()<350 and -525<bullet.xcor() and bullet.xcor()<525):
        shot=1
def forward():
    global coin
    coin=-coin

target = (0, 0)

onmove(screen, goto_handler)

move()

screen.onscreenclick(shoot)
screen.onkeypress(forward, "q")
screen.listen()
screen.mainloop()

1 Ответ

0 голосов
/ 05 февраля 2019

Я попытался оптимизировать ваш код чуть ниже, чтобы пуля реагировала быстрее при выстреле.Я сделал пробел квадратным, а не прямоугольным, чтобы в одних направлениях не происходило больше задержки, чем в других.Я также параметризовал его, чтобы вы могли выбрать другой размер, и он должен быть отрегулирован.Я исключил переменную 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 просто, но изображение не будет поворачиваться вместе с черепахой.Это требует больше изображений, больше кода и больше времени.Я бы придерживался вашего треугольного курсора над космическим кораблем на основе изображений.

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

...