Game AI & Unity/Java Steering game

[Game AI][Steering Behavior] 5. engine.Car.java

bay07 2024. 3. 20. 10:42

2. 생성자 

public Car(String graphicsFileName, double x, double y, double alpha, Controller c) throws Exception {
    m_img = ImageIO.read(new File(graphicsFileName));
    m_x = x;
    m_y = y;
    m_alpha = alpha;
    m_controller = c;
    m_collision_box = new RotatedRectangle(m_x, m_y, m_img.getWidth()/2, m_img.getHeight()/2, m_alpha);
}

 

Car 클래스의 생성자

그래픽 파일의 경로, 초기 위치(x, y), 초기 회전 각도(alpha),  컨트롤러 객체를 매개변수로 받는다

ImageIO.read(new File(graphicsFileName))를 통해 그래픽 파일을 읽어와 BufferedImage 객체로 저장한다 

초기 위치와 회전 각도, 그리고 컨트롤러 객체를 해당하는 멤버 변수에 저장한다 

자동차의 충돌 박스를 초기화함


3.  매서드 

   
public double getAngle() 현재 회전 각도 반환
public double getSpeed() 현재 속도 반환
public void update(Game game, double delta_t) 게임 상태 업데이트 
자동차의 속도, 위치, 회전 각도 업데이트 
충돌 여부를 확인한다
public void draw(Graphics2D g) 자동차를 화면에 그리는 메서드 
자동차의 위치와 회전 각도에 따라 이미지를 그린다 
public RotatedRectangle getCollisionBos()  

 

    public void update(Game game, double delta_t) {
        double controlVariables[] = {0,0,0};
        m_controller.update(this, game, delta_t, controlVariables);
        
        // remember the old posision, in case there is a collision:
        double old_x = m_x;
        double old_y = m_y;
        double old_angle = m_alpha;
        
        // update velocity, position and angle:
        double brake_strength = (m_speed>0 ? 250:100);
        double acceleration = controlVariables[Controller.VARIABLE_THROTTLE]*100 - 
                              controlVariables[Controller.VARIABLE_BRAKE]*brake_strength;
        m_speed*=0.99;   // drag
        m_speed += acceleration * delta_t;
        if (m_speed>m_max_velocity) m_speed = m_max_velocity;
        if (m_speed<m_min_velocity) m_speed = m_min_velocity;        
        m_x += Math.cos(m_alpha)*m_speed * delta_t;
        m_y += Math.sin(m_alpha)*m_speed * delta_t;
        double turning_rate = controlVariables[Controller.VARIABLE_STEERING]*m_speed;
        m_alpha+=turning_rate*delta_t/50;
        
        // update the collision box:
        m_collision_box.C.x = m_x;
        m_collision_box.C.y = m_y;
        m_collision_box.ang = m_alpha;
        
        // check for collisions:
        if (game.collision(this) != null) {
            m_x = old_x;
            m_y = old_y;
            m_alpha = old_angle;
            m_speed = 0;

            m_collision_box.C.x = m_x;
            m_collision_box.C.y = m_y;
            m_collision_box.ang = m_alpha;
        }
    }

 

update()

① 컨트롤러 업데이트

m_controller.update(this, game, delta_t, controlVariables)

컨트롤러 객체의 update() 메서드를 호출하여 제어 변수를 업데이트합니다.

컨트롤러는 자동차의 움직임을 결정하는데 사용됨 

 

② 이전 위치 저장

double old_x = m_x;, double old_y = m_y;, double old_angle = m_alpha;:

이전 위치와 회전 각도를 저장한다.

이후 충돌이 감지될 경우 이전 위치로 자동차를 되돌리기 위해 사용됨

 

③ 속도, 위치, 회전 각도 업데이트

가속도, 속도 계산 / drag(마찰)을 사용하여 감속

속도를 이용하여 위치 업데이트 

현재 각도, 속도에 따라 자동차가 이동하도록 하기 
제어 변수에 따라 자동차의 회전 속도를 계산하여 회전 각도를 업데이트

 

④ 충돌 박스 업데이트

충돌 박스를 업데이트하여 현재 위치와 회전 각도를 반영

 

⑤ 충돌 검사 

game.collision(this)

현재 자동차가 다른 객체와 충돌하는지 확인

만약 충돌이 감지되면 collision() 메서드는 충돌한 객체를 반환
충돌이 발생한 경우 이전 위치와 회전 각도로 자동차를 되돌린다

이후 속도를 0으로 설정하여 멈추게 합니다.