diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTPad.java b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTPad.java index 49de1d0..cb3a0b9 100644 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTPad.java +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTPad.java @@ -4,18 +4,18 @@ import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; -import android.support.v7.widget.AppCompatButton; +import android.graphics.Point; import android.util.AttributeSet; import android.view.MotionEvent; -import android.view.View; import org.ntlab.radishforandroidstudio.framework.event.PadEvent; import org.ntlab.radishforandroidstudio.framework.listener.PadListener; import org.ntlab.radishforandroidstudio.framework.listener.SamplePadListener; import org.ntlab.radishforandroidstudio.framework.subject.PadSubject; -public class RWTPad extends View { +public class RWTPad extends RWTView { private MotionEvent touchInfo = null; + private Point circlePos = null; public RWTPad(Context context) { super(context); @@ -32,16 +32,24 @@ init(); } + @Override public void init() { + super.init(); // Listenerサンプル addListener(new SamplePadListener()); } @Override public void onDraw(Canvas canvas) { - super.onDraw(canvas); + // super.onDraw(canvas); Paint paint = this.createRedPaint(); - canvas.drawCircle(150, 150, 100, paint); + canvas.drawCircle(getSize().x / 2, getSize().x / 2, getSize().x / 2, paint); + + paint.setColor(Color.BLUE); + if (circlePos == null) { + circlePos = new Point(getSize().x / 2, getSize().y / 2); + } + canvas.drawCircle(circlePos.x, circlePos.y, getSize().x / 6, paint); } private Paint createRedPaint() { @@ -55,10 +63,33 @@ @Override public boolean onTouchEvent(MotionEvent event) { + // 中央からの距離を取得 + float dx = event.getX() - getSize().x / 2; + float dy = event.getY() - getSize().y / 2; + float rawLen = (float)Math.sqrt(dx*dx + dy*dy); + float angle = (float)Math.atan2(dy, dx); + float maxLen = getSize().x / 2; + float len = rawLen / maxLen; + float fixLen = Math.max(Math.min(1.f, len), -1.f); + + circlePos.x = (int)event.getX(); + circlePos.y = (int)event.getY(); + + if (len > 1) { + circlePos.x = (int)(fixLen * Math.cos(angle) * maxLen + maxLen); + circlePos.y = (int)(fixLen * Math.sin(angle) * maxLen + maxLen); + } + touchInfo = event; - PadEvent padEvent = new PadEvent(event, 1.0f); + PadEvent padEvent = new PadEvent(event, fixLen, angle); PadSubject.getInstance().pushListeners(padEvent); - System.out.println("Touch x:"); + + if (event.getAction() == MotionEvent.ACTION_UP) { + circlePos.x = getSize().x / 2; + circlePos.y = getSize().y / 2; + } + + invalidate(); return true; } diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTView.java b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTView.java new file mode 100644 index 0000000..f3b00d1 --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTView.java @@ -0,0 +1,65 @@ +package org.ntlab.radishforandroidstudio.framework.RWT; + +import android.content.Context; +import android.graphics.Point; +import android.support.annotation.Nullable; +import android.util.AttributeSet; +import android.view.View; + +public abstract class RWTView extends View { + private float dp = 1; + private Point size = null; + private Point pos = null; + + public RWTView(Context context) { + super(context); + init(); + } + + public RWTView(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + init(); + } + + public RWTView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + init(); + } + + public void init() { + dp = getResources().getDisplayMetrics().density; + } + + /** + * 画面上に表示されるサイズを取得 + * @return Point + */ + public Point getSize() { + if (size == null) { + size = new Point(getWidth(), getHeight()); + } + return size; + } + + /** + * 画面上に表示される左上の座標を取得 + * @return Point + */ + public Point getPosition() { + if (pos == null) { + pos = new Point(getLeft(), getTop()); + } + return pos; + } + + /** + * DPを乗算する + * @param a + * @return int + */ + public int applyDp(int a) { + return (int)(a * dp); + } + + +} diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/event/PadEvent.java b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/event/PadEvent.java index 3cfa8fc..8e5d25e 100644 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/event/PadEvent.java +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/event/PadEvent.java @@ -4,14 +4,30 @@ public class PadEvent extends MyEvent{ private MotionEvent e; - private float dummy; - public PadEvent(MotionEvent e, float f) { + /** + * パッドを倒した距離 + * 範囲は 0<=length<=1 + */ + private float length; + + /** + * パッドを倒した方向 + * 単位radian + */ + private float angle; + + public PadEvent(MotionEvent e, float length, float angle) { super(e); - dummy = f; + this.length = length; + this.angle = angle; } - public final float getDummy() { - return dummy; + public final float getLength() { + return length; + } + + public final float getAngle() { + return angle; } } diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/listener/SamplePadListener.java b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/listener/SamplePadListener.java index 0ddce68..c7d4751 100644 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/listener/SamplePadListener.java +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/listener/SamplePadListener.java @@ -5,7 +5,7 @@ public class SamplePadListener implements PadListener { @Override public boolean onEvent(PadEvent event) { - System.out.println("PadListener Sample value:" + event.getDummy()); + System.out.println("PadListener Length:" + event.getLength() + " angle:" + event.getAngle()); return false; } } diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/spriteTest/TestActivity.java b/app/src/main/java/org/ntlab/radishforandroidstudio/spriteTest/TestActivity.java index 123d675..5d943a9 100644 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/spriteTest/TestActivity.java +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/spriteTest/TestActivity.java @@ -8,7 +8,9 @@ import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; +import android.widget.FrameLayout; import android.widget.LinearLayout; +import android.widget.RelativeLayout; import org.ntlab.radishforandroidstudio.R; import org.ntlab.radishforandroidstudio.framework.RWT.RWTSprite; @@ -106,7 +108,7 @@ camera.addTarget(diceObj); // 画面との関連付け - LinearLayout l = findViewById(R.id.game_layout); + FrameLayout l = findViewById(R.id.game_layout); view = new RWTSurfaceView(this); view.attachCamera(camera); l.addView(view, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT)); diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 54cf3d2..77628c5 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -6,30 +6,23 @@ android:layout_height="match_parent" tools:context=".cactusClient.MainActivity"> - - + - + android:layout_height="match_parent"> - + \ No newline at end of file