# HG changeset patch # User Xeli # Date 1329510873 -3600 # Node ID 58a43c2064ad3612ed80b9e7da37a6cb0a1abd65 # Parent e04da46ee43c8048851e79aa8a5c6aa828954289 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 diff -r e04da46ee43c -r 58a43c2064ad hedgewars/uTouch.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 diff -r e04da46ee43c -r 58a43c2064ad hedgewars/uTypes.pas --- 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}