2017-12-19 4 views
2

私は接続ドットのpythonゲームを作ろうとしています。私はゲームに2ボタン押下を登録したい。例:ユーザーが上向き矢印キーを押すと、カメは北東45度に移動します。複数のキープレスをタートルのグラフィックで結合する方法は?

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") 
+0

あなたは 'key_up = True'と' key_right = True'を設定するためにonkeyとonkeyreleaseを使うことができ、 'rigth'を押すと' key_up == True'をすでに持っていれば2つのキーの組み合わせがあります。同じ: 'up'を押しても' key_right == True'をすでに持っていれば、あなたのcombination.Andはonkeyreleaseを使って変数 'False'を設定してください。 – furas

答えて

1

私はあなたがきれいにonkeypress()onkeyrelease()イベントの間、この調整変数を解決することができるという懐疑的だ:

は、ここに私のコードです。私は、キーの押下は、単に移動要求を投稿代替アプローチを提供します(。私は喜んだろうけどそれ以外に示される)と、タイマは、個々のかどうか、これらの要求を適用するか、ダブルアップ:

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() 

enter image description here

これは、あなたの特定のニーズに応じて、いくつかの微調整を必要とするかもしれません。 (例:key_eventsで2つ以上のイベントを処理する方法)

+0

とてもいいアイディアです。 – furas

+0

ああ、私は、コードを改訂していただきありがとうございます。しかし、私はコーディングの初心者です。 _key_eventsとはどういう意味ですか?それのためのpythonのドキュメントはありますか?ありがとう –

+0

@AjwadKabir、 'key_events'変数は単なるPythonの' set'です。私は複数の「UP」などのイベントが1つのイベントに崩壊するように「セット」を使用しました。カメのライブラリにあるものを除いて、ここで使用される追加のPythonの機能はありません。興味深い追加の部分は、カメのライブラリからの 'ontimer()'イベントです。このイベントは、将来機能を発動させることを可能にします。 – cdlane

関連する問題