public Handle(float width, float height, boolean stretch, SpriteBatch batch) { super(width, height, stretch, batch); inner = new ASprite() { Texture tex; { tex = new Texture("handle_inner.png"); originX = 16; originY = 16; this.x = 32; this.y = 32; width = height = 32; tex.setFilter(TextureFilter.Linear, TextureFilter.Linear); } @Override public void draw(SpriteBatch batch, float parentAlpha) { draw(batch, parentAlpha, tex); } @Override public Actor hit(float arg0, float arg1) { return null; } @Override public boolean touchDown(float x, float y, int pointer) { float d = G.dis(x, y, ox, oy); if (d > ox - 16) { x -= ox; y -= oy; float par = (ox - 16) / d; x = x * par; y = y * par; x += ox; y += oy; } if (d >= ((ox - 16) / 2)) { if (x > y) { if (x + y < outer.width) G.hero.keyDown(Input.Keys.DPAD_DOWN); else G.hero.keyDown(Input.Keys.DPAD_RIGHT); } else if (x + y < outer.width) G.hero.keyDown(Input.Keys.DPAD_LEFT); else G.hero.keyDown(Input.Keys.DPAD_UP); } else G.hero.keyUp(Input.Keys.DPAD_LEFT); this.x = x - 16; this.y = y - 16; return true; } @Override public void touchDragged(float x, float y, int pointer) { touchDown(x, y, pointer); } @Override public void touchUp(float x, float y, int pointer) { this.x = ox - 16; this.y = oy - 16; G.hero.keyUp(Input.Keys.DPAD_LEFT); } public TextureRegion getTextureRegion() { return null; } public void setTextureRegion(TextureRegion textureRegion) {} }; outer = new ASprite() { public TextureRegion getTextureRegion() { return null; } public void setTextureRegion(TextureRegion textureRegion) {} Texture tex; { tex = new Texture("handle_outer.png"); originX = 32 * scale; originY = 32 * scale; x = 0; y = 0; width = height = 64 * scale; tex.setFilter(TextureFilter.Linear, TextureFilter.Linear); } @Override public void draw(SpriteBatch batch, float parentAlpha) { draw(batch, parentAlpha, tex); } @Override public Actor hit(float x, float y) { return null; } }; ox = outer.width / 2; oy = outer.height / 2; addActor(outer); addActor(inner); inner.runAction(AForever.$(ARotateBy.$(20, 360))); outer.runAction(AForever.$(ARotateBy.$(20, -360))); }