2014-09-29 2 views
0

Другие вопросы по теме, но это как-то иначе.Android: Есть ли способ запрограммировать «обнаружение столкновения» между двумя экземплярами объекта?

В принципе, у меня есть этот класс под названием «Player», который я умножаю на определенное количество раз. Этот класс генерирует случайные координаты в холсте, а растровые изображения перемещаются к этим координатам. Теперь проблема в том, что некоторые из них накладываются друг на друга, делая их «нереальными».

Я пробовал простой оператор «if» внутри класса «Player», но он не работает, поскольку каждый экземпляр класса принимает в счет только его переменные и игнорирует переменные других экземпляров.

Вот код:

У меня это первый класс с другим классом вложенными:

public class MainActivity extends Activity{ 

    Game gameView; 
    float k,l; 

    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     gameView = new Game(this); 
     setContentView(gameView);   
    } 

    public class Game extends SurfaceView implements Runnable { 

     Canvas canvas; 
     SurfaceHolder ourHolder; 
     Thread ourThread = null; 
     boolean isRunning = true; 
     Player[] player = new Player[3]; 

     public Game(Context context) { 
      super(context); 
      ourHolder = getHolder(); 
      ourThread = new Thread(this); 
      ourThread.start(); 
     for(int i=0; player.length < i; i++){ 
      player[i] = new Player(context); 
     } 
     } 

     public void run() { 
      while(isRunning) { 
        if(!ourHolder.getSurface().isValid()) 
         continue; 
         canvas = ourHolder.lockCanvas();     
         canvas.drawRGB(200, 200, 200); 

        for (int i = 0; player.length < i; i++){ 
         player[i].draw(canvas); 
         player[i].move(); 
        } 

        ourHolder.unlockCanvasAndPost(canvas); 
       } 
      }  
     }   
} 

А вот игрок класса:

public class Player { 

    Bitmap base; 
    float x = (float) (Math.random()*200); 
    float y = (float) (Math.random()*200); 
    float e = (float) (Math.random()*200); 
    float r = (float) (Math.random()*200); 

    public Player(Context context) { 
     super(); 
     base = BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_launcher); 
    } 

    public void draw(Canvas canvas) { 

     if(x > e-5 && x < e+5 && y > r-5 && y < r+5){ 
      e = (float) (Math.random()*canvas.getWidth()); 
      r = (float) (Math.random()*canvas.getHeight()); 
     } 

     canvas.drawBitmap(base, x - base.getWidth()/2, y - base.getHeight()/2, null); 
    } 

public void move() { 
     //Here's just the code that makes the bitmap move. 
    } 
} 

Как вы, возможно, видели, переменные «e» и «r» создают случайные значения каждый раз, когда координаты растрового изображения (x и y) приближаются к ним, а затем переменные «x» и «y» увеличивают или уменьшают их значения, чтобы соответствовать «e», и "r".

Теперь я хочу, чтобы переменные «x» и «y» взаимодействовали с переменными «x» и «y» других экземпляров, чтобы они не перекрывались. Есть ли способ сделать это?

спасибо.

+0

Google Fu + "ограничивающая коробка" -> ??? -> прибыль. – MarsAtomic

ответ

0

В классе игрока, либо сделать X и Y общественности (не рекомендуется) или создать аксессоров им:

public void setX(float x) { 
    this.x = x; 
} 

и

public int getX() { 
    return x; 
} 

Теперь в вашем счете() метод, вы может сделать что-то подобное (заимствование из кода, который у вас уже есть):

for (int i = 0; player.length < i; i++){ 
    player[i].draw(canvas); 
    player[i].move(); 
} 
... 
for (int i = 0; i < player.length - 1; i++) { 
    if (player[i].getX() > player[i + 1].getX() - 5 && 
     player[i].getX() < player[i + 1].getX() + 5 && 
     player[i].getY() > player[i + 1].getY() - 5 && 
     player[i].getY() < player[i + 1].getY() + 5) { 

    // Do your update here! 
    // You may need to create other methods...or you can just 
    // create random X & Y for the player. 
} 

Это действительно простой подход. Имейте в виду, если у вас много игроков, вы можете перенести их на другого игрока, поэтому вы можете снова протестировать, как только вы переместите плеер, чтобы убедиться, что это ясно.

+0

Большое спасибо за ваш ответ! Я об этом не думал. Я попробую. – Gonzalo