2016-08-18 2 views
0

그래서 RealTutsGML에서 Java 튜토리얼을 가져오고 있습니다. 나는 에피소드 7의 마지막 부분에 있습니다. 나는 문제가있다. 적 AI는 항상 작동하지 않는다. 항상 플레이어를 따라 가지 않으며, 그럴 때, 그것은 지저분하고 단거리 밖에 없다. 또한 적군은 오른쪽 하단으로 만 이동합니다.Java AI가 플레이어를 따르지 않습니다.

package com.project.main; 

import java.awt.Canvas; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.image.BufferStrategy; 
import java.util.Random; 

public class Game extends Canvas implements Runnable{ 

    private static final long serialVersionUID = -2379768900378456337L; 

    public static final int WIDTH = 640, HEIGHT = WIDTH/12 * 9; 

    private Thread thread; 
    private boolean running = false; 

    private Random r; 
    private Handler handler; 
    private HUD hud; 
    private Spawn spawner; 

    public Game(){ 
     handler = new Handler(); 
     this.addKeyListener(new KeyInput(handler)); 

     new Window(WIDTH, HEIGHT, "Dodge BETA", this); 

     hud = new HUD(); 
     spawner = new Spawn(handler, hud); 
     r = new Random(); 

     handler.addObject(new Player(WIDTH/2-32, HEIGHT/2-32, ID.Player, handler)); 
     handler.addObject(new BasicEnemy(r.nextInt(WIDTH - 32), r.nextInt(HEIGHT - 32), ID.BasicEnemy, handler)); 
    } 


    public synchronized void start(){ 
     thread = new Thread(this); 
     thread.start(); 
     running = true; 
    } 

