2013-10-23 100 views
0

首先,我不認爲自己正在製作「SFML和/或C++性能問題」類型的問題。我對這個地圖編輯器的表現並不滿意,我一直在努力,並且我99%確信我對此有錯。地圖編輯器性能建議

目前我如何在地圖上放置瓷磚基本上是我有一個函數,循環通過地圖上的每個單獨的瓷磚,並檢查鼠標是否懸停在它上面。我把這個功能稱爲handleMouseClick()

這是很多功能,如果你只是點擊每次你想放置一個瓷磚,但我有點像畫筆。即使地圖上只有500個貼圖,如果您快速在屏幕上拖動它,它也會跳過貼圖。我需要能夠創建具有5000多個貼圖的地圖,並且我無法承受如此高的性能。

我查看了我的代碼,並確保我沒有做不必要的副本。我非常肯定,提高性能的最佳方法是改變我檢查鼠標改變的方式。

我唯一的想法是在「塊」地圖,以便它會檢查「塊」的瓷磚鼠標在。

+0

你的瓷磚正方形和所有相同的大小? –

+0

是的,他們是,你的答案看起來像肯定會幫助你。 –

回答

3

使用數學。可以說你有像素尺寸爲{tile.width, tile.height}的瓷磚。而你的應用程序的窗口是地圖的視圖,窗口的左上角是像素{view.x, view.y}。並且相對於窗口左上角的鼠標位置是{mouse.x, mouse.y}。你可以計算出鼠標指向具有下列哪個瓦片:

transformed_mouse.x = mouse.x + view.x; 
transformed_mouse.y = mouse.y + view.y; 

mouse_tile.x = transformed_mouse.x/tile.width; 
mouse_tile.y = transformed_mouse.y/tile.height; 

用於處理拖曳效應凡在活動系統沒有足夠快的更新,跟蹤鼠標是該先前迭代哪裏,使用Bresenham's line algorithm來填充鼠標當前指向的平鋪塊和鼠標先前指向的平鋪塊之間的所有平鋪塊。