2014-03-02 161 views
2

在NetLogo中對於鼠標操作使用mouse-down?通常會導致操作發生太多次。例如,如果你想讓用戶點擊創建新的烏龜,你可以將一個永遠扣到像一個過程:在NetLogo中檢測鼠標點擊/鼠標上移

to add-turtle 
    if mouse-down? [ 
    crt 1 [ setxy mouse-xcor mouse-ycor ] 
    ] 
end 

的問題是,這通常會導致每次點擊創建許多海龜。我想這樣做:

to add-turtle 
    if mouse-clicked? [ 
    crt 1 [ setxy mouse-xcor mouse-ycor ] 
    ] 
end 

哪裏mouse-clicked?是真正正確的人點擊(右後他們離開了鼠標按鈕)。

回答

3

不幸的是,你必須自己跟蹤它,但好消息是它並不難。

關鍵是要創建一個名爲mouse-was-down?的全局變量,如果mouse-down?在上次調用面向鼠標的過程時爲true,則該變量被設置爲true。

to-report mouse-clicked? 
    report (mouse-was-down? = true and not mouse-down?) 
end 

這似乎是結合調用其他基於點擊的程序中央鼠標管理程序效果很好,於是mouse-clicked?可如下定義。例如:

globals [ mouse-was-down? ] 

to-report mouse-clicked? 
    report (mouse-was-down? = true and not mouse-down?) 
end 

to mouse-manager 
    let mouse-is-down? mouse-down? 
    if mouse-clicked? [ 
    add-turtle 
    ; Other procedures that should be run on mouse-click 
    ] 
    set mouse-was-down? mouse-is-down? 
end 

to add-turtle 
    crt 1 [ setxy mouse-xcor mouse-ycor ] 
end 

使用mouse-is-down?局部變量保持行爲更加一致,如果鼠標按鈕之前mouse-manager完成發佈。

+1

參見例如鼠標拖動一個示例,在NetLogo的模型庫的代碼示例部分。它使用'while [mouse-down?] ...'樣式循環。 –

1

你好,這可能是你的目的有點晚了,但如果有人有同樣的問題,這就是我現在在我的模型中解決了這個問題。

to add-turtle 
    if mouse-down? [ 
    crt 1 [ setxy mouse-xcor mouse-ycor ] 
    stop 
    ] 
end 

這裏的解決方法是添加一個「停止」命令來終止「create-new-turtle」forever按鈕。唯一的折衷是你將不得不再次按下來創建另一隻新的烏龜。

0

布賴恩海德的答案對我來說並不奏效,它仍然在一次點擊中創建了多個海龜。

備選:

A(非永遠)按鈕,這確實crt 1 [ setxy mouse-xcor mouse-ycor ]
與動作鍵A

現在,您只需用左手按住A即可添加烏龜。

0

下面是布賴恩的替代代碼,如果你想盡快鼠標按鍵(而不是等到它的發佈)執行操作:

globals [ mouse-clicked? ] 

to mouse-manager 
    ifelse mouse-down? [ 
    if not mouse-clicked? [ 
     set mouse-clicked? true 
     crt 1 [ setxy mouse-xcor mouse-ycor ] 
    ] 
    ] [ 
    set mouse-clicked? false 
    ] 
end 
+0

唯一需要注意的是,您必須確保_not_不會爲您的「永久」按鈕指定鍵盤快捷鍵。這是爲了避免在鼠標點擊變量有機會初始化爲布爾值(而不是默認值「0」)之前在視圖中註冊點擊。另一種方法是編寫'如果鼠標點擊!= true'而不是'不點擊鼠標?',但這不是可讀的)。 –