    public synchronized void stop(){ 
     try{ 
      thread.join(); 
      running = false; 

     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 

    public void run(){ 
     this.requestFocus(); 
     long lastTime = System.nanoTime(); 
     double amountOfTicks = 60.0; 
     double ns = 1000000000/amountOfTicks; 
     double delta = 0; 
     long timer = System.currentTimeMillis(); 
     int frames = 0; 
     while(running){ 
      long now = System.nanoTime(); 
      delta += (now - lastTime)/ns; 
      lastTime = now; 
      while(delta >= 1){ 
       tick(); 
       delta--; 
      } 
      if(running) 
       render(); 
      frames++; 

      if(System.currentTimeMillis() - timer > 1000){ 
       timer += 1000; 
       System.out.println("FPS: " + frames); 
      } 
     } 
     stop(); 
    } 

    private void tick(){ 
     handler.tick(); 
     hud.tick(); 
     spawner.tick(); 
    } 

    private void render(){ 
     BufferStrategy bs = this.getBufferStrategy(); 
     if(bs == null){ 
      this.createBufferStrategy(3); 
      return; 
     } 

     Graphics g = bs.getDrawGraphics(); 

     g.setColor(Color.black); 
     g.fillRect(0, 0, WIDTH, HEIGHT); 

     handler.render(g); 

     hud.render(g); 

     g.dispose(); 
     bs.show(); 
    } 

    public static float clamp(float var, float min, float max){ 
     if(var >= max) 
      return var = max; 
     else if(var <= min) 
      return var = min; 
     else 
      return var; 
    } 

    public static void main(String args[]){ 
     new Game(); 
    } 

} 

게임 오브젝트는 원수 플레이어의 마스터 클래스 (필요한 부분) :

여기에 내 모든 코드입니다. 물건을 더 쉽고 깨끗하게 만들기 위해 많은 사전 제작 방법을 사용합니다.

package com.project.main; 

import java.awt.Graphics; 
import java.awt.Rectangle; 

public abstract class GameObject { 

    protected float x, y; 
    protected ID id; 
    protected float velX, velY; 

    public GameObject(float x, float y, ID id){ 
     this.x = x; 
     this.y = y; 
     this.id = id; 
    } 

    public abstract void tick(); 
    public abstract void render(Graphics g); 
    public abstract Rectangle getBounds(); 

    public void setX(int x){ 
     this.x = x; 
    } 
    public void setY(int y){ 
     this.y = y; 
    } 
    public float getX(){ 
     return x; 
    } 
    public float getY(){ 
     return y; 
    } 
    public void setId(ID id){ 
     this.id = id; 
    } 
    public ID getId(){ 
     return id; 
    } 
    public void setVelX(int velX){ 
     this.velX = velX; 
    } 
    public void setVelY(int velY){ 
     this.velY = velY; 
    } 
    public float getVelX(){ 
     return velX; 
    } 
    public float getVelY(){ 
     return velY; 
    } 

} 

핸들러 클래스 이 클래스를 업데이트하고 객체를 렌더링뿐만 아니라, 게임에 개체를 추가하고 제거하는 데 도움이됩니다.

package com.project.main; 

import java.awt.Graphics; 
import java.util.LinkedList; 

public class Handler { 

    LinkedList<GameObject> object = new LinkedList<GameObject>(); 

    public void tick(){ 
     for(int i = 0; i < object.size(); i++){ 
      GameObject tempObject = object.get(i); 

      tempObject.tick(); 
     } 
    } 

    public void render(Graphics g){ 
     for(int i = 0; i < object.size(); i++){ 
      GameObject tempObject = object.get(i); 

      tempObject.render(g); 
     } 
    } 

    public void addObject(GameObject object){ 
     this.object.add(object); 
    } 

    public void removeObject(GameObject object){ 
     this.object.remove(object); 
    } 

} 

SMARTENEMY AI 클래스는 주위 플레이어를 다음 스마트 적을 만들 예정이다 - 그러나 나는 이전에 설명 된 바와 같이, 그 정말 버그가. 그것은 단지 바로 이동하는 경우 을 아래로 당신의 델타는 항상 (velX, velY) 긍정적 나타냅니다

package com.project.main; 

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Rectangle; 

public class SmartEnemy extends GameObject{ 

    private Handler handler; 
    private GameObject player; 

    public SmartEnemy(int x, int y, ID id, Handler handler) { 
     super(x, y, id); 
     this.handler = handler; 

     for(int i = 0; i < handler.object.size(); i++){ 
      if(handler.object.get(i).getId() == ID.Player) player = handler.object.get(i); 
     } 
    } 

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

    public void tick() { 
     x += velX; 
     y += velY; 

     float diffX = x - player.getX() - 8; 
     float diffY = y - player.getY() - 8; 
     float distance = (float) Math.sqrt((x - player.getX())*(x - player.getX()) + (y-player.getY())*(y-player.getY())); 

     velX = (int) ((-1.0/distance) * diffX); 
     velY = (int) ((-1.0/distance) * diffY); 

     if(y <= 0 || y >= Game.HEIGHT - 50) velY *= -1; 
     if(x <= 0 || x >= Game.WIDTH - 20) velX *= -1; 

     handler.addObject(new Trail(x, y, ID.Trail, Color.green, 16, 16, 0.03f, handler)); 
    } 

    public void render(Graphics g) { 

     g.setColor(Color.green); 
     g.fillRect((int)x, (int)y, 16, 16); 
    } 

} 
+1

[편집] 관련 코드를 포함하거나 [MCVE]를 포함하십시오. 실제로 우리에게 보여주지 않으면 코드에 어떤 문제가 있는지 알 수 없습니다. – whrrgarbl

+3

코드가 너무 많습니다. 이것은 [mcve]가 아닙니다. 당신은 너무 많은 사람들이이 모든 것을 통과하도록 요구하고 있습니다. – khelwood

+1

[디버거 사용] (https://www.youtube.com/watch?v=9gAjIQc4bPU) –

답변

0

몇 가지가 떠오른다. 그것은 내가 왜 SMARTENEMY 코드에서 분명하지 않습니다.

둘째로, distance이 성장 속도가 떨어집니다. 이것은 아마도 짧은 거리에서만 작동하는 이유 일 것입니다.

셋째, diff 계산 (player.x - x)에 대한 인수를 플립하면 속도 계산에서 -1f를 삭제할 수 있습니다. 나는 왜 속도가 거리에 의존해야하는지 이해하지 못합니다.

관련 문제