2010-07-13 32 views
1

這是我的代碼... curX和curY是我當前的X和Y座標,而tmpX和tmpY是相對的X和Y值(鼠標移動了多少)。如何將座標保持在屏幕的範圍內?

curX:= curX+tmpX; 
curY:= curY+tmpY; 

我使用這些值來移動/控制我的光標形狀。
如何將光標保持在屏幕內?

我試圖限制的值,直到Screen.Height和Screen.Width ...這裏的代碼。

if(curX>Screen.Width) then 
    curX:=Screen.Width; 
if(curY>Screen.Height) then 
    curY:=Screen.Height; 

但它沒有工作。


解決了!(排序):

curX:= max(0, min((curX+tmpX), Screen.Width)); 
curY:= max(0, min((curY+tmpY), Screen.Height)); 

我唯一的問題是,(0,0),顯然不是左上角最(非常接近,雖然,只是一對夫婦像素關閉我認爲),(畫面。 Width,Screen.Height)不是最右上角的(也是最接近的,光標在最右邊消失,儘管我認爲其中一個應該是這樣)。

+0

你是如何限制它,張貼你的代碼。 – 2010-07-13 19:50:45

回答

2

您可以通過計算(curX + tmpX)mod(screenSizeX)或使用curX:= min(curX+tmpX, screenSizeX)限制curX值來創建週期邊界條件。

+0

感謝您的回答。當我使用mod解決方案並將鼠標移動到最右側時,出現一些奇怪和有趣的原因,光標在右側消失並從左側出來,當我將它移動到底部時,它出現在頂部(儘管這不發生在我將它移動到最左邊或最頂端時)。有什麼辦法可以讓所有方面都保持一致? – Dian 2010-07-13 09:56:26

+0

這是「週期性」邊界條件。你應該用min()函數使用第二種解決方案。 – zoli2k 2010-07-13 09:57:48

+0

是的,謝謝,我用min和max(因爲min獨自並沒有阻止光標從頂部和左邊消失)。奇怪的是我不知道邊界的正確座標。 :D – Dian 2010-07-14 01:47:24

1

如果你正確地限制它,它不會超出你的範圍。發佈你的代碼,如果你想知道它爲什麼壞了。

var1 := Inc(var1,amt); 
var2 := Inc(var1,amt); 
if var1 > limit1 then 
    var1 := limit1; 
if var2 > limit2 then 
    var2 := limit2; 

您必須小心知道您的限制是否關閉系統中的所有屏幕,而不僅僅是當前屏幕。不是每個人都只有一個屏幕。有些人有多個屏幕。

+0

這與我的解決方案非常相似,但我不知道它爲什麼不起作用。光標仍然消失。 感謝您的回答,但我會牢記多屏幕的事情。 – Dian 2010-07-14 01:52:49

+0

嘗試從你的限制中減去一點。請記住,當光標位於屏幕的遠處時,您設置的位置是光標的可見尖端,可能是左上角。埃爾戈,你什麼都看不到。或者是一個像素,它是光標的頂端。 – 2010-07-14 14:09:26