2016-07-16 2 views
3

Я создаю игру в первый раз в java, и в настоящее время я пытаюсь заставить своих зомби отслеживать и следить за игроком. ниже мой код. Я создал класс контроллера и использовал связанный список для создания нескольких зомби. Затем в моем методе обновления зомби я использую простые операторы if для зомби, чтобы отслеживать игрока. Проблема в том, что зомби отслеживают начальную начальную позицию игроков, но не туда, где он перемещается.java: Проигрыватель проигрывателя противника для java-игры

В методе update() zombie я использовал System.println (player.getX()); и это показало, что позиция игроков не обновлялась в классе зомби, поэтому именно они отслеживают только исходную позицию. Я не могу понять, как это исправить. любая помощь будет оценена по достоинству.

ZOMBIE КЛАСС:

public class Zombie extends Entity{ 

Animation dwn,up, left, right; 
BufferedImage north, south, east, west; 

Sprites sprites = new Sprites(); 
Player player = new Player(100,100); 


Rectangle boundsZombie; 

String direction = ""; 


public Zombie(int x, int y){ 

    super(x,y); 
    sprites.create(); 
    boundsZombie = new Rectangle(0,0, 32, 32); 

} 

public void update(){ 

    if(player.getX() > x){ 
     x = x + 1; 
    } 

    if(player.getX() < x){ 
     x = x - 1; 
    } 

    if(player.getY() > y){ 
     y = y + 1; 
    } 

    if(player.getY() < y){ 
     y = y - 1; 
    } 

    System.out.println(player.getX()); 
} 



public Rectangle getBounds(){ 
    return new Rectangle((int) x, (int) y, 32, 32); 
} 

public void render(Graphics g){ 

    g.drawImage(sprites.zombieNorth, x, y, null); 
    //g.setColor(Color.red); 
    //g.fillRect((int) x + boundsZombie.x, (int) y + boundsZombie.y, boundsZombie.width, boundsZombie.height); 

} 

public int getX() { 
    return x; 
} 

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

public int getY() { 
    return y; 
} 

public void setY(int y) { 
    this.y = y; 
} 

} 

PLAYER КЛАСС

общественный класс игрока распространяется Entity {

Animation dwn,up, left, right; 
BufferedImage north, south, east, west; 
Sprites sprites = new Sprites(); 
KeyManager keyManager = new KeyManager(); 
Rectangle boundsPlayer; 
//Controller c; 


boolean movUp, movDwn, movRight, movLeft; 
String direction = ""; 



public Player(int x, int y){ 
    super(x,y); 
    sprites.create(); 
    dwn = new Animation(100, sprites.player_down); 
    up = new Animation(100, sprites.player_up); 
    left = new Animation(100, sprites.player_left); 
    right = new Animation(100, sprites.player_right); 
    north = sprites.playerNorth; 
    south = sprites.playerSouth; 
    east = sprites.playerEast; 
    west = sprites.playerWest; 

    boundsPlayer = new Rectangle(0,0, 32, 32); 
} 

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

public void setY(int y) { 
    this.y = y; 
} 

public Rectangle getBounds(){ 
    return new Rectangle((int) x, (int) y, 32, 32); 
} 

/** 
* player tick method, used to move the player 
*/ 
public void update(){ 

    if(Game.getKeyManager().up){ 
     y -= 3; 
     direction = "north"; 


    } 
    if(Game.getKeyManager().down){ 
     y += 3; 
     direction = "south"; 

    } 
    if(Game.getKeyManager().left){ 
     x -= 3; 
     direction = "west"; 

    } 

    if(Game.getKeyManager().right){ 
     x += 3; 
     direction = "east"; 
     //System.out.println(x); 
    } 

} 

public int getX() { 
    return (int)x; 
} 

public int getY() { 
    return (int)y; 
} 

public String getDirection(){ 
    return direction; 
} 

/** 
* method used to return players facing direction sprite 
* @return 
*/ 
public BufferedImage getPlayerDirection(){ 
    if(direction == "north"){ 
     return north; 
    } 

    else if(direction == "south"){ 
     return south; 
    } 

    else if(direction == "east"){ 
     return east; 
    } 

    else{ 
     return west; 
    } 

} 


public void render(Graphics g){ 
    g.drawImage(getCurrentAnimationFrame(), (int) x, (int) y, null); 

    //g.setColor(Color.red); 
    //g.fillRect((int) x + boundsPlayer.x, (int) y + boundsPlayer.y, boundsPlayer.width, boundsPlayer.height); 
} 


/** 
* method used to return the bufferedImage of current frame 
* @return 
*/ 
public BufferedImage getCurrentAnimationFrame(){ 
    if(Game.getKeyManager().right == true){ 
     return right.getCurrentFrame(); 
    } 

    else if(Game.getKeyManager().left == true){ 
     return left.getCurrentFrame(); 
    } 

    else if(Game.getKeyManager().up == true){ 
     return up.getCurrentFrame(); 
    } 

    else if(Game.getKeyManager().down == true){ 
     return dwn.getCurrentFrame(); 
    } 

    else { 
     return getPlayerDirection(); 
    } 


} 

}

+0

Это потому, что я создаю ссылку на класс игрока в классе зомби. но я уже сделал это в своем классе, где я добавил игрока в игру? – Phill

ответ

2

Это происходит потому, что ваш класс противник имеет один объект плеер и игровой класс имеет совершенно другой игровой объект. Таким образом, позиция вашего игрока всегда будет одинаковой в классе врагов. Следовательно, было бы логичнее делать вражеское движение ИИ в игровом классе. Ваш игрок или вражеский класс должен просто удерживать позицию вашего персонажа, направление или загрузку изображения, независимо от того, является ли он врагом или игроком.

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

+0

Надеюсь, это поможет! – Sak6lab

Смежные вопросы