Blame |
Last modification |
View Log
| RSS feed
package com.gebauz.bauzoid.input;
import com.badlogic.gdx.Gdx;
import com.gebauz.bauzoid.game.Game;
import com.gebauz.bauzoid.game.GameObject;
public class Input extends GameObject
{
public static final int NUM_FINGERS = 10;
protected int mPhysicalW = 800;
protected int mPhysicalH = 480;
protected float mVirtualW = 800;
protected float mVirtualH = 800;
protected float mRealToVirtualScaleW = 1.0f;
protected float mRealToVirtualScaleH = 1.0f;
public class Finger
{
private int mIndex = -1;
private boolean mIsTouched = false;
private boolean mIsTouchedLastFrame = false;
private boolean mIsJustTouched = false;
private boolean mIsJustReleased = false;
private float x = 0.0f;
private float y = 0.0f;
public Finger(int index)
{
mIndex = index;
}
public void update(float deltaTime)
{
//mIsTouched = Gdx.input.isTouched(mIndex);
mIsTouched = Input.this.isTouched(mIndex);
if (mIsTouched)
{
x = Input.this.getX(mIndex);
y = Input.this.getY(mIndex);
}
mIsJustTouched = (mIsTouched && !mIsTouchedLastFrame);
mIsJustReleased = (!mIsTouched && mIsTouchedLastFrame);
mIsTouchedLastFrame = mIsTouched;
}
public final int getIndex()
{
return mIndex;
}
public boolean isTouched()
{
return mIsTouched;
}
public boolean isJustTouched()
{
return mIsJustTouched;
}
public boolean isJustReleased()
{
return mIsJustReleased;
}
public float getVirtualX()
{
return physicalToVirtualX(x);
}
public float getVirtualY()
{
return physicalToVirtualY(y);
}
public boolean isInsideVirtual(float x1, float y1, float x2, float y2)
{
float x = getVirtualX();
float y = getVirtualY();
if ((x >= x1) && (x <= x2) &&
(y >= y1) && (y <= y2))
{
return true;
}
return false;
}
}
protected Finger[] mFingers = new Finger[NUM_FINGERS];
public Input(Game game)
{
super(game);
for (int i = 0; i < NUM_FINGERS; i++)
{
mFingers[i] = new Finger(i);
}
}
public void init()
{
setVirtualSize(800, 480);
}
public void exit()
{
}
public void update(float deltaTime)
{
for (int i = 0; i < NUM_FINGERS; i++)
{
mFingers[i].update(deltaTime);
}
}
public void render()
{
}
public void onPause()
{
}
public void onResume()
{
}
public void updateSurfaceDimensions(int w, int h)
{
setVirtualSize(mVirtualW, mVirtualH);
}
public Finger getFinger(int index)
{
return mFingers[index];
}
public Finger getFingerInsideVirtual(float x1, float y1, float x2, float y2)
{
int i = getIdInsideVirtual(x1, y1, x2, y2);
if (i != -1)
return getFinger(i);
return null;
}
public Finger getJustReleasedFingerInsideVirtual(float x1, float y1, float x2, float y2)
{
for (int i = 0; i < NUM_FINGERS; i++)
{
Finger finger = mFingers[i];
if (finger.isJustReleased() && finger.isInsideVirtual(x1, y1, x2, y2))
{
return finger;
}
}
return null;
}
/** Get the pointer id of a touch point inside the rectangle spanned from (x1, y1) to (x2, y2) in virtual coordinates. */
public int getIdInsideVirtual(float x1, float y1, float x2, float y2)
{
for (int i = 0; i < NUM_FINGERS; i++)
{
if (isInsideVirtual(i, x1, y1, x2, y2))
return i;
}
return -1;
}
/** Check if the pointer is inside the rectangle spanned from (x1, y1) to (x2, y2) in virtual coordinates. */
public boolean isInsideVirtual(int id, float x1, float y1, float x2, float y2)
{
//if (Gdx.input.isTouched(id))
if (isTouched(id))
{
int x = getVirtualX(id);
int y = getVirtualY(id);
if ((x >= x1) && (x <= x2) &&
(y >= y1) && (y <= y2))
{
return true;
}
}
return false;
}
/** Get the X coordinate of a touch point in virtual coordinates. */
public int getVirtualX(int i)
{
//int x = Gdx.input.getX(i);
int x = getX(i);
return (int)physicalToVirtualX(x);
}
/** Get the Y coordinate of a touch point in virtual coordinates. */
public int getVirtualY(int i)
{
//int y = Gdx.input.getY(i);
int y = getY(i);
return (int)physicalToVirtualY(y);
}
/** Set the virtual coordinate width/height. */
public void setVirtualSize(float w, float h)
{
mPhysicalW = Gdx.graphics.getWidth();
mPhysicalH = Gdx.graphics.getHeight();
mVirtualW = w;
mVirtualH = h;
mRealToVirtualScaleW = (float)mPhysicalW / (float)mVirtualW;
mRealToVirtualScaleH = (float)mPhysicalH / (float)mVirtualH;
}
/** Convert a horizontal physical coordinate to virtual. */
public float physicalToVirtualX(float x)
{
return (x / (float)mRealToVirtualScaleW);
}
/** Convert a vertical physical coordinate to virtual. */
public float physicalToVirtualY(float y)
{
return (y / (float)mRealToVirtualScaleH);
}
/** Convert a horizontal virtual coordinate to physical. */
public float virtualToPhysicalX(float x)
{
return (x * (float)mRealToVirtualScaleW);
}
/** Convert a vertical virtual coordinate to physical. */
public float virtualToPhysicalY(float y)
{
return (y * (float)mRealToVirtualScaleH);
}
public int getX(int index)
{
return Gdx.input.getX(index);
}
public int getY(int index)
{
return Gdx.input.getY(index);
}
public boolean isTouched(int index)
{
return Gdx.input.isTouched(index);
}
}