2015-04-01 59 views
0

嗨,即时制作一个游戏,将在屏幕上创建随机圈。随机创建的圆圈将具有红色或绿色的值。我的问题是,我希望不仅能够确定用户何时点击其中一个圈子,而是确定他们最终点击了哪个圈子(红色或绿色)。以下是我的代码如下。我的主要问题是试图找到将被吸引试图获得在屏幕上绘制的每个随机圆的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; 
    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); 
    } 



    @Override 
    public boolean onTouchEvent (MotionEvent event) { 

     double r = Math.sqrt(((randomWidth^2)+(randomHeight^2))); 
     int maxX = (int) (((randomWidth)*(randomWidth)) + r); 
     int minX = (int) ((((randomWidth)*(randomWidth))) - r); 
     int maxY = (int) (((randomHeight)*(randomHeight)) + r); 
     int minY = (int) ((((randomHeight)*(randomHeight))) - r); 

     public int xCoordinateOfRedColor(){ 
      if(redColor == lastColor){ 
       if(randomWidth > maxX && < minX){ 
        event.getX(); 
       } 
      }; 
     } 
     public int yCoordinateOfRedColor(){ 
      if(redColor == lastColor){ 
       if(randomHeight > maxY && < minY){ 
        event.getX(); 
       } 
      }; 
     } 
     if(redColor == lastColor){ 
      if(randomHeight > maxY && < minY){ 
       event.getY(); 
      } 
     }; 
     if(greenColor == lastColor){ 

     }; 
     if(greenColor == lastColor){ 

     }; 

     switch (event.getAction()) { 
      case MotionEvent.ACTION_DOWN : 
       randomWidth = (int) event.getX(); 
       randomHeight = (int) event.getY(); 

       invalidate(); 
       break; 
      case MotionEvent.ACTION_POINTER_UP : 


       break; 
     } 

     return true; 

    } 


} 

我不知道如果IM接近或真正远离圆的x和y。

+0

真的没有人能回答这个问题吗?好难过 – 2015-04-01 05:55:28

+0

寒意。我在打字:P – CandiedOrange 2015-04-01 05:55:55

+0

哈哈对不起,我刚才一直在这个问题上坐了很长时间,我有点慌乱。慢慢来。 – 2015-04-01 05:57:04

回答

3

有很多方法可以解决这类问题。只要试图将它们全部列出,你就可以驾驶自己的坚果。最强大的功能之一是在创建时为每个形状分配一种独特的颜色。使用该颜色来查找形状。换句话说...

当他们点击此:

enter image description here

样品的颜色从这个:

enter image description here

保持一个HashMap从这些独特的颜色,形状对象引用。让所有形状在隐藏的位图上绘制出他们独特的颜色,而这些位图都不会放在屏幕上。当用户点击时,在隐藏的位图上查找该x的颜色。通过散列图运行该颜色,并且您可以参考他们点击的形状。现在,您不必担心重叠或甚至使用与圆形不同的形状。这不仅给你形状的x和y,而且让你知道关于那个形状的一切。

当然,为了这个工作,你必须让你自己的形状类。为了说明的目的,我制作了独特的颜色。实际上你可以只增加一个int。这可以通过构造函数递增,或者更好的是通过工厂方法注入它。

这足够强大,甚至在渲染3D时也能正常工作。只需保持可见和隐藏的位图同步。事实证明,这很容易,因为你只是重复使用相同的渲染代码。循环每一个形状,并让它在你交给它的位图上用自己的独特颜色绘制自己。只要没有会改变颜色的其他效果(阴影,光照,光线追踪)就可以工作。确保关闭这些。

顺便说一句,我不认为这样的:

if(randomHeight > maxY && < minY){ 

做什么,你认为它。当我想测试的东西是两个值之间使用:

if(minY <= randomHeight && randomHeight <= maxY){ 

,因为它让我想起了数学不等式像3≤X≤15

+0

这并没有解释任何东西 – 2015-04-01 06:37:30

+0

这是一个尝试向您展示一种可靠地获取他们可能点击的任何圆的x和y的方法。那不是你问的吗? – CandiedOrange 2015-04-01 06:48:15

+0

我认为通过“解释”他们的意思是“包含代码”。 – ChiefTwoPencils 2015-04-02 05:57:10

0

我不知道我明白你的问题,而是怎么样保留绘制的圆圈列表(最后绘制在列表的开头),以及用户何时单击遍历列表并检查每次点击屏幕上的点是否属于该圆圈?第一次发生这种情况将对应于包含点击点的最后一个画出的圆。