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 클래스 활용)
'Team Project > Strikers 1945 GUI Project' 카테고리의 다른 글
[개발 일지] Strikers 1945 게임 구현 프로젝트 5일차 (02/27) ~ 종료 (1) | 2023.03.01 |
---|---|
[개발 일지] Strikers 1945 게임 구현 프로젝트 3일차 (02/25) (0) | 2023.02.26 |
[개발 일지] Strikers 1945 게임 구현 프로젝트 2일차 (02/24) (0) | 2023.02.25 |
[개발 일지] Strikers 1945 게임 구현 프로젝트 1일차 (02/23) (0) | 2023.02.24 |
[개발 일지] Strikers 1945 게임 구현 프로젝트 0일차 (02/22) (0) | 2023.02.23 |