diff -r 0b0a0f0c2cdc -r b95d10c82f7f hedgewars/uTouch.pas --- a/hedgewars/uTouch.pas Wed Aug 17 12:32:40 2011 +0200 +++ b/hedgewars/uTouch.pas Wed Aug 17 17:14:47 2011 +0200 @@ -4,7 +4,7 @@ interface -uses sysutils, math, uConsole, uVariables, SDLh, uTypes, uFloat, uConsts, GLUnit; +uses sysutils, math, uConsole, uVariables, SDLh, uTypes, uFloat, uConsts, uIO, GLUnit; procedure initModule; @@ -12,10 +12,11 @@ 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; -procedure addFinger(id: SDL_FingerId); +procedure addFinger(x,y: Longword; id: SDL_FingerId); procedure deleteFinger(id: SDL_FingerId); procedure onTouchClick(x,y: Longword; pointerId: SDL_FingerId); +function fingerHasMoved(id: SDL_FingerId): boolean; function calculateDelta(id1, id2: SDL_FingerId): hwFloat; function getSecondPointer(id: SDL_FingerId): SDL_FingerId; implementation @@ -28,15 +29,17 @@ xyCoord : array of LongInt; pointerIds : array of SDL_FingerId; timeSinceDown: array of Longword; - + historicalXY : array of LongInt; //Pinch to zoom pinchSize : hwFloat; baseZoomValue: GLFloat; + invertCursor : boolean; + procedure onTouchDown(x,y: Longword; pointerId: SDL_FingerId); begin WriteToConsole('down'); - addFinger(pointerId); + addFinger(x,y,pointerId); xyCoord[pointerId*2] := convertToCursor(cScreenWidth,x); xyCoord[pointerId*2+1] := convertToCursor(cScreenHeight,y); @@ -60,8 +63,16 @@ case pointerCount of 1: begin - CursorPoint.X := CursorPoint.X - convertToCursor(cScreenWidth,dx); - CursorPoint.Y := CursorPoint.Y + convertToCursor(cScreenWidth,dy); + if invertCursor then + begin + CursorPoint.X := CursorPoint.X - convertToCursor(cScreenWidth,dx); + CursorPoint.Y := CursorPoint.Y + convertToCursor(cScreenWidth,dy); + end + else + begin + CursorPoint.X := CursorPoint.X + convertToCursor(cScreenWidth,dx); + CursorPoint.Y := CursorPoint.Y - convertToCursor(cScreenWidth,dy); + end; end; 2: begin @@ -84,8 +95,17 @@ procedure onTouchClick(x,y: Longword; pointerId: SDL_FingerId); begin - WriteToConsole(Format('clicker %d', [SDL_GetTicks])); - bShowAmmoMenu := not(bShowAmmoMenu); + if bShowAmmoMenu then + begin + doPut(CursorPoint.X, CursorPoint.Y, false); + invertCursor := true; + exit + end; + + + bShowAmmoMenu := true; + invertCursor := false; + //WriteToConsole(Format('%s, %s : %d, %d', [cstr(CurrentHedgehog^.Gear^.X), cstr(CurrentHedgehog^.Gear^.Y), x-WorldDX, y-WorldDY])); end; function convertToCursor(scale: LongInt; xy: LongInt): LongInt; @@ -93,7 +113,7 @@ convertToCursor := round(xy/32768*scale) end; -procedure addFinger(id: SDL_FingerId); +procedure addFinger(x,y: Longword; id: SDL_FingerId); var index, tmp: Longword; begin @@ -101,9 +121,12 @@ //Check array sizes if length(pointerIds) < pointerCount then setLength(pointerIds, length(pointerIds)*2); - if length(xyCoord) < pointerCount*2+1 then setLength(xyCoord, length(xyCoord)*2); + if length(xyCoord) < id*2+1 then + begin + setLength(xyCoord, id*2+1); + setLength(historicalXY, id*2+1); + end; if length(timeSinceDown) < id then setLength(timeSinceDown, id); - for index := 0 to pointerCount do //place the pointer ids as far back to the left as possible begin if pointerIds[index] = -1 then @@ -113,7 +136,9 @@ end; end; //set timestamp - timeSinceDown[id] := SDL_GetTicks + timeSinceDown[id] := SDL_GetTicks; + historicalXY[id*2] := convertToCursor(cScreenWidth,x); + historicalXY[id*2+1] := convertToCursor(cScreenHeight,y); end; procedure deleteFinger(id: SDL_FingerId); @@ -138,7 +163,14 @@ break; end; end; - if (SDL_GetTicks - timeSinceDown[id]) < clickTime then onTouchClick(xyCoord[id*2], xyCoord[id*2+1], id); + if ((SDL_GetTicks - timeSinceDown[id]) < clickTime) AND not(fingerHasMoved(id)) then onTouchClick(xyCoord[id*2], xyCoord[id*2+1], id); +end; + +//Method to calculate the distance this finger has moved since the downEvent +function fingerHasMoved(id: SDL_FingerId): boolean; +begin +// fingerHasMoved := hwAbs(DistanceI(xyCoord[id*2]-historicalXY[id*2], xyCoord[id*2+1]-historicalXY[id*2+1])) > int2hwFloat(2000); // is 1% movement + fingerHasMoved := trunc(sqrt(Power(xyCoord[id*2]-historicalXY[id*2],2) + Power(xyCoord[id*2+1]-historicalXY[id*2+1], 2))) > 330; end; function calculateDelta(id1, id2: SDL_FingerId): hwFloat; @@ -161,7 +193,8 @@ begin setLength(xyCoord, 10); setLength(pointerIds, 5); - setLength(timeSinceDown, 5); + setLength(timeSinceDown, 5); + setLength(historicalXY, 10); for index := Low(xyCoord) to High(xyCoord) do xyCoord[index] := -1; for index := Low(pointerIds) to High(pointerIds) do pointerIds[index] := -1;