(svn r1703) - Fix: Scrolling with the arrow keys is now smooth and it now also scrolls exactly in tile direction if e.g. up and left are pressed

This commit is contained in:
dominik 2005-01-28 09:30:19 +00:00
parent c8d084a85e
commit b4b134e527
2 changed files with 33 additions and 29 deletions

View File

@ -2201,7 +2201,7 @@ static void StatusBarWndProc(Window *w, WindowEvent *e)
}
}
static void ScrollMainViewport(int x, int y)
void ScrollMainViewport(int x, int y)
{
if (_game_mode != GM_MENU) {
Window *w = FindWindowById(WC_MAIN_WINDOW, 0);
@ -2228,6 +2228,33 @@ static WindowDesc _main_status_desc = {
StatusBarWndProc
};
static const int8 scrollamt[16][2] = {
{ 0, 0},
{-2, 0}, // 1:left
{ 0,-2}, // 2:up
{-2,-1}, // 3:left + up
{ 2, 0}, // 4:right
{ 0, 0}, // 5:left + right
{ 2,-1}, // 6:right + up
{ 0,-2}, // 7:left + right + up = up
{ 0 ,2}, // 8:down
{-2 ,1}, // 9:down+left
{ 0, 0}, // 10:impossible
{-2, 0}, // 11:left + up + down = left
{ 2, 1}, // 12:down+right
{ 0, 2}, // 13:left + right + down = down
{ 0,-2}, // 14:left + right + up = up
{ 0, 0}, // 15:impossible
};
void HandleKeyScrolling(void)
{
if (_dirkeys) {
int factor = _shift_pressed ? 50 : 10;
ScrollMainViewport(scrollamt[_dirkeys][0] * factor, scrollamt[_dirkeys][1] * factor);
}
}
extern void DebugProc(int i);
static void MainWindowWndProc(Window *w, WindowEvent *e) {
@ -2272,34 +2299,6 @@ static void MainWindowWndProc(Window *w, WindowEvent *e) {
if (_game_mode == GM_MENU)
break;
// this is a hack, but this needs to be called at a constant interval and i found
// no other window event that was suited for that purpose.
{
static const int8 scrollamt[16][2] = {
{0,0},
{-1,0}, // 1:left
{0,-1}, // 2:up
{-1,-1}, // 3:left + up
{1,0}, // 4:right
{0,0}, // 5:left + right
{1,-1}, // 6:right + up
{0,0}, // 7:impossible
{0,1}, // 8:down
{-1,1}, // 9:down+left
{0,0}, // 10:impossible
{0,0}, // 11:impossible
{1,1}, // 12:down+right
{0,0}, // 13:impossible
{0,0}, // 14:impossible
{0,0}, // 15:impossible
};
if (_dirkeys) {
int factor = _shift_pressed ? 50 : 10;
ScrollMainViewport(scrollamt[_dirkeys][0] * factor, scrollamt[_dirkeys][1] * factor);
}
}
switch(e->keypress.keycode) {
case 'C':
case 'Z': {

5
ttd.c
View File

@ -1112,6 +1112,8 @@ static void DoAutosave(void)
ShowErrorMessage(INVALID_STRING_ID, STR_AUTOSAVE_FAILED, 0, 0);
}
extern void HandleKeyScrolling(void);
void GameLoop(void)
{
int m;
@ -1123,6 +1125,9 @@ void GameLoop(void)
RedrawAutosave();
}
// handle scrolling of the main window
if (_dirkeys) HandleKeyScrolling();
// make a screenshot?
if ((m=_make_screenshot) != 0) {
_make_screenshot = 0;