the onScreenwidgets are multitouch now, frequently (alternating) tapping left and right still causes it to bug though, but you have to try hard to duplicate it, works ok for now
authorXeli
Fri, 17 Feb 2012 21:34:33 +0100
changeset 6701 58a43c2064ad
parent 6700 e04da46ee43c
child 6702 37c56511df0c
the onScreenwidgets are multitouch now, frequently (alternating) tapping left and right still causes it to bug though, but you have to try hard to duplicate it, works ok for now
hedgewars/uTouch.pas
hedgewars/uTypes.pas
--- a/hedgewars/uTouch.pas	Fri Feb 17 18:23:36 2012 +0100
+++ b/hedgewars/uTouch.pas	Fri Feb 17 21:34:33 2012 +0100
@@ -75,10 +75,8 @@
     aiming: boolean;
     aimingUp, aimingDown: boolean; 
     targetAngle: LongInt;
-    stopFiring: boolean;
 
-    //moving
-    stopLeft, stopRight, walkingLeft, walkingRight :  boolean;
+    buttonsDown: Longword;
 
 procedure onTouchDown(x,y: Longword; pointerId: TSDL_FingerId);
 var 
@@ -86,75 +84,86 @@
 begin
 {$IFDEF USE_TOUCH_INTERFACE}
 finger := addFinger(x,y,pointerId);
-case pointerCount of
-        1:
-        begin
-            moveCursor:= false;
-
-            if isOnCrosshair(finger^) then
-            begin
-                aiming:= true;
-                aim(finger^);
-                exit;
-            end;
+if isOnCrosshair(finger^) then
+begin
+    aiming:= true;
+    aim(finger^);
+    exit;
+end;
 
-            if isOnRect(fireButton.active, finger^) then
-            begin
-                stopFiring:= false;
-                spaceKey:= true;
-                exit;
-            end;
-            if isOnRect(arrowLeft.active, finger^) then
-            begin
-                leftKey:= true;
-                walkingLeft := true;
-                exit;
-            end;
-            if isOnRect(arrowRight.active, finger^) then
-            begin
-                rightKey:= true;
-                walkingRight:= true;
-                exit;
-            end;
-            if isOnRect(arrowUp.active, finger^) then
-            begin
-                upKey:= true;
-                aimingUp:= true;
-                exit;
-            end;
-            if isOnRect(arrowDown.active, finger^) then
-            begin
-                downKey:= true;
-                aimingDown:= true;
-                exit;
-            end;
+inc(buttonsDown);//inc buttonsDown, if we don't see a button down we'll dec it
+if isOnRect(fireButton.active, finger^) then
+    begin
+    spaceKey:= true;
+    moveCursor:= false;
+    finger^.pressedWidget:= @fireButton;
+    exit;
+    end;
+if isOnRect(arrowLeft.active, finger^) then
+    begin
+    leftKey:= true;
+    moveCursor:= false;
+    finger^.pressedWidget:= @arrowLeft;
+    exit;
+    end;
+if isOnRect(arrowRight.active, finger^) then
+    begin
+    rightKey:= true;
+    moveCursor:= false;
+    finger^.pressedWidget:= @arrowRight;
+    exit;
+    end;
+if isOnRect(arrowUp.active, finger^) then
+     begin
+     upKey:= true;
+     aimingUp:= true;
+     moveCursor:= false;
+     finger^.pressedWidget:= @arrowUp;
+     exit;
+     end;
+if isOnRect(arrowDown.active, finger^) then
+     begin
+     downKey:= true;
+     aimingDown:= true;
+     moveCursor:= false;
+     finger^.pressedWidget:= @arrowDown;
+     exit;
+     end;
 
-            if isOnRect(backjump.active, finger^) then
-            begin
-                enterKey:= true;
-                exit;
-            end;
-            if isOnRect(forwardjump.active, finger^) then
-            begin
-                backspaceKey:= true;
-                exit;
-            end;
-            if isOnRect(pauseButton.active, finger^) then
-            begin
-                isPaused:= not isPaused;
-                exit;
-            end;
-            moveCursor:= not bShowAmmoMenu;
-        end;
-        2:
+if isOnRect(backjump.active, finger^) then
+     begin
+     enterKey:= true;
+     moveCursor:= false;
+     finger^.pressedWidget:= @backjump;
+     exit;
+     end;
+if isOnRect(forwardjump.active, finger^) then
+     begin
+     backspaceKey:= true;
+     moveCursor:= false;
+     finger^.pressedWidget:= @forwardjump;
+     exit;
+     end;
+if isOnRect(pauseButton.active, finger^) then
+     begin
+     isPaused:= not isPaused;
+     moveCursor:= false;
+     finger^.pressedWidget:= @pauseButton;
+     exit;
+     end;
+
+dec(buttonsDown);//no buttonsDown, undo the inc() above
+if buttonsDown = 0 then
+    begin
+    moveCursor:= true;
+    if pointerCount = 2 then
         begin
-            aiming:= false;
-            stopFiring:= true;
-            moveCursor:= false;
-            pinchSize := calculateDelta(finger^, getSecondFinger(finger^)^);
-            baseZoomValue := ZoomValue
-        end;
-    end;//end case pointerCount of
+        aiming:= false;
+        moveCursor:= false;
+        pinchSize := calculateDelta(finger^, getSecondFinger(finger^)^);
+        baseZoomValue := ZoomValue
+    end;
+end;
 {$ENDIF}
 end;
 
