拍摄时乌龟停下来

时间:2019-03-08 05:53:20

标签: python turtle-graphics

我遇到了一个问题,即我射击时敌方乌龟会停下来。我是python的新手,所以我知道我的代码很糟糕。我似乎无法发现为什么会发生这种情况,但是我假设它与while循环有关。

这是代码: (我添加了注释,因此很容易跳到其中的重要部分)

import turtle
import os
#wn is window
#bp = border
bullet = 'ready'
#screen setup
wn = turtle.Screen()
wn.bgcolor('black')
wn.title('SPACE.INVADERS')


#border
bp = turtle.Turtle()
bp.speed(0)
bp.color('green')
bp.penup()
bp.setposition(-300,-300)
bp.pendown()
count=0
while count != 5:
    count= (count+1)
    bp.fd(600)
    bp.lt(90)
bp.hideturtle()

#player
p = turtle.Turtle()
p.color('red')
p.shape('triangle')
p.penup()
p.speed(0)
p.setposition(0,-250)
p.setheading(90)

#enemy
e = turtle.Turtle()
e.penup()
e.speed(0)
e.shape('square')
e.shapesize(1.25,1.25)
e.color('orange')
e.setpos(-250,250)
e.speed(1)





#p = player
#ps = player speed

ps = 15

#moving left and right
def left_mov():
    x = p.xcor()
    x -= ps
    p.setx(x)

def right_mov():
    x = p.xcor()
    x += ps
    p.setx(x)
#shooting
def shoot():
    global bullet
    if bullet == 'ready':
        bullet = 'fire'
        shot= turtle.Turtle()
        shot.penup()
        shot.speed(0)
        shot.goto(p.pos())
        shot.color('white')
        shot.shape('triangle')
        shot.shapesize(0.5)
        shot.lt(90)
        shot.speed(1)
        shot.fd(550)
        bullet = 'ready'




#bindings
turtle.listen()
turtle.onkey(left_mov, 'Left')
turtle.onkey(right_mov, 'Right')
turtle.onkey(shoot, 'space')
#enemy movement
while True:
    e.fd(500)
    e.rt(90)
    e.fd(25)
    e.rt(90)
    e.fd(500)
    e.lt(90)
    e.fd(25)
    e.lt(90)

1 个答案:

答案 0 :(得分:0)

  

我假设它与while循环有关

是的,它不应该在那里!在像乌龟这样的事件驱动世界中,永远不应存在while True:循环。取而代之的是,我们需要一个定时事件,该定时事件以固定的时间间隔触发,该事件对运动中的对象(敌人和项目符号)进行增量更新,以使它们看起来同时运动。以下是我使用计时器事件对代码的重做:

from turtle import Screen, Turtle

# moving left and right
def left_move():
    player.setx(player.xcor() - player_speed)

def right_move():
    player.setx(player.xcor() + player_speed)

# screen setup
screen = Screen()
screen.bgcolor('black')
screen.title('SPACE.INVADERS')

# border
border = Turtle(visible=False)
border.speed('fastest')
border.color('green')

border.penup()
border.setposition(-300, -300)
border.pendown()

for _ in range(4):
    border.forward(600)
    border.left(90)

# player
player = Turtle('triangle')
player.speed('fastest')
player.color('red')

player.penup()
player.setposition(0, -250)
player.setheading(90)

player_speed = 15

# enemy
enemy = Turtle('square')
enemy.speed('fast')
enemy.shapesize(1.25)
enemy.color('orange')
enemy.penup()

enemy.setpos(-250, 250)

enemy_speed = 6  # enemy speed
enemy_direction = 1  # enemy direction

# bullet
bullet = Turtle('triangle', visible=False)
bullet.speed('fastest')
bullet.color('white')
bullet.shapesize(0.5)
bullet.penup()
bullet.left(90)

bullet_speed = 9  # bullet speed

# shooting

def shoot():
    if not bullet.isvisible():
        bullet.goto(player.position())
        bullet.showturtle()

def move():
    global enemy_direction

    if bullet.isvisible():
        if bullet.ycor() > 275:
            bullet.hideturtle()
        else:
            bullet.forward(bullet_speed)

    # enemy movement

    enemy.forward(enemy_direction * enemy_speed)
    enemy.settiltangle(enemy.tiltangle() + 3)  # just for fun

    x, y = enemy.position()

    if x > 250 or x < -250:
        enemy_direction *= -1
        enemy.sety(y - 25)

    screen.ontimer(move, 50)

# bindings
screen.onkey(left_move, 'Left')
screen.onkey(right_move, 'Right')
screen.onkey(shoot, 'space')
screen.listen()

move()

screen.mainloop()

这应该为您提供前进所需的基本功能,并添加碰撞检测(子弹到敌人,敌人到玩家,玩家到墙壁)和计分。

还要注意,海龟是全局实体,因此每次需要时都创建新项目符号是个坏主意。即使您均匀地允许子弹重叠,也要为此目的保留一组可重复使用的子弹。