2014-07-23 1 views
0

에 팩맨을 moivng 각 방향에 대해 서로 다른, 그리고별로 그리기 (반 폐쇄, 입을 열고 폐쇄 전체) :에 애니메이션에서 문제가 발생하고 난 팩맨 이미지의 스트립 사용하고 애니메이션의 경우 자바

frame = 0; 

public void paintComponent(Graphics g) { 
    super.paintComponent(g);  
    g.drawImage(PacRIGHT.getSubimage(frame, 0, 28, 28), x, y, null); 
} 

에 우리는 모든 위해 그릴 4 개의 화상 스트립이 여기

frame = 0*30 ; 
frame = 1*30 ; 
frame = 2*30 ; 

하고 : 같이 우측 30 개 화소 이동 30 * 할 팩맨 애니메이션 프레임이고> = 60 1 개 애니메이션 사이클을 완료하기 위해, 그 것 방향, 첫 번째 문제는 내가 그것을 할 방법을 알아낼뿐만 아니라 또한 그것을 이동할 수없는, 그녀를 직면하고있어 지금 내가지고있어 중고 스윙 타이머가이 시간 코드가 업데이트되어, 지금은 이동 한 팩맨과 오른쪽 방향 enter image description here 문제의 애니메이션 입이되어 여러 오류 : 전자 코드를


업데이트입니다.

import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.JPanel; import javax.swing.Timer; public class Runtest extends JPanel implements ActionListener, KeyListener { Timer t = new Timer(4, this); int x, y, velocx, velocy = 0; int keyCode; int frame = 0; BufferedImage PacUP; BufferedImage PacDOWN; BufferedImage PacLEFT; BufferedImage PacRIGHT; public Runtest() throws IOException { t.start(); addKeyListener(this); setFocusable(true); PacRIGHT = ImageIO.read(new File("E:\\javapacman\\newright.png")); } public int frame() { frame++; if (frame > 3) frame = 0; return frame; } public void paintComponent(Graphics g) { super.paintComponent(g); g.drawImage(PacRIGHT.getSubimage(frame() * 30, 0, 28, 28), x, y, null); // Graphics2D g2 = (Graphics2D) g ; // g2.fill(new Ellipse2D.Double(x,y,40,40)); } public void actionPerformed(ActionEvent ae) { repaint(); x += velocx; y += velocy; } public void up() { velocy = -1; velocx = 0; } public void down() { velocy = 1; velocx = 0; } public void left() { velocx = -1; velocy = 0; } public void right() { velocx = 1; velocy = 0; } @Override public void keyPressed(KeyEvent ke) { keyCode = ke.getKeyCode(); if (keyCode == KeyEvent.VK_UP) { up(); } if (keyCode == KeyEvent.VK_DOWN) { down(); } if (keyCode == KeyEvent.VK_LEFT) { left(); } if (keyCode == KeyEvent.VK_RIGHT) { right(); } } } 

그리고 메인 클래스 :

public class PacMan { 
    public static void main(String[] args) throws IOException { 
     JFrame frame = new JFrame("Test"); 
     Runtest test = new Runtest(); 
     frame.setSize(400, 400); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(test); 
     frame.setVisible(true); 
    } 
}  

오류 난 내가 당신이라면 나는 움직임과 애니메이션을 분리하는 것,

Exception in thread "AWT-EventQueue-0" java.lang.UnsupportedOperationException:  Not supported yet. 
at pactest.Runtest.keyReleased(Runtest.java:128) 
at java.awt.Component.processKeyEvent(Component.java:6466) 
at javax.swing.JComponent.processKeyEvent(JComponent.java:2828) 
at java.awt.Component.processEvent(Component.java:6282) 
at java.awt.Container.processEvent(Container.java:2229) 
at java.awt.Component.dispatchEventImpl(Component.java:4861) 
at java.awt.Container.dispatchEventImpl(Container.java:2287) 
at java.awt.Component.dispatchEvent(Component.java:4687) 
at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1895) 
at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:762) 
at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:1027) 
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:899) 
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:727) 
at java.awt.Component.dispatchEventImpl(Component.java:4731) 
at java.awt.Container.dispatchEventImpl(Container.java:2287) 
at java.awt.Window.dispatchEventImpl(Window.java:2719) 
at java.awt.Component.dispatchEvent(Component.java:4687) 
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:735) 
at java.awt.EventQueue.access$200(EventQueue.java:103) 
at java.awt.EventQueue$3.run(EventQueue.java:694) 
at java.awt.EventQueue$3.run(EventQueue.java:692) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87) 
at java.awt.EventQueue$4.run(EventQueue.java:708) 
at java.awt.EventQueue$4.run(EventQueue.java:706) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
at java.awt.EventQueue.dispatchEvent(EventQueue.java:705) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242) 
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138) 
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91) 
+2

