2013-05-27 76 views
0

我有一個拖放遊戲。用戶應該選擇正確的形狀來拖放到盒子上。我按照這個教程here當用戶拖動錯誤的對象時,它不會顯示錯誤答案呢。當他將其放到籃筐物體上時應顯示該警告。我試過這個:在Android中拖放遊戲

TextView objBasket, tx, timer; 
int trial = 0; 
TextView obj[] = new TextView[4]; 
int[] images = { 
     R.drawable.stage4_object1, // Correct Answer a 
     R.drawable.stage4_object2, 
     R.drawable.stage4_object3, 
     R.drawable.stage4_object4 
}; 

List<TextView> iv = new ArrayList<TextView>(); 
String[] tagList = {"a","b","c","d"}; 


    @Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
      WindowManager.LayoutParams.FLAG_FULLSCREEN); 
    setContentView(R.layout.stage4_1); 

    // I created a custom countdown timer c/o Say 
      counter = new MyCount(30000,1000); 
      counter.start(); 

    initControls(); 

    getCorrectObject(); 

} 

private void getCorrectObject() { 
    // TODO Auto-generated method stub 

    List<Integer> objects = new ArrayList<Integer>(); 
    for(int arr : images){ 
     objects.add(arr); 
    } 

    // Shuffle the collection 
    Collections.shuffle(objects); 

    iv.add((TextView) findViewById(R.id.txtStage4_object1)); 
    iv.add((TextView) findViewById(R.id.txtStage4_object2)); 
    iv.add((TextView) findViewById(R.id.txtStage4_object3)); 
    iv.add((TextView) findViewById(R.id.txtStage4_object4)); 

    Collections.shuffle(iv); 

    iv.get(0).setBackgroundResource(images[0]); 
    iv.get(1).setBackgroundResource(images[1]); 
    iv.get(2).setBackgroundResource(images[2]); 
    iv.get(3).setBackgroundResource(images[3]); 

    iv.get(0).setOnTouchListener(new ChoiceTouchListener()); 
    iv.get(1).setOnTouchListener(new ChoiceTouchListener()); 
    iv.get(2).setOnTouchListener(new ChoiceTouchListener()); 
    iv.get(3).setOnTouchListener(new ChoiceTouchListener()); 

    for (int i = 0; i < tagList.length; i++) { 
     iv.get(i).setTag(tagList[i]); 
    } 

} 

    @SuppressLint("NewApi") 
private class ChoiceTouchListener implements OnTouchListener { 

    @SuppressLint("NewApi") 
    @Override 
    public boolean onTouch(View v, MotionEvent motionEvent) { 
     // TODO Auto-generated method stub 

     if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { 
      //setup drag 
      ClipData data = ClipData.newPlainText("", ""); 
      DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(v); 

      //start dragging the item touched 
      v.startDrag(data, shadowBuilder, v, 0); 
      return true; 
     } 
     else { 
      return false; 
     } 

    } 
} 

@SuppressLint("NewApi") 
private class ChoiceDragListener implements OnDragListener { 

    @Override 
    public boolean onDrag(View v, DragEvent event) { 
     // TODO Auto-generated method stub    
     switch (event.getAction()) { 
     case DragEvent.ACTION_DRAG_STARTED: 
      //no action necessary 
      break; 
     case DragEvent.ACTION_DRAG_ENTERED: 
      //no action necessary 
      break; 
     case DragEvent.ACTION_DRAG_EXITED: 
      //no action necessary 
      break; 
     case DragEvent.ACTION_DROP: 
      //handle the dragged view being dropped over a drop view 
      View view = (View) event.getLocalState(); 

      //stop displaying the view where it was before it was dragged 
      view.setVisibility(View.INVISIBLE); 

      //view dragged item is being dropped on 
      TextView dropTarget = (TextView) v; 

      //view being dragged and dropped 
      TextView dropped = (TextView) view; 

      for (int i = 0; i < iv.size(); i++) { 
       final int k = i; 

        String tmp = "a"; 

        if (tmp.equals(iv.get(k).getTag())) { 
         Log.i("result","CORRECT ANSWER: "+ tmp); 
         goToNextQuestion(); 
        } else { 
         Log.i("result","WRONG ANSWER: "+ iv.get(k).getTag()); 
         trial++; 
         guessedWrong(); 
         playWrongSound(); 
        } 

      } 


      break; 
     case DragEvent.ACTION_DRAG_ENDED: 
      //no action necessary 
      break; 
     default: 
      break; 
    } 
     return true; 
    } 


} 

但是,只要我選擇正確的對象,它就不會進入下一個問題。我在這裏錯過了什麼?我真的需要幫助來完成這個遊戲。提前致謝。

回答

0

我認爲我看到您的程序有兩個問題。

您創建了您的ChoiceDragListener類,但未將其註冊到您想要拖動的任何項目中。這似乎是從您的getCorrectObject方法中丟失。

iv.get(0).setOnDragListener(new ChoiceDragListener()); 
iv.get(1).setOnDragListener(new ChoiceDragListener()); 
iv.get(2).setOnDragListener(new ChoiceDragListener()); 
iv.get(3).setOnDragListener(new ChoiceDragListener()); 

我看到的另一個問題是您的switch語句中的ACTION_DROP大小寫。首先你得到了用戶已經放棄的TextView,然後你開始循環瀏覽所有的文本視圖。在ACTION_DROP情況中的代碼應該看起來更像:

View view = (View) event.getLocalState(); 
view.setVisibility(View.INVISIBLE); 
TextView dropTarget = (TextView) v; 
TextView dropped = (TextView) view; 
String temp = "a"; 
if(temp.equals(view.getTag()){ 
    goToNextQuestion(); 
}else{ 
    guessedWrong() 
} 
+0

嘿感謝您的回答,但是當我試圖做到這一點,選擇了錯誤的對象永遠不會回到它的默認位置。你能幫我指出怎麼做嗎? –

+0

這可能會更復雜一點。我會聲明一個x和y int變量以及您的試用變量。在你的onTouch方法中設置x = v.getLeft()和y = v.getTop()。這會獲取對象的x和y位置。然後,當你的玩家猜錯了,你可以說view.setX(x)和view.setY(y);這應該將位置重置回到玩家最初觸摸文本視圖時的位置。 –

+0

謝謝,但我設法做到了,使用view.setVisibility(VISIBLE); –