public void run() {
while (true) {
try {
double degree = Math.atan2(player.getY()+player.getHeight()/2-enemy.getY()+enemy.getHeight()/2,player.getX()+player.getWidth()/2-enemy.getX()+enemy.getWidth()/2)*(180/Math.PI);
int x = (int)(Math.cos(degree)*2);
int y = (int)(Math.sin(degree)*2);
enemy.setLocation(enemy.getX()+x,enemy.getY()+y);
move();
Thread.sleep(10);
} catch (InterruptedException e) {
return;
}
}
}
while (true) {
try {
double degree = Math.atan2(player.getY()+player.getHeight()/2-enemy.getY()+enemy.getHeight()/2,player.getX()+player.getWidth()/2-enemy.getX()+enemy.getWidth()/2)*(180/Math.PI);
int x = (int)(Math.cos(degree)*2);
int y = (int)(Math.sin(degree)*2);
enemy.setLocation(enemy.getX()+x,enemy.getY()+y);
move();
Thread.sleep(10);
} catch (InterruptedException e) {
return;
}
}
}
enemy가 player의 위치로 서서히 따라오게 만들고 싶은데 끝까지 따라오지도 않고 player가 움직이면 enemy는 자꾸 우왕좌왕하구...
위코드 틀린거 있는가좀 봐줘ㅠㅠ
1. 플레이어 좌표와 적 좌표를 x, y 성분에 대해 뺄때 괄호를 쳐서 빼야지. 부호를 뒤집어주던가
2. Java 의 Math 함수는 확실히 모르겠다만 Degree 가 아니라 Radian 단위일껄? 180 / Math.PI 를 곱해주는걸 없애야 맞을꺼다
3. 적의 추적 속도를 2로 잡은 모양인데, 그걸 정수에다 집어넣으면 버려져서 아마 방향에 따라 이동속도가 달라보일거다. 양수와 음수간의 문제도 존재하고. 애초에 플레이어의 x, y 좌표와 적의 x, y 좌표를 double 로 할 것을 추천한다. 그릴때만 픽셀 좌표로 반올림이나 버림해 그리든지
덧붙여 개고생하기 싫으면, setLocation(targetX, targetY) 함수와 moveBy(dx, dy) 함수를 구분해서 짜두도록. 위의 코드에서 moveBy(x, y) 만 전달하면 원래의 각 캐릭터 좌표에 더해지게 말이야. 각 캐릭터의 중심을 구하는 getCenter() 함수도 만들어주든지.
허걱감사감사 ㅠㅠ
플레이어가 특정방향으로 움직일때 자꾸 적이 제자리에서 갈피를못잡는데 이건 뭐가 문제인거에요?
아마 radian (-3.14159265358979 ~ 3.14....) 범위를 바라는데 degree (-180~180) 범위의 값을 받으니 비행기 계기판이 뱅글뱅글 도는 상태처럼 보이겠지 ㅡㅡㅋㅋ
라디안빼니깐 되네요 정말감사합니다 ㅠㅠ 도움많이됐어요
1번도 해야해 너 중심좌표 계산 잘못했어. 그리고 좌우 방향에 대한 속도차가 존재할거다. 버림쪽이 빠르니 왼쪽으로 갈때 더 빠르겠지
왼쪽과 위로 갈때 빠르고 오른쪽과 아래로 갈때 느려지는 코드가 싫으면 걍 double 좌표로 다 바꿔.
double degree = Math.atan2((player.getY()+player.getHeight()/2)-(enemy.getY()+enemy.getHeight()/2),(player.getX()+player.getWidth()/2)-(enemy.getX()+enemy.getWidth()/2));double x = Math.cos(degree)*2; double y = Math.sin(degree)*2; enemy.setLocation((int)(enemy.getX()+x),(int)(enemy.getY()+y));
이렇게했는데 속도차가나여
이제 degree 라는 변수명 좀 radian 으로 바꾸지? ㅡㅡㅋㅋ
내가 말했잖아. setLocation 이 int 를 받고 있고 좌표가 int 라 그모양인거. double 로 다 바꾸라고.
setLocation 에서 실제 저장할 객체의 x, y 좌표도 double 이어야 해.
당연히 getX, getY 함수도 double 을 리턴해야하고
setLocation에서 double이 안받아져요.. .getX,getY함수가 double을 리턴해야된다는것도 모르겠어요..ㅠㅠ
player, energy 객체의 클래스 소스 있지 않음? 바꾸면 되잖아.
JLabel enemy = new JLabel(); 이런식으로 생성했는데 class enemy extends JLabel 이렇게 만들어서하란건가요? 도무지 감이 안잡혀요,,,
아하, 라벨로 만들었구나. 응 그말 맞아 상속받아서, 좌표 속성을 double 로 갖고 있다가 값 변경될때만 부모의 x, y 에 바꿔주는걸로
그럼 그냥 enemy.setLocation(enemy.getX()+(int)x,enemy.getY()+(int)y); 이렇게 해도 되지않나요?
아,, getX()getY()로 그때그때받아서 쓰면안되겠구나... double로 계속 더해주면서 좌표값을 갖고있어야되네