2015-04-01 46 views
0

我正在製作一個遊戲,它將在屏幕上創建隨機圓圈。隨機創建的圓圈將具有紅色或綠色的值。試圖獲取在android中繪製的每個隨機圓的x,y座標

我的問題是,我希望能夠不僅確定用戶何時點擊其中一個圈子,而是確定他們最終點擊了哪個圈子(紅色或綠色)。 我的主要問題是試圖找出將被繪製的圓的x和y。

這裏是我的代碼:

public class DrawingView extends View { 



    public DrawingView(Context context) { 
     super(context); 
     // TODO Auto-generated constructor stub 

    } 
    RectF rectf = new RectF(0, 0, 200, 0); 

    private static final int w = 100; 
    public static int lastColor = Color.BLACK; 
    private final Random random = new Random(); 
    private final Paint paint = new Paint(); 
    private final int radius = 230; 
    private final Handler handler = new Handler(); 
    public static int redColor = Color.RED; 
    public static int greenColor = Color.GREEN; 


    private final Runnable updateCircle = new Runnable() { 
     @Override 
     public void run() { 
      lastColor = random.nextInt(2) == 1 ? redColor : greenColor; 
      paint.setColor(lastColor); 
      invalidate(); 
      handler.postDelayed(this, 1000); 

     } 
    }; 



    @Override 
    protected void onAttachedToWindow() { 
     super.onAttachedToWindow(); 
     handler.post(updateCircle); 
    } 

    @Override 
    protected void onDetachedFromWindow() { 
     super.onDetachedFromWindow(); 
     handler.removeCallbacks(updateCircle); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
     // your other stuff here 
     // code below works when its here 

     float randomWidth =(int) (random.nextInt(Math.abs(getWidth()-radius/2)) + radius/2f); 
     float randomHeight = (random.nextInt((int)Math.abs((getHeight()-radius/2 + radius/2f)))); 
     canvas.drawCircle(randomWidth, randomHeight + radius/2f, radius, paint); 
    } 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
    int x = event.getX(); 
    int y = event.getY(); 
    if(isInsideCircle(x, y)){ 
     //Do your things here 
    } 
    return true; 
} 

private boolean isInsideCircle(int x, int y){ 
    if (((x - randomWidth)^2 + (y - randomHeight)^2) < radius^2) 
    return true; 
    return false;  
} 



} 

下面的代碼不起作用

public class DrawingView extends View { 



    public DrawingView(Context context) { 
     super(context); 
     // TODO Auto-generated constructor stub 

    } 
    RectF rectf = new RectF(0, 0, 200, 0); 

    private static final int w = 100; 
    public static int lastColor = Color.BLACK; 
    private final Random random = new Random(); 
    private final Paint paint = new Paint(); 
    private final int radius = 230; 
    private final Handler handler = new Handler(); 
    public static int redColor = Color.RED; 
    public static int greenColor = Color.GREEN; 
    //its right below here the code compiles perfectly, but gets errors in logcat 
    int randomWidth =(int) (random.nextInt(Math.abs(getWidth()-radius/2)) + radius/2f); 
    int randomHeight = (random.nextInt((int)Math.abs((getHeight()-radius/2 + radius/2f)))); 


    private final Runnable updateCircle = new Runnable() { 
     @Override 
     public void run() { 
      lastColor = random.nextInt(2) == 1 ? redColor : greenColor; 
      paint.setColor(lastColor); 
      invalidate(); 
      handler.postDelayed(this, 1000); 

     } 
    }; 



    @Override 
    protected void onAttachedToWindow() { 
     super.onAttachedToWindow(); 
     handler.post(updateCircle); 
    } 

    @Override 
    protected void onDetachedFromWindow() { 
     super.onDetachedFromWindow(); 
     handler.removeCallbacks(updateCircle); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
     // your other stuff here 
     canvas.drawCircle(randomWidth, randomHeight + radius/2f, radius, paint); 
    } 