@@ -186,7 +195,7 @@
         exit
     end;
 
-if pointerCount = 2 then
+if (buttonsDown = 0) and (pointerCount = 2) then
     begin
        secondFinger := getSecondFinger(finger^);
        currentPinchDelta := calculateDelta(finger^, secondFinger^) - pinchSize;
@@ -203,40 +212,45 @@
 procedure onTouchUp(x,y: Longword; pointerId: TSDL_FingerId);
 var
     finger: PTouch_Data;
+    widget: POnScreenWidget;
 begin
 x := x;
 y := y;
 aiming:= false;
-stopFiring:= true;
 finger:= updateFinger(x,y,0,0,pointerId);
 //Check for onTouchClick event
 if ((RealTicks - finger^.timeSinceDown) < clickTime) AND not(fingerHasMoved(finger^)) then
     onTouchClick(finger^);
-
-deleteFinger(pointerId);
+WriteToConsole(Format('%d', [buttonsDown]));
 
-if walkingLeft then
-    begin
-    leftKey:= false;
-    walkingLeft := false;
-    end;
-
-if walkingRight then
+widget:= finger^.pressedWidget;
+if (buttonsDown > 0) and (widget <> nil) then
     begin
-    rightKey:= false;
-    walkingRight := false;
-    end;
+    dec(buttonsDown);
+    
+    if widget = @arrowLeft then
+        leftKey:= false;
+    
+    if widget = @arrowRight then
+        rightKey:= false;
+
+    if widget = @arrowUp then
+        upKey:= false;
 
-if aimingUp then
-    begin
-    upKey:= false;
-    aimingUp:= false;
+    if widget = @arrowDown then
+        downKey:= false;
+
+    if widget = @fireButton then
+        spaceKey:= false;
+
+    if widget = @backjump then
+        enterKey:= false;
+
+    if widget = @forwardjump then
+        backspaceKey:= false;
     end;
-if aimingDown then
-    begin
-    downKey:= false;
-    aimingDown:= false;
-    end;
+ 
+deleteFinger(pointerId);
 end;
 
 procedure onTouchDoubleClick(finger: TTouch_Data);
@@ -304,6 +318,7 @@
     fingers[pointerCount].dx := 0;
     fingers[pointerCount].dy := 0;
     fingers[pointerCount].timeSinceDown:= RealTicks;
+    fingers[pointerCount].pressedWidget:= nil;
  
     addFinger:= @fingers[pointerCount];
     inc(pointerCount);
@@ -409,25 +424,6 @@
             aimingDown:= false;
             end;
         end;
-       
-if stopFiring then 
-    begin
-    spaceKey:= false;
-    stopFiring:= false;
-    end;
-
-if stopRight then
-    begin
-    stopRight := false;
-    rightKey:= false;
-    end;
- 
-if stopLeft then
-    begin
-    stopLeft := false;
-    leftKey:= false;
-    end;
-    
 end;
 
 function findFinger(id: TSDL_FingerId): PTouch_Data;
@@ -559,9 +555,7 @@
     index: Longword;
     //uRenderCoordScaleX, uRenderCoordScaleY: Longword;
 begin
-    stopFiring:= false;
-    walkingLeft := false;
-    walkingRight := false;
+    buttonsDown:= 0;
 
     setLength(fingers, 4);
     for index := 0 to High(fingers) do 
--- a/hedgewars/uTypes.pas	Fri Feb 17 18:23:36 2012 +0100
+++ b/hedgewars/uTypes.pas	Fri Feb 17 21:34:33 2012 +0100
@@ -425,20 +425,20 @@
 
     PWidgetMovement = ^TWidgetMovement;
     TWidgetMovement = record
-        animate: Boolean;
-        source: TPoint;
-        target: TPoint;
-        startTime: Longword;
+        animate   : Boolean;
+        source    : TPoint;
+        target    : TPoint;
+        startTime : Longword;
         end;
 
     POnScreenWidget = ^TOnScreenWidget;
     TOnScreenWidget = record
-        show: boolean;                      // if false widget will not be drawn
-        sprite: TSprite;                    // a convenience type
-        frame: TSDL_Rect;                   // graphical coordinates
-        active: TSDL_Rect;                  // active touch region
-        fadeAnimStart: Longword;            // time the fade started, 0 means don't fade
-        moveAnim: TWidgetMovement;          // the animation associated to the widget
+        show          : boolean;                      // if false widget will not be drawn
+        sprite        : TSprite;                    // a convenience type
+        frame         : TSDL_Rect;                   // graphical coordinates
+        active        : TSDL_Rect;                  // active touch region
+        fadeAnimStart : Longword;            // time the fade started, 0 means don't fade
+        moveAnim      : TWidgetMovement;          // the animation associated to the widget
         end;
 
 {$IFDEF SDL13}
@@ -449,6 +449,7 @@
         dx,dy                    : LongInt;
         historicalX, historicalY : LongInt;
         timeSinceDown            : Longword;
+        pressedWidget            : POnScreenWidget;
         end;
 {$ENDIF}