2015-02-24 161 views
0

我正在嘗試實現一種2D功能,它可以放大鼠標。 這一切都舉辦這樣的:獲取相對於鼠標的縮放產生的偏移量

遊戲對象具有不受印刷變焦或偏移的任意位置。 (作爲任意的,我選擇用左上角的(0,0)開始每個關卡,等於渲染引擎使用的關卡)

遊戲資產是像素完美的,需要停留因爲它放大縮小。所以我用一個整數來表示縮放級別,縮放比例是2^zoom。

每個對象由使用其私有的位置和取縮放級別(一個整數)和兩個整數指示偏移的功能呈現在屏幕上。

它打印添加偏移到它的座標,並乘以2 ^放大。

主循環基本完成了所有的輸入處理,那麼所有的內部狀態的更新,然後渲染。 (像往常一樣) 所有的混亂將不得不在更新部分,因爲渲染將只接受縮放級別和x和y偏移量。

我試圖實現它在這個其他問題的第一個答案是看到: C++ Zoom into the centre of the screen in 2D coordinates 並採取爲座標鼠標的位置,而不是屏幕的中心。

主要頭痛來自試圖讓偏移必須被正確地送入渲染功能。

相關的功能代碼目前看起來是這樣的:

void PlayState::updateOffset(bool zoomIn, int zoomLevel, int MouseX, int MouseY){ 

float finalX, finalY, sF, scaledPosition0x; 
float scaledPosition0y, scaledPosition1x, scaledPosition1y; 

sF = pow(2,zoomLevel); 

if(zoomIn){ 
    scaledPosition0x = MouseX*pow(2,zoomLevel-1)+xOffset; 
    scaledPosition0y = MouseY*pow(2,zoomLevel-1)+yOffset; 
}else{ 
    scaledPosition0x = MouseX*pow(2,zoomLevel+1)+xOffset; 
    scaledPosition0y = MouseY*pow(2,zoomLevel+1)+yOffset; 
} 

scaledPosition1x = MouseX*sF+xOffset; 
scaledPosition1y = MouseY*sF+yOffset; 

finalX = (scaledPosition0x-scaledPosition1x)/sF; 
finalY = (scaledPosition0y-scaledPosition1y)/sF; 

incrementOffset(finalX, finalY);} 

增量偏移功能只檢查如果偏移量太大,糾正它。正如你所看到的,它看起來像鏈接問題答案中的代碼。它看起來像上面提到的代碼的複製粘貼,但我試圖實現許多(「很長很長」很多)其他方式,甚至對這個代碼進行一些修改,沒有一個更接近預期的結果。

目前,它可以創造奇蹟,只要你保持你的鼠標在0,0,或從滾動縮放等級爲0的任意位置指向-1或爲1,回到0不移動鼠標。縮放級別/位置的任何其他組合都會導致異常結果。

我期待着您的回答。我很樂意提供所需的其他細節。

回答

0

解決

我會張貼工作對我的情況下,任何人有同樣的問題的答案。 無論如何,我會等待相當長的時間來接受更直接或更寬的答案,同時仍然適用。

問題的答案在於存儲偏移的方式(未縮放)。

這是一個有些奇怪,因爲變焦是在代碼的不同部分完成的,所以我們通常會做矩陣(撤消 - 運營 - 重做)是無效的。但是,如果加強我在追隨的道路上的洞察力。

如上所示,首先要做的是撤消操作。又名在未觸及的場景中找到鼠標的位置(不縮放也不偏移)。

原始場景中的鼠標位置將是OMP。 屏幕中的鼠標位置將爲MP。 Z0將應用最後一幀的縮放。 Off0將是我們在最後一幀中的偏移量。

OMP =(MP-Off0 * Z0)/ Z0

然後我們做了新的縮放倒數,所以我們看看那裏將變焦結束了,如果我們未縮放現在*和之間的區別後者和前者會給我們帶來偏差。

關閉1 = MP/Z1 - OMP

*:如果不撤銷偏移,當前偏移被自動保存,所以以後我們會改變一個爲其他,不會需要添加/從以前的offseet減去

如果有人感興趣,我會給它的代碼,但方程式應該可以翻譯成任何語言。只要我有足夠的聲望將圖像放入答案中,我就會以奇特的方式發佈這些配方。