2012-04-11 31 views
0

所以,我在画布上有各种位图,它们都是作为单独的类来动画的。Android游戏Java从链接列表中删除位图

当位图关闭屏幕我想要从链表中删除位图。它们位于链接列表中,因为屏幕上可能存在多个相同的位图。

位图从屏幕上删除,但它仍然是在链表的链表大小为1

如果我不止一个位图添加到他们都拿得出LinkedList的,但是当那张画面游戏崩溃。

面板类。

public void doDraw(long elapsed, long score, Canvas canvas) { 
     canvas.drawBitmap(background, 0, 0, null); // draw a black background 
     synchronized (mChimneys) { 

      if ((mPresents.size() < 3)) { 
       for (Present presents : mPresents) { 
        presents.doDraw(canvas); 
       } 
      } 
     } 

    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     synchronized (mChimneys) { 

      float x = event.getX(); 
      float y = event.getY(); 

      float mX = 0; 
      float mY = 0; 

      int mWidth = 0; 
      int mHeight = 0; 

      for (Santa santas : mSantas) { 
       mX = santas.getmX(); 
       mY = santas.getmY(); 
       mWidth = santas.getmBitmap().getWidth(); 
       mHeight = santas.getmBitmap().getHeight(); 
      } 

      switch (event.getAction()) { 

      case MotionEvent.ACTION_DOWN: 
       if (x >= mX && x < (mX + mWidth) && y >= mY 
         && y < (mY + mHeight)) { 
        if ((mPresents.size() < 4)) { 
         mPresents.add(new Present(getResources(), mX, mY)); 
         mPresentNumber = mPresents.size(); 
        } 
       } 
      } 
     } 
     return true; 
    } 

public void animate(long elapsedTime) { 
     synchronized (mChimneys) { 

      for (Present presents : mPresents) { 
       boolean remove = presents.animate(elapsedTime); 
       if (remove) { 
        mPresents.remove(presents); 
       } 
      } 
     } 

存在类。

package com.droidnova.android; 

import java.util.ArrayList; 
import java.util.LinkedList; 
import java.util.List; 
import java.util.Random; 

import android.content.res.Resources; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 

public class Present { 
    private float mX; 
    private float mY; 

    private Bitmap mBitmap; 

    private int mSpeedY; 

    Panel panel; 

    public Present(Resources res, float x, float y) { 
     Random rand = new Random(); 

     List<Integer> my_presents = new LinkedList<Integer>(); 

     my_presents.add(R.drawable.presentblue); 
     my_presents.add(R.drawable.presentpurple); 
     my_presents.add(R.drawable.presentred); 
     my_presents.add(R.drawable.presentyellow); 

     int choice = rand.nextInt(my_presents.size()); 

     mBitmap = BitmapFactory.decodeResource(res, my_presents.get(choice)); 
     mX = x + 50; 
     mY = y + 100; 
     mSpeedY = 5; 
    } 

    public void doDraw(Canvas canvas) { 
     canvas.drawBitmap(mBitmap, mX, mY, null); 
    } 

    public boolean animate(long elapsedTime) { 
     mY += mSpeedY * (elapsedTime/20f); 
     boolean remove = checkBorders(); 
     if (remove) { 
      return true; 
     } 
     return false; 
    } 

    private boolean checkBorders() { 
     if (mY + mBitmap.getHeight() >= Panel.mHeight) { 
      return true; 
      // mSpeedY = -mSpeedY; 
      // mY = Panel.mHeight - mBitmap.getHeight(); 
     } 
     return false; 
    } 
} 

任何帮助表示赞赏。

回答

0

我觉得这些线路可能会导致一个问题:

 for (Present presents : mPresents) { 
      boolean remove = presents.animate(elapsedTime); 
      if (remove) { 
       mPresents.remove(presents); 
      } 
     } 

既然你正试图从“mPresents”删除“礼物”,而你在列表中该元素上。我可能是错的,但我认为这有点像试图吃自己的头。这可能有助于创建另一个列表(或另一个Present对象),然后在循环完成后从列表中删除它。例如,这样的事情:

ArrayList <Present> presentsToRemove = new ArrayList<Present>(); 
for (Present presents : mPresents) { 
    if (presents.animate(elapsedTime)) { 
      presentsToRemove.add(presents); 
    } 
} 
mPresents.removeAll(presentsToRemove); 

请让我知道这是否有帮助,或者如果我误解了。

+0

另一种选择是使用迭代器而不是增强for循环。 – 2012-04-11 19:45:10