시작하려면 운동 및 애니메이션을 분리하고 1 이미지로 시작하여 운동을 시작하십시오. 그 후 이미지 전환 문제에 접근합니다. –

+0

나의 첫 번째 초점은 또한 이미지를 먼저 움직이고 그리는 방법을 찾아 냈지만 움직이지 않았다면 다른 접근 방식을 시도했지만 실패했습니다. – AMATURE

+0

팩맨을 움직이기 위해 무언가가 필요합니다. 현재 actionPerformed에 뭔가가 있지만 그게 어떻게 불려지는지 나는 모른다. 나는 게임 루프에 대해 잠시 후에 질문을 던졌다. http://stackoverflow.com/questions/16364487/java-rendering-loop-and-logic-loop/16364639#16364639 아마이 코드를 가지고 뭔가를 할 수있다. –

답변

0

첫째을 얻고있다. 한 세트의 이미지로 먼저 운동을 시작하십시오.

무브먼트 :
속도 매개 변수를 변경하는 주요 이벤트에 대해서는이 것이 좋습니다. 위치 변수로 MyPanelxy 변수를 사용하고있는 것으로 보입니다. 이들을 생성자 또는 인스턴스 변수 선언의 어딘가에 초기 값으로 설정해야합니다.

당신은 속도 변수로 xy 변수를 수정하는 방법에 대한 올바른 생각을 가지고 있지만 actionPerformed 방법으로 그 일을하고 있습니다. 그것은 당신이 원하는 것이 아닙니다. 사용자 입력이 아닌 시간에 따라 위치 변수를 업데이트해야합니다. 게임 루프를 @ug_ 언급 한대로 조사해야합니다. 게임 루프는 기본적으로 게임에서 계속 실행되는 루프입니다. 입력을 확인하고 게임 정보를 업데이트하며 변경 내용을 렌더링합니다. 게임 루프에서 위치 변수를 업데이트해야합니다. 화면에 변경 사항이 반영되도록 위치 변수를 수정 한 후 repaint으로 전화하십시오. 올바르게 위치 변수를 업데이트되면

는, 당신은 g.drawImage를 호출 할 때 당신의 paintComponent 방법에 위치 매개 변수로 그 xy 변수를 사용해야합니다. 이렇게하면 xy을 추적하는 위치에서 이미지의 위치가 그려집니다.

애니메이션 :
일단 움직임이 작동하면 이미지 전환을 파악해야합니다. 이에 대한 제안은 g.drawImage 호출에서 사용하는 curImage의 인스턴스 변수를 갖게됩니다. 그런 다음 "게임 루프"를 사용하여 3 개의 이미지를 순환하여 curImage으로 설정할 이미지를 선택하십시오.이것은 시간을 기준으로하므로 예를 들어 매 1/2 초마다 이미지를 컬렉션의 다음 이미지로 변경할 수 있습니다. 컬렉션의 끝 부분에 도달하면 컬렉션을 통해 역순으로 이동합니다. 순서는 다음과 같습니다 : open, half, close, half, open, half, etc... 처음에 0으로 설정된 인덱스 카운터를 사용하면 쉽게이 작업을 수행 할 수 있습니다. 이미지가 선택 될 때마다 증가되고 컬렉션의 최종 이미지에 도달 할 때 감소되며 시작시 다시 프로세스가 반복됩니다.

또한 각 방향에 대해 이미지 집합이 다르다고 언급했습니다. 게임 루프에서 속도 매개 변수를 확인하여 어느 방향으로 이동했는지 확인할 수 있습니다. 이 정보는 이미지를 가져올 이미지 컬렉션을 알려줍니다. 그런 다음 색인 카운터를 사용하여 해당 컬렉션에서 올바른 이미지를 얻을 수 있습니다.

+0

xx 밀리 초마다 게임 상태를 업데이트하는 메서드를 호출하는 javax.swing.Timer를 사용할 수 있습니까? – AMATURE

+0

@AMATURE 여러 가지 방법으로 작업을 수행 할 수 있으므로 작업 할 수 있습니다. –

+0

@AMATURE 지금 가지고있는 문제는 완전히 다른 문제입니다. 원래의 질문/문제에 답을 얻었습니다. 원래 질문을 편집하면 안됩니다. 새 질문을 만들어야합니다. 내 대답이 원래 문제를 해결했다면 받아 들여서 질문이 공개되지 않도록하십시오. –

관련 문제