Game AI & Unity/Java Steering game

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

bay07 2024. 3. 20. 10:39

1. 대략적인 그림 살펴보기 

일단 폴더를 보면 src > engine > Car.java 파일이다. 


2. package와 class 살펴보기 

package engine;

import controllers.Controller;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
   
package engine; 현재 파일은  engine 패키지에 속한다
import controllers.Controller; 게임 객체를 제어하기 위한 인터페이스 제공
(위에서 만든 파일)
import java.awt.Graphics2D; 그래픽 객체를 그리는데 사용되는  클래스
import java.awt.image.BufferedImage; 이미지 처리 , 메모리 내 이미지를 나타냄
import java.io.File; 파일 및 디렉토리 경로를 나타냄 
import javax.imageio.ImageIO; 이미지를 파일로 읽거나 쓰는데 사용 

 


3. 변수 살펴보기 

   
Controller m_controller 자동차의 움직임, 동작 결정
ex) 입력을 받으면 해당 방향으로 자동차를 이동시키는 것
BufferedImage m_img 자동차의 그래픽 이미지를 저장
double m_alpha 회전 각도
double m_speed 현재 속도
double m_max_velocity 최대 속도
double m_min_velocity 최소 속도 
RotatedRectangle m_collision_box 자동차의 충돌박스를 나타냄 

 

변수 이름을 잘 짓는 것도 정말 중요 ! 


 

▷ 전체코드 

더보기
package engine;

import controllers.Controller;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;

/**
 *
 * @author santi
 */
public class Car extends GameObject {
    Controller m_controller;
    BufferedImage m_img;
    
    // physics:
    double m_alpha;     // rotation
    double m_speed;
    double m_max_velocity = 250;
    double m_min_velocity = -100;
    RotatedRectangle m_collision_box;
        
    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);
    }
    
    public double getAngle() {
        return m_alpha;
    }
    
    public double getSpeed() {
        return m_speed;
    }
    
    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;
        }
    }

    public void draw(Graphics2D g) {
        Graphics2D gg = (Graphics2D) g.create();
        gg.translate(m_x, m_y);
        gg.rotate(m_alpha);
        gg.translate(-m_img.getWidth()/2,-m_img.getHeight()/2);
        gg.drawImage(m_img, 0, 0, null);
        gg.dispose();        
    }
    
    public RotatedRectangle getCollisionBox() {
        return m_collision_box;
    }
    
}