    public boolean onTouch(View v, MotionEvent event) { 
    int x = (int) event.getX(); 
    int y = (int) event.getY(); 
    if(isInsideCircle(x, y)){ 
     //Do your things here 
    } 
    return true; 
} 

private boolean isInsideCircle(int x, int y){ 
    if (((x - randomWidth)^2 + (y - randomHeight)^2) < radius^2) 
    return true; 
    return false;  
} 



} 

這裏是logcat的

04-01 03:41:48.856: E/AndroidRuntime(4010): FATAL EXCEPTION: main 
04-01 03:41:48.856: E/AndroidRuntime(4010): Process: com.Tripps.thesimplegame, PID: 4010 
04-01 03:41:48.856: E/AndroidRuntime(4010): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.Tripps.thesimplegame/com.Tripps.thesimplegame.Main}: java.lang.IllegalArgumentException: n <= 0: 0 
04-01 03:41:48.856: E/AndroidRuntime(4010):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298) 
04-01 03:41:48.856: E/AndroidRuntime(4010):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) 
04-01 03:41:48.856: E/AndroidRuntime(4010):  at android.app.ActivityThread.access$800(ActivityThread.java:144) 
04-01 03:41:48.856: E/AndroidRuntime(4010):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) 
04-01 03:41:48.856: E/AndroidRuntime(4010):  at android.os.Handler.dispatchMessage(Handler.java:102) 
04-01 03:41:48.856: E/AndroidRuntime(4010):  at android.os.Looper.loop(Looper.java:135) 
04-01 03:41:48.856: E/AndroidRuntime(4010):  at android.app.ActivityThread.main(ActivityThread.java:5221) 
04-01 03:41:48.856: E/AndroidRuntime(4010):  at java.lang.reflect.Method.invoke(Native Method) 
04-01 03:41:48.856: E/AndroidRuntime(4010):  at java.lang.reflect.Method.invoke(Method.java:372) 
04-01 03:41:48.856: E/AndroidRuntime(4010):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
04-01 03:41:48.856: E/AndroidRuntime(4010):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 
04-01 03:41:48.856: E/AndroidRuntime(4010): Caused by: java.lang.IllegalArgumentException: n <= 0: 0 
04-01 03:41:48.856: E/AndroidRuntime(4010):  at java.util.Random.nextInt(Random.java:182) 
04-01 03:41:48.856: E/AndroidRuntime(4010):  at com.Tripps.thesimplegame.DrawingView.<init>(DrawingView.java:38) 
04-01 03:41:48.856: E/AndroidRuntime(4010):  at com.Tripps.thesimplegame.Main.onCreate(Main.java:30) 
04-01 03:41:48.856: E/AndroidRuntime(4010):  at android.app.Activity.performCreate(Activity.java:5933) 
04-01 03:41:48.856: E/AndroidRuntime(4010):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105) 
04-01 03:41:48.856: E/AndroidRuntime(4010):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251) 
04-01 03:41:48.856: E/AndroidRuntime(4010):  ... 10 more 

回答

1

你在呼喚什麼randomWidthrandomheight實際上是x和你的圈子的y座標。
這是方法簽名:

canvas.drawCircle(x, y, radius, paint); 

要檢查用戶是否可以做到這一點的圓圈內點擊:

public boolean onTouch(View v, MotionEvent event) { 
    int x = (int)event.getX(); 
    int y = (int)event.getY(); 
    if(isInsideCircle(x, y)){ 
     //Do your things here 
    } 
    return true; 
} 

private boolean isInsideCircle(int x, int y){ 
    if (((x - center_x)^2 + (y - center_y)^2) < radius^2) 
    return true; 
    return false;  
} 
+0

@DevinTripp Random.nextInt(INT N)接受一個整數作爲值你不能通過浮動或其他。 – Sid 2015-04-01 09:00:33

+0

沒有它與任何數據類型 – 2015-04-01 09:04:26

+0

看看這裏:http://developer.android.com/reference/java/util/Random.html#nextInt(int) 它只接受一個int如果你cal Random.nextInt( int n) – Sid 2015-04-01 09:11:22

相關問題