# HG changeset patch # User Xeli # Date 1328453715 -3600 # Node ID 2d8c5815292f1dd64efaba79b72c26815ba814e1 # Parent e049b5bb0ad18a1100e1e7520a11ce23e071e389 some refactoring + you can now tap on the ammo menu to select a weapon diff -r e049b5bb0ad1 -r 2d8c5815292f hedgewars/uTouch.pas --- a/hedgewars/uTouch.pas Sun Feb 05 15:52:26 2012 +0100 +++ b/hedgewars/uTouch.pas Sun Feb 05 15:55:15 2012 +0100 @@ -33,6 +33,7 @@ Touch_Finger = record id : SDL_FingerId; x,y : LongInt; + dx,dy : LongInt; historicalX, historicalY : LongInt; timeSinceDown : Longword; end; @@ -43,8 +44,12 @@ procedure onTouchDown(x,y: Longword; pointerId: SDL_FingerId); procedure onTouchMotion(x,y: Longword; dx,dy: LongInt; pointerId: SDL_FingerId); procedure onTouchUp(x,y: Longword; pointerId: SDL_FingerId); -function convertToCursor(scale: LongInt; xy: LongInt): LongInt; +function convertToCursorX(x: LongInt): LongInt; +function convertToCursorY(y: LongInt): LongInt; +function convertToCursorDeltaX(x: LongInt): LongInt; +function convertToCursorDeltaY(y: LongInt): LongInt; function addFinger(x,y: Longword; id: SDL_FingerId): PTouch_Finger; +function updateFinger(x,y,dx,dy: Longword; id: SDL_FingerId): PTouch_Finger; procedure deleteFinger(id: SDL_FingerId); procedure onTouchClick(finger: Touch_Finger); procedure onTouchDoubleClick(finger: Touch_Finger); @@ -125,7 +130,7 @@ ParseCommand('+attack', true); exit; end; - if (finger^.x < leftButtonBoundary) and (finger^.y < 390) then +{ if (finger^.x < leftButtonBoundary) and (finger^.y < 390) then begin ParseCommand('+left', true); walkingLeft := true; @@ -142,7 +147,7 @@ ParseCommand('hjump', true); exit; end; - moveCursor:= true; + } moveCursor:= true; end; 2: begin @@ -159,36 +164,24 @@ var finger, secondFinger: PTouch_Finger; currentPinchDelta, zoom : hwFloat; - tmpX, tmpY: LongInt; begin -x := x; -y := y; -dx := dx; -dy := dy; -finger:= findFinger(pointerId); -tmpX := convertToCursor(cScreenWidth, x); -tmpY := convertToCursor(cScreenHeight, y); +finger:= updateFinger(x,y,dx,dy,pointerId); if moveCursor then begin if invertCursor then begin - CursorPoint.X := CursorPoint.X + (finger^.x - tmpX); - CursorPoint.Y := CursorPoint.Y - (finger^.y - tmpY); + CursorPoint.X := CursorPoint.X - finger^.dx; + CursorPoint.Y := CursorPoint.Y + finger^.dy; end else begin - CursorPoint.X := CursorPoint.X - (finger^.x - tmpX); - CursorPoint.Y := CursorPoint.Y + (finger^.y - tmpY); + CursorPoint.X := CursorPoint.X + finger^.dx; + CursorPoint.Y := CursorPoint.Y - finger^.dy; end; - finger^.x := tmpX; - finger^.y := tmpY; exit //todo change into switch rather than ugly ifs end; - finger^.x := tmpX; - finger^.y := tmpY; - if aiming then begin aim(finger^); @@ -208,11 +201,18 @@ end; procedure onTouchUp(x,y: Longword; pointerId: SDL_FingerId); +var + finger: PTouch_Finger; begin x := x; y := y; aiming:= false; stopFiring:= true; +finger:= updateFinger(x,y,0,0,pointerId); +//Check for onTouchClick event +if ((SDL_GetTicks - finger^.timeSinceDown) < clickTime) AND not(fingerHasMoved(finger^)) then + onTouchClick(finger^); + deleteFinger(pointerId); if walkingLeft then @@ -239,31 +239,33 @@ if (SDL_GetTicks - timeSinceClick < 300) and (DistanceI(finger.X-xTouchClick, finger.Y-yTouchClick) < _30) then begin onTouchDoubleClick(finger); + timeSinceClick:= -1; exit; - end -else - begin - xTouchClick := finger.x; - yTouchClick := finger.y; - timeSinceClick := SDL_GetTicks; end; - if bShowAmmoMenu then +xTouchClick:= finger.x; +yTouchClick:= finger.y; +timeSinceClick:= SDL_GetTicks; + +if bShowAmmoMenu then begin - doPut(CursorPoint.X, CursorPoint.Y, false); - exit + CursorPoint.X:= finger.x; + CursorPoint.Y:= finger.y; + doPut(CursorPoint.X, CursorPoint.Y, false); + WriteToConsole(Format('%d %d', [CursorPoint.X, CursorPoint.Y])); + exit end; - if isOnCurrentHog(finger) then +if isOnCurrentHog(finger) then begin - bShowAmmoMenu := true; - exit; + bShowAmmoMenu := true; + exit; end; - if finger.y < topButtonBoundary then +if finger.y < topButtonBoundary then begin - ParseCommand('hjump', true); - exit; + ParseCommand('hjump', true); + exit; end; end; @@ -280,8 +282,8 @@ end; - xCursor := convertToCursor(cScreenWidth, x); - yCursor := convertToCursor(cScreenHeight, y); + xCursor := convertToCursorX(x); + yCursor := convertToCursorY(y); //on removing fingers, all fingers are moved to the left //with dynamic arrays being zero based, the new position of the finger is the old pointerCount @@ -290,12 +292,24 @@ fingers[pointerCount].historicalY := yCursor; fingers[pointerCount].x := xCursor; fingers[pointerCount].y := yCursor; + fingers[pointerCount].dx := 0; + fingers[pointerCount].dy := 0; fingers[pointerCount].timeSinceDown:= SDL_GetTicks; addFinger:= @fingers[pointerCount]; inc(pointerCount); end; +function updateFinger(x,y,dx,dy: Longword; id: SDL_FingerId): PTouch_Finger; +begin + updateFinger:= findFinger(id); + + updateFinger^.x:= convertToCursorX(x); + updateFinger^.y:= convertToCursorY(y); + updateFinger^.dx:= convertToCursorDeltaX(dx); + updateFinger^.dy:= convertToCursorDeltaY(dy); +end; + procedure deleteFinger(id: SDL_FingerId); var index : Longword; @@ -306,9 +320,6 @@ begin if fingers[index].id = id then begin - //Check for onTouchClick event - if ((SDL_GetTicks - fingers[index].timeSinceDown) < clickTime) AND not(fingerHasMoved(fingers[index])) then - onTouchClick(fingers[index]); //put the last finger into the spot of the finger to be removed, //so that all fingers are packed to the far left @@ -424,9 +435,28 @@ end; //if CurrentHedgehog^.Gear <> nil end; -function convertToCursor(scale: LongInt; xy: LongInt): LongInt; +//These 4 convertToCursor functions convert xy coords from the SDL coordinate system to our CursorPoint coor system +// the SDL coordinate system goes from 0 to 32768 on the x axis and 0 to 32768 on the y axis, (0,0) being top left. +// the CursorPoint coordinate system goes from -cScreenWidth/2 to cScreenWidth/2 on the x axis +// and 0 to cScreenHeight on the x axis, (-cScreenWidth, cScreenHeight) being top left, +function convertToCursorX(x: LongInt): LongInt; +begin + convertToCursorX := round((x/32768)*cScreenWidth) - (cScreenWidth shr 1); +end; + +function convertToCursorY(y: LongInt): LongInt; begin - convertToCursor := round(xy/32768*scale) + convertToCursorY := cScreenHeight - round((y/32768)*cScreenHeight) +end; + +function convertToCursorDeltaX(x: LongInt): LongInt; +begin + convertToCursorDeltaX := round(x/32768*cScreenWidth) +end; + +function convertToCursorDeltaY(y: LongInt): LongInt; +begin + convertToCursorDeltaY := round(y/32768*cScreenHeight) end; function isOnFireButton(finger: Touch_Finger): boolean; @@ -450,14 +480,16 @@ begin x := _0; y := _0; - convertToFingerCoord(x, y, CurrentHedgehog^.Gear^.X, CurrentHedgehog^.Gear^.Y); + convertToFingerCoord(x,y, CurrentHedgehog^.Gear^.X, CurrentHedgehog^.Gear^.Y); + WriteToConsole(Format('%d %s %d %s', [finger.x, cstr(x), finger.y, cstr(y) ])); + isOnCurrentHog := Distance(int2hwFloat(finger.X)-x, int2hwFloat(finger.Y)-y) < _50; end; procedure convertToFingerCoord(var x,y : hwFloat; oldX, oldY: hwFloat); begin - x := oldX + int2hwFloat(WorldDx + (cScreenWidth div 2)); - y := oldY + int2hwFloat(WorldDy); + x := oldX + int2hwFloat(WorldDx); + y := int2hwFloat(cScreenHeight) - (oldY + int2hwFloat(WorldDy)); end; procedure convertToWorldCoord(var x,y: hwFloat; finger: Touch_Finger);