2013-08-07 5 views
6

애플릿 창에서 가시적 인 이미지를 대각선으로 이동시키는 방법을 알아 내려고 노력해 왔습니다.보이는 이미지를 대각선으로 이동하는 방법은 무엇입니까?

위, 아래, 왼쪽 또는 오른쪽을 누르면 이미지 (GIF)가 따라 움직이지만 한 번에 두 개의 키 (예 : 동시에 위아래)를 누르면 이미지가 움직입니다 두 번째 누른 방향 (키를 동시에 눌러도 미세한 지연이 있음).

이 문제를 해결할 수있는 간단한 방법이 있을지 모르겠습니다. 누군가가 알아 낸 해결 방법 일 수도 있습니다. 도움이나 조언을 주시면 감사하겠습니다.

감사의

영웅 클래스 (이 클래스는 "영웅"이 무엇인지 정의하고,이 경우 간단한 픽셀 남자, 그가 할 수있는 일)

import objectdraw.*; 
import java.awt.*; 

public class Hero extends ActiveObject { 

private DrawingCanvas canvas; 
private VisibleImage player; 

public Hero(Location initLocation, Image playerPic, DrawingCanvas aCanvas) { 
canvas = aCanvas; 

player = new VisibleImage(playerPic, canvas.getWidth()/3, 
     canvas.getWidth()/3, canvas); 
start(); 

} 
public void run() 
{ 

} 

public void move(double dx, double dy) 
{ 
player.move(dx, dy); 
} 
} 

HeroGame 클래스 (이 클래스 은 "영웅"을 작성하고 위치뿐만 아니라, 키를 만드는 데 사용되는 것을 그를 이동)

import objectdraw.*; 
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class HeroGame extends WindowController implements KeyListener { 
private Hero theHero; 
private Image playerPic; 
private Location initLocation; 
public void begin() { 
    playerPic = getImage("player.gif"); 
    canvas.addKeyListener (this); 
    this.addKeyListener (this); 
    requestFocusInWindow(); 
    theHero = new Hero(initLocation, playerPic, canvas); 
    } 
public void keyTyped(KeyEvent e) { } 
public void keyReleased(KeyEvent e) { } 
public void keyPressed(KeyEvent e) { 

    if (e.getKeyCode() == KeyEvent.VK_UP) { 
     theHero.move(0,-5); 
    } 
    else if (e.getKeyCode() == KeyEvent.VK_DOWN) { 
     theHero.move(0,5); 
    } 
    else if (e.getKeyCode() == KeyEvent.VK_LEFT) { 
     theHero.move(-5,0); 
    } 
    else if (e.getKeyCode() == KeyEvent.VK_RIGHT) { 
     theHero.move(5,0); 
    } 
    } 
} 

감사합니다 - 당신이 한 번 더이 글을 읽을 희망 도움이되는 시간을내어을 지정합니다.

답변

0

이것은 키보드 입력을 허용하는 게임에서 다소 일반적인 상황이다. 문제는 게임이 관련되어있는 한 에 현재 수행중인 모든 키 (즉, KEY_RELEASE 이벤트가 아직 시작되지 않은 모든 키를 의미)를 수행해야한다는 것입니다.

KeyListener는 마지막으로 누른 키를 알려줍니다 (당신이 그것을 누르면 누른 경우 같은 키를 알리는 계속됩니다) 그래서 당신은 키 자신의 나머지 부분에 대한 상태를 추적 할 필요가있다.

키보드 폴링 ( here an example)는 플레이어의 입력에 즉시 행동이 아니라 큐 이후 여론 조사에서 키 입력을 저장하지 않는 대중적인 기술을 검색하는 작업을 수행하는 방법에 대한 아이디어를 얻으려면 그 일정한 간격으로 (즉, 게임 루프에서) 대기열을 눌러 어떤 키가 눌려 졌는지 결정하고 그에 따라 행동하십시오.

도움이 되길 바랍니다.

3

저는 스윙 (JApplet)과 키 바인딩을 사용할 것을 제안합니다. 동시에 여러 키를 처리하는 솔루션과 함께 KeyListener를 사용하는 데 문제가 있으면 Motion Using the Keyboard을 참조하십시오.

+0

감사합니다. 감사합니다. 내가 무엇인지 알게되면 나는 그것을 반드시 게시 할 것입니다. – Greywarden

2

변화

if (e.getKeyCode() == KeyEvent.VK_UP) { 
    theHero.move(0,-5); 
} 
else if (e.getKeyCode() == KeyEvent.VK_DOWN) { 
    theHero.move(0,5); 
} 
else if (e.getKeyCode() == KeyEvent.VK_LEFT) { 
    theHero.move(-5,0); 
} 
else if (e.getKeyCode() == KeyEvent.VK_RIGHT) { 
    theHero.move(5,0); 
} 

if (e.getKeyCode() == KeyEvent.VK_UP) { 
    theHero.move(0,-5); 
} 
if (e.getKeyCode() == KeyEvent.VK_DOWN) { 
    theHero.move(0,5); 
} 
if (e.getKeyCode() == KeyEvent.VK_LEFT) { 
    theHero.move(-5,0); 
} 
if (e.getKeyCode() == KeyEvent.VK_RIGHT) { 
    theHero.move(5,0); 
} 

에 그리고 두 키에 반응한다.

+0

렌더링 코드를 보지 않고도 제대로 작동하는지 확신 할 수 없습니다. 사용자가 히트하고 왼쪽으로 이동하면 문자 이동 델타는 여전히 -5,0 – MadProgrammer

+0

입니다. 감사합니다. 그러나 변경 사항을 적용한 후에도 결과는 그대로 유지되지만 제안 사항은 나에게 의미가 있습니다. – Greywarden

+0

'theHero.move (0,5);'는 여러 번 호출 할 수 있습니까? 마찬가지로, 플레이어가 움직이는 경우, theHero에 대한 move() 메소드를 두 번째로 호출 할 수 있습니까? – bas

0

당신이해야 할 일은 이미지의 기본 AffineTransform 클래스에 액세스하고 올바른 번역 방법을 설정하는 것입니다. 이렇게하면 키를 한 번 누르면 (해당 전화에 바인딩하는) 어쨌든 (각도에 관계없이 모든 방향으로) 이미지를 이동할 수 있습니다. 이에

읽기 대신 키에 대한 if-elsehttp://docs.oracle.com/javase/7/docs/api/java/awt/geom/AffineTransform.html

+0

로테이션과는 별도로, 나는 확실히 아는 바가 없다. 어필 트란 폼 (AffineTranform)이 어떻게 도움이 될지 모르겠다. Graphics # drawInage의 문제점과 서로 위에 이미지 단순 오버레이가 있습니까? – MadProgrammer

+0

. AffineTransform에서 .translate() 메소드? –

+0

OP 문제를 해결하는 방법에 대해 아직 확실하지 않습니다. P – MadProgrammer

1

, 당신은 if 일련의 명령문을 사용한다. 대신이 if 문에서 xy 운동 모두에 대해 hero의 방향을 설정

만 ... (매우 간체) 예를 들어 적절한 delta

를 업데이트해야

if (up) yDelta = -5; 
if (down) yDelta = 5; 
if (left) xDelta = -5; 
if (right) xDelta = 5; 

hero.move(xDelta, yDelta); 

나는 또한 camickr에 동의한다