问题描述
我正在尝试制作一个connect-the-dot python 游戏.我希望游戏注册 2 个按钮按下.示例:如果用户按下向上和向右箭头键,海龟将向东北方向移动 45 度.
I'm trying to make a connect-the-dot python game. I want the game to register 2 button presses. Example: if the user presses Up and Right arrow key, the turtle goes 45 degrees north east.
这是我的代码:
import turtle
flynn=turtle.Turtle()
win=turtle.Screen()
win.bgcolor("LightBlue")
flynn.pensize(7)
flynn.pencolor("lightBlue")
win.listen()
def Up():
flynn.setheading(90)
flynn.forward(25)
def Down():
flynn.setheading(270)
flynn.forward(20)
def Left():
flynn.setheading(180)
flynn.forward(20)
def Right():
flynn.setheading(0)
flynn.forward(20)
def upright():
flynn.setheading(45)
flynn.forward(20)
win.onkey(Up, "Up")
win.onkey(Down,"Down")
win.onkey(Left,"Left")
win.onkey(Right,"Right")
推荐答案
我怀疑你能否在 onkeypress()
和 onkeyrelease()
之间干净地解决这个协调变量> 事件.(虽然我很乐意以其他方式显示.)我提供了一种替代方法,其中按键简单地发布移动请求,并且计时器应用这些请求,无论是单独的还是加倍的:
I'm skeptical that you can cleanly solve this coordinating variables between onkeypress()
and onkeyrelease()
events. (Though I'd be pleased to be shown otherwise.) I offer an alternate approach where key presses simply post move requests and a timer applies those requests, whether individual or doubled up:
from turtle import Turtle, Screen
win = Screen()
flynn = Turtle('turtle')
def process_events():
events = tuple(sorted(key_events))
if events and events in key_event_handlers:
(key_event_handlers[events])()
key_events.clear()
win.ontimer(process_events, 200)
def Up():
key_events.add('UP')
def Down():
key_events.add('DOWN')
def Left():
key_events.add('LEFT')
def Right():
key_events.add('RIGHT')
def move_up():
flynn.setheading(90)
flynn.forward(25)
def move_down():
flynn.setheading(270)
flynn.forward(20)
def move_left():
flynn.setheading(180)
flynn.forward(20)
def move_right():
flynn.setheading(0)
flynn.forward(20)
def move_up_right():
flynn.setheading(45)
flynn.forward(20)
def move_down_right():
flynn.setheading(-45)
flynn.forward(20)
def move_up_left():
flynn.setheading(135)
flynn.forward(20)
def move_down_left():
flynn.setheading(225)
flynn.forward(20)
key_event_handlers = { \
('UP',): move_up, \
('DOWN',): move_down, \
('LEFT',): move_left, \
('RIGHT',): move_right, \
('RIGHT', 'UP'): move_up_right, \
('DOWN', 'RIGHT'): move_down_right, \
('LEFT', 'UP'): move_up_left, \
('DOWN', 'LEFT'): move_down_left, \
}
key_events = set()
win.onkey(Up, "Up")
win.onkey(Down, "Down")
win.onkey(Left, "Left")
win.onkey(Right, "Right")
win.listen()
process_events()
win.mainloop()
这可能需要根据您的特定需求进行一些微调.(例如,您如何在 key_events
中处理两个以上的事件).
This might take some fine tuning depending on your particular needs. (E.g. how you handle more than two events in key_events
).
这篇关于如何在海龟图形中将多个按键绑定在一起?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!