【问题标题】:How do I make an object disappear after some time?如何让对象在一段时间后消失?
【发布时间】:2019-05-12 01:17:29
【问题描述】:

我正在尝试制作一款可以按空格射击子弹的游戏。有很多滞后。我试图弄清楚如何让子弹在退出屏幕后消失。还有很多滞后。我很确定滞后是因为子弹到达终点后没有重置屏幕。我导入了时间,但我似乎无法弄清楚如何使用时间。

这是我尝试过的:

# Importing GUI library
import turtle 
import time

bullets = []
bullets2 = []
# Set speed, GUI, creates new turtle
t_speed = 5
bullet_speed = 50000
screen = turtle.Screen()
t = turtle.Turtle()
t2=turtle.Turtle()
screen.setup(700, 400)

# Arrow Keys as turtle movement
def forward():
  t.forward(t_speed)
def left():
  t.left(t_speed)
def right():
  t.right(t_speed)
def back():
  t.back(t_speed)
def forward2():
  t2.forward(t_speed)
def left2():
  t2.left(t_speed)
def right2():
  t2.right(t_speed)
def back2():
  t2.back(t_speed)

# Shoot a turtle from a turtle
def shoot():
  # sets position of bullet at x and y of t
  # spawn turtle at x and y
  bullet = turtle.Turtle()
  bullet.ht()
  bullet.penup()
  # Launch him
  screen.addshape("uparrow.png")
  bullet.shape("uparrow.png")
  bullet.setheading(t.heading())
  bullet.setposition(t.xcor(), t.ycor())
  bullet.st()
  bullet.forward(700)
  bullet.speed(bullet_speed)
  #TODO: Make less laggy by deleting bullet object after x seconds
def shoot2():
  # set a timer
  current = time.localtime().tm_sec
  # sets position of bullet at x and y of t
  # spawn turtle at x and y
  bullet = turtle.Turtle()
  bullets2.append(bullet)
  bullet.ht()
  bullet.penup()
  # Launch him
  screen.addshape("uparrow.png")
  bullet.shape("uparrow.png")
  bullet.setheading(t2.heading())
  bullet.setposition(t2.xcor(), t2.ycor())
  bullet.st()
  bullet.forward(700)
  bullet.speed(bullet_speed)
  #TODO: Make less laggy by deleting bullet object after x seconds
  #new = time.localtime().tm_sec
  #if new > current + 3:
    #bullets2.

def playGame():
  # TODO: Health Bar

  # TODO: Characters

  t.penup()
  t.setheading(5)
  t2.penup()
  # TODO
  still_alive = True
  # Movement
  screen.onkey(back, "Down")
  screen.onkey(left, "Left")
  screen.onkey(right, "Right")
  screen.onkey(shoot, "space")
  screen.onkey(forward, "Up")
  screen.onkey(back2, "S")
  screen.onkey(left2, "A")
  screen.onkey(right2, "D")
  screen.onkey(shoot2, "Z")
  screen.onkey(forward2, "W")
  # Game Engine
  screen.listen()
  t.mainloop()

def gameStart():
  # Title
  print("Welcome to my game!")
  # Menu; press Q to quit, Press p to play
  startGame = True
  while startGame == True:
    inp = raw_input("Press p to play or Press q to quit")
    if inp == "q":
      exit()
    elif inp == "p":
      playGame()
      startGame = False
    else:
      print("Incorrect prompt")
  # Instructions
  print("Use Arrow Keys to move. Press space to shoot")

def main():
  gameStart()

if __name__ == "__main__":
  main()

对象应该会在一段时间后消失。

【问题讨论】:

  • 阅读这篇关于从内存中删除对象的帖子,可能会有用:stackoverflow.com/questions/1316767/…
  • @Kafels,我相信 OP 希望对象从 screen 中消失,而不是从 memory 中消失。 (Python 海龟是不会被垃圾回收的全局实体,因此我们需要尽可能重用它们。)

标签: python python-3.x turtle-graphics


【解决方案1】:

您的程序似乎是一系列错误观念与糟糕的代码管理相结合的产物。你的子弹不仅有延迟,而且它在运动时会锁定所有其他动作!让我们抛开时间模块的想法,取而代之的是利用turtle自己的定时器事件来真正让子弹飞起来:

from turtle import Screen, Turtle

# Arrow Keys as turtle movement
def forward_1():
    player_1.forward(player_speed)

def back_1():
    player_1.back(player_speed)

def left_1():
    player_1.left(player_speed)

def right_1():
    player_1.right(player_speed)

def shoot_1():
    screen.onkey(None, "space")  # disable handler inside handler!
    shoot(player_1)
    screen.onkey(shoot_1, "space")

def forward_2():
    player_2.forward(player_speed)

def left_2():
    player_2.left(player_speed)

def right_2():
    player_2.right(player_speed)

def back_2():
    player_2.back(player_speed)

def shoot_2():
    screen.onkey(None, "z")
    shoot(player_2)
    screen.onkey(shoot_2, "z")

def travel(bullet, milliseconds):
    bullet.forward(bullet_speed)

    if milliseconds:
        screen.ontimer(lambda b=bullet, s=milliseconds - 100: travel(b, s), 100)
    else:
        bullet.hideturtle()
        bullets.append(bullet)

# Shoot a bullet from a player
def shoot(player):
    # sets position of bullet at x and y of player
    # spawn turtle at x and y
    if bullets:
        bullet = bullets.pop(0)
    else:
        bullet = Turtle(visible=False)
        # bullet.shape("uparrow.png")
        bullet.shape('arrow')
        bullet.speed('fastest')
        bullet.penup()

    # Launch him
    bullet.color(player.fillcolor())
    bullet.setheading(player.heading())
    bullet.setposition(player.position())
    bullet.showturtle()

    travel(bullet, 2000)

bullets = []

# Set speed, GUI, creates new turtle
player_speed = 10
bullet_speed = 15

screen = Screen()
screen.setup(700, 400)
# screen.addshape("uparrow.png")

player_1 = Turtle('triangle')
player_1.speed('fastest')
player_1.color('red', 'pink')
player_1.penup()
player_1.setheading(90)

player_2 = Turtle('triangle')
player_2.speed('fastest')
player_2.color('blue', 'cyan')
player_2.penup()
player_2.setheading(270)

# Movement
screen.onkey(forward_1, "Up")
screen.onkey(back_1, "Down")
screen.onkey(left_1, "Left")
screen.onkey(right_1, "Right")
screen.onkey(shoot_1, "space")

screen.onkey(forward_2, "w")
screen.onkey(back_2, "s")
screen.onkey(left_2, "a")
screen.onkey(right_2, "d")
screen.onkey(shoot_2, "z")

# Game Engine
screen.listen()
screen.mainloop()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-18
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多