본문 바로가기
Team Project/Strikers 1945 GUI Project

[개발 일지] Strikers 1945 게임 구현 프로젝트 4일차 (02/26)

by 스응 2023. 2. 27.
728x90
728x90

4일차의 목표

  - 생성된 적군들을 메인 프레임의 리스트에 추가하는 방식으로 관리

  - 다른 클래스들도 그에 호환되도록 코드 전부 수정

 

4일차에 구현한 것

1. 메인 프레임의 멤버 변수 추가

 

ArrayList<Enemy> enemyList = new ArrayList<>();

// 아이템도 적군이 생성될 때마다 생성되므로 똑같이 리스트로 정의해둠
ArrayList<Item> itemList = new ArrayList<>();

 

2. Enemy 객체들이 각각 자신이 enemyList에 생성된 순서 인덱스를 멤버 변수로 갖도록 함

 

// 부모 클래스의 멤버 변수
protected static int enemyCount; // 생성된 적군의 총 숫자
protected int myIndex // 자신이 생성된 순서

 

// 자식 클래스의 생성자
public EnemyUnit4(AirplaneFrame mContext) {
    super(mContext);
    this.mContext = mContext;
    initData();
    setInitLayout();

    myIndex = enemyCount;
    enemyCount++;
}

 

      - 다른 클래스에서 Enemy 각각에 접근할 수 있도록 하기 위함

      - 부모 클래스의 static 변수의 값은 자식 클래스도 똑같이 공유한다는 것을 이용함

 

3. 다른 클래스들 전부 해당 방식에 호환되도록 코드 수정

 

// 적군 총알 클래스의 생성자
public EnemyBullet(AirplaneFrame mContext, int targetEnemyIndex) {
    this.mContext = mContext;
    this.targetEnemy = this.mContext.getEnemyList().get(targetEnemyIndex);
    initData();
    setInitLayout();
    initThread();
}

 

// 유닛4 배열을 소환하는 메서드
public void unit4ArrayMove() {
    // 적군 객체를 담기 전에 지금 리스트의 사이즈를 확인함
    // (사이즈 == 0이면 인덱스 0번부터 객체가 추가될 것이고, 사이즈 == 1이면 인덱스 1번부터 객체가 추가될 것임)
    int index1 = enemyList.size();

    // 소환할 객체 수 지정
    int enemyCount = 4;
    int index2 = index1 + (enemyCount - 1);

    Random random = new Random();
    // 첫 객체의 위치 왼쪽 OR 오른쪽 랜덤
    int num = random.nextInt(2);
    int initX;

    if (num == 0) {
        initX = 50;
    } else {
        initX = 550;
    }

    // x 위치를 배열 값으로 지정해두기
    int[] intArrX = { initX, initX += 80, initX += 80, initX += 80 };

    for (int i = index1; i <= index2; i++) {
        // 인스턴스화 및 리스트에 추가
        enemyList.add(new EnemyUnit4(mContext));

        // 알아보기 쉽게 변수로 선언
        Enemy targetEnemy = enemyList.get(i);

        // x 값 세팅
        targetEnemy.setX(intArrX[i]);

        // y 값 세팅 (모두 동일하게)
        targetEnemy.setY(80);

        // 위치 시키기
        targetEnemy.setLocation(targetEnemy.getX(), targetEnemy.getY());

        // 추가
        mContext.add(targetEnemy);

        // 백그라운드 서비스 적용
        new Thread(new BackgroundEnemyService(targetEnemy)).start();
        targetEnemy.attack(targetEnemy.getAttackSpeed());

    }

    // 아래로만 움직임
    for (int i = index1; i <= index2; i++) {
        enemyList.get(i).down(enemyList.get(i).getSpeed());

    }
}

 

 

4. 유닛별 아이템 드랍 위치 조정

 

5. 유닛별 총알을 맞았다고 판단하는 범위 재조정 (y값이 이상했음)

 

6. 총알을 쏘고 앞에 있는 적군이 맞았을 때, 일직선에 있는 다른 적군들도 같이 죽어버리는 문제 발견

  - 총알을 맞으면 총알이 아예 사라지는 게 아니라 아이콘만 사라진 것이기 때문임

  - 해결

     : 총알이 맞으면 Bullet 클래스의 state를 1로 바꾸고, 총알이 맞지 않은 상태(state == 0)일 때에만 crash되도록 함

  - 이 문제를 고치고 나니 유닛 생명력(hp)도 구현할 수 있었음

 

 

7. 유닛별 공격속도 추가

  - 단순히 Attack() 메서드의 매개변수에 attackSpeed를 받고, Thread.sleep(attackSpeed);해서 구현

  - 유닛별로 다양한 공격 패턴을 구현해볼 예정 (연사하고 몇 초 쉬고 이런 식으로)

 

 

8. 점수판 추가

  - 적군은 up() 메서드를 사용하지 않고 아래로 내려가면 그냥 사라지는 방식으로 바꾸면서,

    적을 해치웠을 때 점수를 획득해서 제한 시간 동안 생존하면서 높은 점수를 얻는 것을 목표로 바꿈

 

 

 

내일 할 것

  - 적군 충돌 범위 보정 값 재조정 (Unit3 빼고는 이상함)

  - 공격 패턴 구현

  - 적군 소환 흐름 구현 (Timer 클래스 활용)

320x100
반응형

댓글