我在建設SDL2申請macOS使用C++。我需要一些「基本」滾動的應用程序(如網頁瀏覽器)。我通過使用SDL_MouseWheel事件來實現這個功能,該功能爲我提供了一個功能齊全的「類似於窗口」的滾動功能。我使用的是MacBook Pro和我想帶觸控板的功能。Smooth(Inertial)使用SDL2滾動?
簡單地說,我要求一個更好的滾動算法(MacBook的觸控板滾動,慣性滾動)
我瞭解SDL_MultiGesture事件,但我真的不知道如何把事情放在一起來實現我想要的結果。
我在建設SDL2申請macOS使用C++。我需要一些「基本」滾動的應用程序(如網頁瀏覽器)。我通過使用SDL_MouseWheel事件來實現這個功能,該功能爲我提供了一個功能齊全的「類似於窗口」的滾動功能。我使用的是MacBook Pro和我想帶觸控板的功能。Smooth(Inertial)使用SDL2滾動?
簡單地說,我要求一個更好的滾動算法(MacBook的觸控板滾動,慣性滾動)
我瞭解SDL_MultiGesture事件,但我真的不知道如何把事情放在一起來實現我想要的結果。
好的,這是問題的答案。首先,你將不得不手動完成它。 我也假設你知道SDL2和C++。
*注意:我只在Y軸上滾動(如果你願意的話,你可以這樣做)。
首先,我們需要一些變量:
int scrolling; // flag (scrolling or not)
int scroll_sensitivity = 40; // how fast we want to scroll
double scroll_Y = 0; // current scrolling amount (on Y-Axis)
double scroll_acceleration; // scrolling speed
double scroll_friction = 0.001; // how fast we decelerate
double scroll_prev_pos; // previous event's position
之後,你將需要處理的SDL_MultiGesture事件:
case SDL_MULTIGESTURE:{
if(event.mgesture.numFingers == 2){
if(scrolling == 0){
scrolling = 1;
scroll_prev_pos = event.mgesture.y;
} else{
double dy = event.mgesture.y - scroll_prev_pos;
scroll_acceleration = dy * 40;
scroll_prev_pos = event.mgesture.y;
scrolling = 1;
}
}
break;
}
而且,我們需要停止滾動的SDL_FingerDown事件:
case SDL_FINGERDOWN:{
scrolling = 0;
break;
}
接下來,我們要更新scroll_Y(把它放在你的「更新」函數中):
if(scrolling){
if(scroll_acceleration > 0) scroll_acceleration -= scroll_friction;
if(scroll_acceleration < 0) scroll_acceleration += scroll_friction;
if(abs(scroll_acceleration) < 0.0005) scroll_acceleration = 0;
scroll_Y += scroll_sensitivity * scroll_acceleration;
// Here you have to set your scrolling bounds i.e. if(scroll_Y < 0) scroll_Y = 0;
}
最後,我們要根據我們的滾動值呈現:
SDL_Rect rect = {some_x, some_y + scroll_Y, some_w, some_h};
SDL_RenderCopy(renderer, some_texture, NULL, &rect);
這就是它!
我有一個完全可行的應用程序與上面的代碼,所以我100%肯定這是按預期工作。如果你有任何問題(因爲它不是真正的代碼,它更像是一個算法)與我聯繫。正如我之前提到的,我假定您已經知道SDL和C++已經夠好了,所以我相信您能夠理解實現。 此外,我知道這個解決方案可以變得更好,所以如果你有任何添加/改變,只要說出來!
祝您有個美好的一天!
我遇到了同樣的問題,事實證明SDL opts out of momentum scroll events通過關閉用戶默認系統中的AppleMomentumScrollSupported
默認值。
您可以在您的應用程序中使用Objective-C++的以下位置重新打開它,並且您的SDL_MouseWheel
事件將變得平滑。
NSDictionary *appDefaults = [[NSDictionary alloc] initWithObjectsAndKeys:
[NSNumber numberWithBool:YES], @"AppleMomentumScrollSupported",
nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:appDefaults];
[appDefaults release];
問題似乎有點模糊和範圍廣泛。你可以縮小它的範圍,也許舉一個你現在有什麼樣的例子,並解釋你想如何改變行爲? – paddy
我想實現使用SDL2的慣性滾動(可能與SDL_MultiGesture),我想要一些幫助或例子。 –