2016-12-04 6 views
1

Это звучит чрезвычайно философски, не так ли?Мой зомби не найдет себя.

В любом случае, у меня есть довольно сложная проблема.

Мой класс main_activity собирает все зомби, как так:

//Testing Runnable (used to compare the first zombie with the player) 
private Runnable updateLocations = new Runnable(){ 
    @Override 
    public void run(){ 
     try { 
      while(true) { 
       image_player.getLocationInWindow(pLoc); 
       Zombie zoms = zombieCollection.next(); 
       if(!zoms.equals(null)){ 
        zoms.getZombieImage().getLocationInWindow(zLoc); 
       } 
       System.out.println("Zombie: x = " + zLoc[0] + "; y = " + zLoc[1]); 
       System.out.println("Player: x = " + pLoc[0] + "; y = " + pLoc[1]); 
       Thread.sleep(500); 
      } 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
}; 

Мой класс зомби собирает информацию, как так:

public class Zombie{ 

float X, Y; 
int Width, Height; 
Direction fdirc; 
ImageView zImage; 
Player player; 

boolean dead; 
int[] zLoc; 


public Zombie(ImageView zImage, Player player){ 
    zLoc = new int[2]; 
    zImage.getLocationOnScreen(zLoc); 

    this.zImage = zImage; 
    this.X = zLoc[0]; 
    this.Y = zLoc[1]; 
    this.Width = zImage.getWidth(); 
    this.Height = zImage.getHeight(); 
    this.fdirc = Direction.EAST; 
    this.player = player; 
    this.dead = false; 

    Thread thread = new Thread(this.startZombieChase); 
    thread.start(); 
} 

public ImageView getZombieImage(){ 
    return zImage; 
} 
private Runnable startZombieChase = new Runnable() { 
    @Override 
    public void run() { 
     try { 
      while(!dead) { 
       moveTowardsPlayer(); 

       Thread.sleep(10); 
       updateZombie.sendEmptyMessage(0); 
      } 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
}; 
private Handler updateZombie = new Handler(Looper.getMainLooper()) { 
    public void handleMessage(android.os.Message msg) { 

     /** Because the zombie should always be on top! **/ 
     zImage.getLocationOnScreen(zLoc); 
     zImage.bringToFront(); 
     zImage.setX(X); 
     zImage.setY(Y); 

    } 
}; 

private void moveTowardsPlayer(){ 
    int player_x = player.getPosition()[0]; 
    int player_y = player.getPosition()[1]; 

    l("Where is it in zombie class : player - " + player_x + " " + player_y + "zombie - " + X + " " + Y); 

    float compareX = player_x - (int)X; 
    float compareY = player_y - (int)Y; 



    // Y is closer, so we're moving horizontally. 
    if(Math.abs(compareX) < Math.abs(compareY)){ 
     //Moving North 
     if(player_y > Y){ 
      Y+=1; 
     } 
     //Moving South 
     else if(player_y < Y){ 
      Y-=1; 
     } 
    } 
    // X is closer, so we're moving vertically. 
    else{ 
     //Moving East 
     if(player_x > X){ 
      X+=1; 
     } 
     //Moving West 
     else if(player_x < X){ 
      X-=1; 
     } 

    } 
} 
public void l(Object string){ 
    System.out.println("Log - " + string); 
} 
} 

Проблема у меня в том, что она будет двигаться по отношению к число (значит, оно движется относительно чего-то), но не правильное.

a busy cat

LogCat говорит мне это:

  • Где это в классе зомби: игрок - 750 451 зомби - 750 451
  • Где в main_activity: плеер - 750 451 зомби - 792 619

Может ли кто-нибудь помочь мне понять, что я делаю неправильно? Весь проект расположен here.

+7

Прежде всего '! Zoms.equals (null)' всегда будет возвращать 'true' или fail с NPE. – Tunaki

+4

Да .... [это будет] (http://stackoverflow.com/questions/994430/compare-an-object-to-null) ... – Tunaki

+0

У ZombieCollection может быть 0 объектов зомби, поэтому zCollection. next() вернет null. – sheepiiHD

ответ

5

Zombies, который отходит от Brainz, должны быть злым зомби. Мы не можем этого, теперь можем?

Чтобы иметь функцию, которая перемещает зомби к не зомби, вы используете функцию, но эта функция использует переменные, которые не являются аргументами, и поэтому нелегко узнать, откуда они взялись. Я бы с чем-то вроде этого: (это немного многословный, но ясно показывает, что происходит)

/* 
* Function to update the position of the Zombie, aka walk to the Player. 
* @player_pos  - Where's the Brainz at? 
* @zombie_pos  - Where am I? 
* Might want to build it overloaded with an option for the speed. 
* 
* @return   - We return the new Zombie pos. 
*/ 
private double [] moveTowardsPlayer(double [] player_pos, double [] zombie_pos) { 
    // To make sure we don't override the old position, we copy values. (Java stuff) 
    double [] player_pos_old = player_pos.clone(); 
    double [] zombie_pos_old = zombie_pos.clone(); 

    // Let's get the new X pos for the Zombie 
    double left_or_right = player_pos_old[0] - zombie_pos_old[0]; // pos number is right, neg is left 
    double zombie_pos_new_x; 
    if (left_or_right > 0) { // Right 
     zombie_pos_new_x = player_pos_old[0] + zombie_speed; 
    } else { // Left - this way we make sure we are always getting nearer to the Brainz. 
     zombie_pos_new_x = player_pos_old[0] - zombie_speed; 
    } 

    // TODO: do the same for the Y pos. 

    // Bring it together 
    double [] zombie_pos_new = {zombie_pos_new_x, zombie_pos_new_y}; 

    // One step closer to the Brainz! 
    return zombie_pos_new; 
} 

И использовать как:

double [] zombie_pos = moveTowardsPlayer([2, 2], [5, 4]); 
this.X = zombie_pos[0]; // I'd advice to keep these together as one var. 
this.Y = zombie_pos[1]; // But it's your game. 

А затем выяснить, когда зомби получает Brainz (или Bullet)

5

это здесь не правильно:

if(!zoms.equals(null)){ 

если вы пытаетесь проверить, что zoms не указывает на нулевой ссылки, то сделать

if(zoms != null){ 
+0

Я изменил это, это не решает проблему. Я также не могу подумать, как это решит проблему. Я проверяю ссылки на позицию, проблема не проверяет, является ли она нулевой. Я не получаю NPE. – sheepiiHD

+4

, даже если он не исправит вашу проблему, это было неправильно, поэтому сделайте то, что предложил ΦXocę 웃 Пepeúpa ツ – Opiatefuchs

+0

Я не прошу вас критиковать мое программирование. Я прошу помощи для моей проблемы. Это прямо здесь не устраняет мою проблему. Если это не решит мою проблему, тогда почему это был бы ответ? Это не ответ на мой вопрос, поэтому для меня это бесцельно. – sheepiiHD