我正在嘗試實現一種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不移動鼠標。縮放級別/位置的任何其他組合都會導致異常結果。
我期待着您的回答。我很樂意提供所需的其他細節。