hedgewars/uTouch.pas
branchqmlfrontend
changeset 11828 a69124eb7ce7
parent 11821 d8844d4c67de
child 13642 3d14950641a4
equal deleted inserted replaced
11827:8c71c5a1172f 11828:a69124eb7ce7
    20 
    20 
    21 unit uTouch;
    21 unit uTouch;
    22 
    22 
    23 interface
    23 interface
    24 
    24 
    25 uses SysUtils, uConsole, uVariables, SDLh, uFloat, uConsts, uCommands, GLUnit, uTypes, uCaptions, uAmmos, uWorld;
    25 uses SysUtils, uUtils, uConsole, uVariables, SDLh, uFloat, uConsts, uCommands, GLUnit, uTypes, uCaptions, uAmmos, uWorld;
    26 
    26 
    27 
    27 
    28 procedure initModule;
    28 procedure initModule;
    29 procedure freeModule;
    29 procedure freeModule;
    30 
    30 
   356 
   356 
   357 function addFinger(x,y: Longword; id: TSDL_FingerId): PTouch_Data;
   357 function addFinger(x,y: Longword; id: TSDL_FingerId): PTouch_Data;
   358 var
   358 var
   359     xCursor, yCursor, index : LongInt;
   359     xCursor, yCursor, index : LongInt;
   360 begin
   360 begin
   361     //Check array sizes
   361 // check array size
   362     if length(fingers) < pointerCount then
   362 // note: pointerCount will be incremented later,
   363     begin
   363 // so at this point it's the index of the new entry
   364         setLength(fingers, length(fingers)*2);
   364 if Length(fingers) <= pointerCount then
   365         for index := length(fingers) div 2 to length(fingers) do
   365     begin
   366             fingers[index].id := nilFingerId;
   366     setLength(fingers, Length(fingers)*2);
   367     end;
   367     for index := Length(fingers) div 2 to (Length(fingers)-1) do
   368 
   368         fingers[index].id := nilFingerId;
   369     xCursor := convertToCursorX(x);
   369     end;
   370     yCursor := convertToCursorY(y);
   370 
   371 
   371 xCursor := convertToCursorX(x);
   372     //on removing fingers, all fingers are moved to the left
   372 yCursor := convertToCursorY(y);
   373     //with dynamic arrays being zero based, the new position of the finger is the old pointerCount
   373 
   374     fingers[pointerCount].id := id;
   374 //on removing fingers, all fingers are moved to the left
   375     fingers[pointerCount].historicalX := xCursor;
   375 //with dynamic arrays being zero based, the new position of the finger is the old pointerCount
   376     fingers[pointerCount].historicalY := yCursor;
   376 fingers[pointerCount].id := id;
   377     fingers[pointerCount].x := xCursor;
   377 fingers[pointerCount].historicalX := xCursor;
   378     fingers[pointerCount].y := yCursor;
   378 fingers[pointerCount].historicalY := yCursor;
   379     fingers[pointerCount].dx := 0;
   379 fingers[pointerCount].x := xCursor;
   380     fingers[pointerCount].dy := 0;
   380 fingers[pointerCount].y := yCursor;
   381     fingers[pointerCount].timeSinceDown:= RealTicks;
   381 fingers[pointerCount].dx := 0;
   382     fingers[pointerCount].pressedWidget:= nil;
   382 fingers[pointerCount].dy := 0;
   383 
   383 fingers[pointerCount].timeSinceDown:= RealTicks;
   384     addFinger:= @fingers[pointerCount];
   384 fingers[pointerCount].pressedWidget:= nil;
   385     inc(pointerCount);
   385 
       
   386 addFinger:= @fingers[pointerCount];
       
   387 inc(pointerCount);
   386 end;
   388 end;
   387 
   389 
   388 function updateFinger(x, y, dx, dy: Longword; id: TSDL_FingerId): PTouch_Data;
   390 function updateFinger(x, y, dx, dy: Longword; id: TSDL_FingerId): PTouch_Data;
   389 var finger : PTouch_Data;
   391 var finger : PTouch_Data;
   390 begin
   392 begin
   391     finger:= findFinger(id);
   393 finger:= findFinger(id);
   392 
   394 
   393     if finger <> nil then
   395 if finger <> nil then
   394         begin
   396     begin
   395         finger^.x:= convertToCursorX(x);
   397     finger^.x:= convertToCursorX(x);
   396         finger^.y:= convertToCursorY(y);
   398     finger^.y:= convertToCursorY(y);
   397         finger^.dx:= dx;
   399     finger^.dx:= dx;
   398         finger^.dy:= dy;
   400     finger^.dy:= dy;
   399         end
   401     end
   400     else
   402 else
   401         WriteLnToConsole('finger ' + inttostr(id) + ' not found');
   403     WriteLnToConsole('finger ' + inttostr(id) + ' not found');
   402     updateFinger:= finger
   404 updateFinger:= finger
   403 end;
   405 end;
   404 
   406 
   405 procedure deleteFinger(id: TSDL_FingerId);
   407 procedure deleteFinger(id: TSDL_FingerId);
   406 var
   408 var
   407     index : Longword;
   409     index : Longword;
   408 begin
   410 begin
   409 
   411 
   410     dec(pointerCount);
   412 dec(pointerCount);
   411     for index := 0 to pointerCount do
   413 for index := 0 to pointerCount do
   412     begin
   414     begin
   413         if fingers[index].id = id then
   415     if fingers[index].id = id then
   414         begin
   416         begin
   415 
   417         //put the last finger into the spot of the finger to be removed,
   416             //put the last finger into the spot of the finger to be removed,
   418         //so that all fingers are packed to the far left
   417             //so that all fingers are packed to the far left
   419         if pointerCount <> index then
   418             if  pointerCount <> index then
   420             begin
   419                 begin
   421             fingers[index].id := fingers[pointerCount].id;
   420                 fingers[index].id := fingers[pointerCount].id;
   422             fingers[index].x := fingers[pointerCount].x;
   421                 fingers[index].x := fingers[pointerCount].x;
   423             fingers[index].y := fingers[pointerCount].y;
   422                 fingers[index].y := fingers[pointerCount].y;
   424             fingers[index].historicalX := fingers[pointerCount].historicalX;
   423                 fingers[index].historicalX := fingers[pointerCount].historicalX;
   425             fingers[index].historicalY := fingers[pointerCount].historicalY;
   424                 fingers[index].historicalY := fingers[pointerCount].historicalY;
   426             fingers[index].timeSinceDown := fingers[pointerCount].timeSinceDown;
   425                 fingers[index].timeSinceDown := fingers[pointerCount].timeSinceDown;
   427             fingers[index].pressedWidget := fingers[pointerCount].pressedWidget;
   426                 fingers[index].pressedWidget := fingers[pointerCount].pressedWidget;
   428 
   427 
   429             fingers[pointerCount].id := nilFingerId;
   428                 fingers[pointerCount].id := 0;
       
   429             end
   430             end
   430         else fingers[index].id := 0;
   431         else
   431             break;
   432             fingers[index].id := nilFingerId;
       
   433         break;
   432         end;
   434         end;
   433     end;
   435     end;
   434 
   436 
   435 end;
   437 end;
   436 
   438 
   511 
   513 
   512 function findFinger(id: TSDL_FingerId): PTouch_Data;
   514 function findFinger(id: TSDL_FingerId): PTouch_Data;
   513 var
   515 var
   514     index: LongWord;
   516     index: LongWord;
   515 begin
   517 begin
   516     for index:= 0 to length(fingers) do
   518     for index:= 0 to (Length(fingers)-1) do
   517         if fingers[index].id = id then
   519         if fingers[index].id = id then
   518             begin
   520             begin
   519             findFinger:= @fingers[index];
   521             findFinger:= @fingers[index];
   520             exit;
   522             exit;
   521             end;
   523             end;
   639 begin
   641 begin
   640     buttonsDown:= 0;
   642     buttonsDown:= 0;
   641     pointerCount:= 0;
   643     pointerCount:= 0;
   642 
   644 
   643     setLength(fingers, 4);
   645     setLength(fingers, 4);
   644     for index := 0 to length(fingers) do
   646     for index := 0 to (Length(fingers)-1) do
   645         fingers[index].id := 0;
   647         fingers[index].id := nilFingerId;
   646 
   648 
   647     rectSize:= baseRectSize;
   649     rectSize:= baseRectSize;
   648     halfRectSize:= baseRectSize shr 1;
   650     halfRectSize:= baseRectSize shr 1;
   649 end;
   651 end;
   650 
   652