2015-04-01 28 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

我不知道我明白你的問題,而是怎麼樣保留繪製的圓圈列表(最後繪製在列表的開頭),以及用戶何時單擊遍歷列表並檢查每次點擊屏幕上的點是否屬於該圓圈?第一次發生這種情況將對應於包含點擊點的最後一個畫出的圓。

相關問題