如何在Java中收听按键时进行图像移动。

如何在Java中收听按键时进行图像移动。

我开始学习java编程,我认为通过游戏开发来学习java是很酷的。我知道如何画图像,听按键,然后移动图像。但是,是否有可能使图像来回移动到窗口,而窗口正在听按键?例如,当图像或物体(如宇宙飞船)在窗口向左向右移动时,如果我按空格键,激光就会在屏幕底部发射(酷哈:d)。但基本上,我只是想知道如何使图像左向右移动,而窗口正在听按键。

我想我将在窗口中添加一个关键侦听器,然后触发一个无限循环来移动图像。还是我需要学习线程处理,以便让另一个线程移动对象?

请指点。

非常感谢。


明月笑刀无情
浏览 767回答 3
3回答

慕雪6442864

是的,摆动计时器和键绑定会很好。下面是另一个示例(我的例子):)import&nbsp;java.awt.*;import&nbsp;java.awt.event.*;import&nbsp;java.awt.image.BufferedImage;import&nbsp;javax.swing.*;public&nbsp;class&nbsp;AnimationWithKeyBinding&nbsp;{ &nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;void&nbsp;createAndShowUI()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AnimationPanel&nbsp;panel&nbsp;=&nbsp;new&nbsp;AnimationPanel();&nbsp;//&nbsp;the&nbsp;drawing&nbsp;JPanel &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JFrame&nbsp;frame&nbsp;=&nbsp;new&nbsp;JFrame("Animation&nbsp;With&nbsp;Key&nbsp;Binding"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;frame.getContentPane().add(panel); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;frame.pack(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;frame.setLocationRelativeTo(null); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;frame.setVisible(true); &nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;java.awt.EventQueue.invokeLater(new&nbsp;Runnable()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;run()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;createAndShowUI(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}); &nbsp;&nbsp;&nbsp;}}@SuppressWarnings("serial")class&nbsp;AnimationPanel&nbsp;extends&nbsp;JPanel&nbsp;{ &nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;final&nbsp;int&nbsp;SPRITE_WIDTH&nbsp;=&nbsp;20; &nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;final&nbsp;int&nbsp;PANEL_WIDTH&nbsp;=&nbsp;400; &nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;final&nbsp;int&nbsp;PANEL_HEIGHT&nbsp;=&nbsp;400; &nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;final&nbsp;int&nbsp;MAX_MSTATE&nbsp;=&nbsp;25; &nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;final&nbsp;int&nbsp;SPIN_TIMER_PERIOD&nbsp;=&nbsp;16; &nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;final&nbsp;int&nbsp;SPRITE_STEP&nbsp;=&nbsp;3; &nbsp;&nbsp;&nbsp;private&nbsp;int&nbsp;mState&nbsp;=&nbsp;0; &nbsp;&nbsp;&nbsp;private&nbsp;int&nbsp;mX&nbsp;=&nbsp;(PANEL_WIDTH&nbsp;-&nbsp;SPRITE_WIDTH)&nbsp;/&nbsp;2; &nbsp;&nbsp;&nbsp;private&nbsp;int&nbsp;mY&nbsp;=&nbsp;(PANEL_HEIGHT&nbsp;-&nbsp;SPRITE_WIDTH)&nbsp;/&nbsp;2; &nbsp;&nbsp;&nbsp;private&nbsp;int&nbsp;oldMX&nbsp;=&nbsp;mX; &nbsp;&nbsp;&nbsp;private&nbsp;int&nbsp;oldMY&nbsp;=&nbsp;mY; &nbsp;&nbsp;&nbsp;private&nbsp;boolean&nbsp;moved&nbsp;=&nbsp;false; &nbsp;&nbsp;&nbsp;//&nbsp;an&nbsp;array&nbsp;of&nbsp;sprite&nbsp;images&nbsp;that&nbsp;are&nbsp;drawn&nbsp;sequentially &nbsp;&nbsp;&nbsp;private&nbsp;BufferedImage[]&nbsp;spriteImages&nbsp;=&nbsp;new&nbsp;BufferedImage[MAX_MSTATE]; &nbsp;&nbsp;&nbsp;public&nbsp;AnimationPanel()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;create&nbsp;and&nbsp;start&nbsp;the&nbsp;main&nbsp;animation&nbsp;timer &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;Timer(SPIN_TIMER_PERIOD,&nbsp;new&nbsp;SpinTimerListener()).start(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setPreferredSize(new&nbsp;Dimension(PANEL_WIDTH,&nbsp;PANEL_HEIGHT)); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setBackground(Color.white); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;createSprites();&nbsp;//&nbsp;create&nbsp;the&nbsp;images &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setupKeyBinding(); &nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;private&nbsp;void&nbsp;setupKeyBinding()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;condition&nbsp;=&nbsp;JComponent.WHEN_IN_FOCUSED_WINDOW; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputMap&nbsp;inMap&nbsp;=&nbsp;getInputMap(condition); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ActionMap&nbsp;actMap&nbsp;=&nbsp;getActionMap(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;this&nbsp;uses&nbsp;an&nbsp;enum&nbsp;of&nbsp;Direction&nbsp;that&nbsp;holds&nbsp;ints&nbsp;for&nbsp;the&nbsp;arrow&nbsp;keys &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(Direction&nbsp;direction&nbsp;:&nbsp;Direction.values())&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;key&nbsp;=&nbsp;direction.getKey(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;name&nbsp;=&nbsp;direction.name(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;add&nbsp;the&nbsp;key&nbsp;bindings&nbsp;for&nbsp;arrow&nbsp;key&nbsp;and&nbsp;shift-arrow&nbsp;key &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inMap.put(KeyStroke.getKeyStroke(key,&nbsp;0),&nbsp;name); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inMap.put(KeyStroke.getKeyStroke(key,&nbsp;InputEvent.SHIFT_DOWN_MASK),&nbsp;name); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;actMap.put(name,&nbsp;new&nbsp;MyKeyAction(this,&nbsp;direction)); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;//&nbsp;create&nbsp;a&nbsp;bunch&nbsp;of&nbsp;buffered&nbsp;images&nbsp;and&nbsp;place&nbsp;into&nbsp;an&nbsp;array, &nbsp;&nbsp;&nbsp;//&nbsp;to&nbsp;be&nbsp;displayed&nbsp;sequentially &nbsp;&nbsp;&nbsp;private&nbsp;void&nbsp;createSprites()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;spriteImages.length;&nbsp;i++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spriteImages[i]&nbsp;=&nbsp;new&nbsp;BufferedImage(SPRITE_WIDTH,&nbsp;SPRITE_WIDTH, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedImage.TYPE_INT_ARGB); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Graphics2D&nbsp;g2&nbsp;=&nbsp;spriteImages[i].createGraphics(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g2.setColor(Color.red); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,&nbsp;RenderingHints.VALUE_ANTIALIAS_ON); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;double&nbsp;theta&nbsp;=&nbsp;i&nbsp;*&nbsp;Math.PI&nbsp;/&nbsp;(2&nbsp;*&nbsp;spriteImages.length); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;double&nbsp;x&nbsp;=&nbsp;SPRITE_WIDTH&nbsp;*&nbsp;Math.abs(Math.cos(theta))&nbsp;/&nbsp;2.0; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;double&nbsp;y&nbsp;=&nbsp;SPRITE_WIDTH&nbsp;*&nbsp;Math.abs(Math.sin(theta))&nbsp;/&nbsp;2.0; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;x1&nbsp;=&nbsp;(int)&nbsp;((SPRITE_WIDTH&nbsp;/&nbsp;2.0)&nbsp;-&nbsp;x); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;y1&nbsp;=&nbsp;(int)&nbsp;((SPRITE_WIDTH&nbsp;/&nbsp;2.0)&nbsp;-&nbsp;y); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;x2&nbsp;=&nbsp;(int)&nbsp;((SPRITE_WIDTH&nbsp;/&nbsp;2.0)&nbsp;+&nbsp;x); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;y2&nbsp;=&nbsp;(int)&nbsp;((SPRITE_WIDTH&nbsp;/&nbsp;2.0)&nbsp;+&nbsp;y); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g2.drawLine(x1,&nbsp;y1,&nbsp;x2,&nbsp;y2); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g2.drawLine(y1,&nbsp;x2,&nbsp;y2,&nbsp;x1); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g2.dispose(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;protected&nbsp;void&nbsp;paintComponent(Graphics&nbsp;g)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super.paintComponent(g); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g.drawImage(spriteImages[mState],&nbsp;mX,&nbsp;mY,&nbsp;null); &nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;incrementX(boolean&nbsp;right)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oldMX&nbsp;=&nbsp;mX; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(right)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mX&nbsp;=&nbsp;Math.min(getWidth()&nbsp;-&nbsp;SPRITE_WIDTH,&nbsp;mX&nbsp;+&nbsp;SPRITE_STEP); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mX&nbsp;=&nbsp;Math.max(0,&nbsp;mX&nbsp;-&nbsp;SPRITE_STEP); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;moved&nbsp;=&nbsp;true; &nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;incrementY(boolean&nbsp;down)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oldMY&nbsp;=&nbsp;mY; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(down)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mY&nbsp;=&nbsp;Math.min(getHeight()&nbsp;-&nbsp;SPRITE_WIDTH,&nbsp;mY&nbsp;+&nbsp;SPRITE_STEP); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mY&nbsp;=&nbsp;Math.max(0,&nbsp;mY&nbsp;-&nbsp;SPRITE_STEP); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;moved&nbsp;=&nbsp;true; &nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;tick()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mState&nbsp;=&nbsp;(mState&nbsp;+&nbsp;1)&nbsp;%&nbsp;MAX_MSTATE; &nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;private&nbsp;class&nbsp;SpinTimerListener&nbsp;implements&nbsp;ActionListener&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;actionPerformed(ActionEvent&nbsp;e)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tick(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;delta&nbsp;=&nbsp;20; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;width&nbsp;=&nbsp;SPRITE_WIDTH&nbsp;+&nbsp;2&nbsp;*&nbsp;delta; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;height&nbsp;=&nbsp;width; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;make&nbsp;sure&nbsp;to&nbsp;erase&nbsp;the&nbsp;old&nbsp;image &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(moved)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;x&nbsp;=&nbsp;oldMX&nbsp;-&nbsp;delta; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;y&nbsp;=&nbsp;oldMY&nbsp;-&nbsp;delta; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;repaint(x,&nbsp;y,&nbsp;width,&nbsp;height); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;x&nbsp;=&nbsp;mX&nbsp;-&nbsp;delta; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;y&nbsp;=&nbsp;mY&nbsp;-&nbsp;delta; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;draw&nbsp;the&nbsp;new&nbsp;image &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;repaint(x,&nbsp;y,&nbsp;width,&nbsp;height); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;moved&nbsp;=&nbsp;false; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;}}enum&nbsp;Direction&nbsp;{ &nbsp;&nbsp;&nbsp;UP(KeyEvent.VK_UP),&nbsp;DOWN(KeyEvent.VK_DOWN),&nbsp;LEFT(KeyEvent.VK_LEFT),&nbsp;RIGHT(KeyEvent.VK_RIGHT); &nbsp;&nbsp;&nbsp;private&nbsp;int&nbsp;key; &nbsp;&nbsp;&nbsp;private&nbsp;Direction(int&nbsp;key)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.key&nbsp;=&nbsp;key; &nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;public&nbsp;int&nbsp;getKey()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;key; &nbsp;&nbsp;&nbsp;}}//&nbsp;Actions&nbsp;for&nbsp;the&nbsp;key&nbsp;binding@SuppressWarnings("serial")class&nbsp;MyKeyAction&nbsp;extends&nbsp;AbstractAction&nbsp;{ &nbsp;&nbsp;&nbsp;private&nbsp;AnimationPanel&nbsp;draw; &nbsp;&nbsp;&nbsp;private&nbsp;Direction&nbsp;direction; &nbsp;&nbsp;&nbsp;public&nbsp;MyKeyAction(AnimationPanel&nbsp;draw,&nbsp;Direction&nbsp;direction)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.draw&nbsp;=&nbsp;draw; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.direction&nbsp;=&nbsp;direction; &nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;actionPerformed(ActionEvent&nbsp;e)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch&nbsp;(direction)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;UP: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;draw.incrementY(false); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;DOWN: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;draw.incrementY(true); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;LEFT: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;draw.incrementX(false); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;RIGHT: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;draw.incrementX(true); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;}}下面是另一个使用此sprite工作表的示例:从本站.同样,这是一个在JPanel的ploytComponent方法中绘制并使用键绑定来判断要移动的方向的示例。import&nbsp;java.awt.Color;import&nbsp;java.awt.Dimension;import&nbsp;java.awt.Graphics;import&nbsp;java.awt.Image;import&nbsp;java.awt.event.*;import&nbsp;java.awt.image.BufferedImage;import&nbsp;java.io.IOException;import&nbsp;java.net.URL;import&nbsp;java.util.ArrayList;import&nbsp;java.util.EnumMap;import&nbsp;java.util.List;import&nbsp;java.util.Map;import&nbsp;javax.imageio.ImageIO;import&nbsp;javax.swing.*;@SuppressWarnings("serial")public&nbsp;class&nbsp;Mcve3&nbsp;extends&nbsp;JPanel&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;final&nbsp;int&nbsp;PREF_W&nbsp;=&nbsp;800; &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;final&nbsp;int&nbsp;PREF_H&nbsp;=&nbsp;640; &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;final&nbsp;int&nbsp;TIMER_DELAY&nbsp;=&nbsp;50; &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;int&nbsp;spriteX&nbsp;=&nbsp;400; &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;int&nbsp;spriteY&nbsp;=&nbsp;320; &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;SpriteDirection&nbsp;spriteDirection&nbsp;=&nbsp;SpriteDirection.RIGHT; &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;MySprite&nbsp;sprite&nbsp;=&nbsp;null; &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;Timer&nbsp;timer&nbsp;=&nbsp;null; &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Mcve3()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprite&nbsp;=&nbsp;new&nbsp;MySprite(spriteDirection,&nbsp;spriteX,&nbsp;spriteY); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(IOException&nbsp;e)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.exit(-1); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setBackground(Color.WHITE); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setKeyBindings(SpriteDirection.LEFT,&nbsp;KeyEvent.VK_LEFT); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setKeyBindings(SpriteDirection.RIGHT,&nbsp;KeyEvent.VK_RIGHT); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setKeyBindings(SpriteDirection.FORWARD,&nbsp;KeyEvent.VK_DOWN); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setKeyBindings(SpriteDirection.AWAY,&nbsp;KeyEvent.VK_UP); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timer&nbsp;=&nbsp;new&nbsp;Timer(TIMER_DELAY,&nbsp;new&nbsp;TimerListener()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timer.start(); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;void&nbsp;setKeyBindings(SpriteDirection&nbsp;dir,&nbsp;int&nbsp;keyCode)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;condition&nbsp;=&nbsp;WHEN_IN_FOCUSED_WINDOW; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputMap&nbsp;inputMap&nbsp;=&nbsp;getInputMap(condition); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ActionMap&nbsp;actionMap&nbsp;=&nbsp;getActionMap(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KeyStroke&nbsp;keyPressed&nbsp;=&nbsp;KeyStroke.getKeyStroke(keyCode,&nbsp;0,&nbsp;false); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KeyStroke&nbsp;keyReleased&nbsp;=&nbsp;KeyStroke.getKeyStroke(keyCode,&nbsp;0,&nbsp;true); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inputMap.put(keyPressed,&nbsp;keyPressed.toString()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inputMap.put(keyReleased,&nbsp;keyReleased.toString()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;actionMap.put(keyPressed.toString(),&nbsp;new&nbsp;MoveAction(dir,&nbsp;false)); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;actionMap.put(keyReleased.toString(),&nbsp;new&nbsp;MoveAction(dir,&nbsp;true)); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Dimension&nbsp;getPreferredSize()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(isPreferredSizeSet())&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;super.getPreferredSize(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;new&nbsp;Dimension(PREF_W,&nbsp;PREF_H); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;void&nbsp;paintComponent(Graphics&nbsp;g)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super.paintComponent(g); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprite.draw(g); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;class&nbsp;MoveAction&nbsp;extends&nbsp;AbstractAction&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;SpriteDirection&nbsp;dir; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;boolean&nbsp;released; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;MoveAction(SpriteDirection&nbsp;dir,&nbsp;boolean&nbsp;released)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.dir&nbsp;=&nbsp;dir; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.released&nbsp;=&nbsp;released; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;actionPerformed(ActionEvent&nbsp;e)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(released)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprite.setMoving(false); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprite.setMoving(true); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprite.setDirection(dir); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;class&nbsp;TimerListener&nbsp;implements&nbsp;ActionListener&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;actionPerformed(ActionEvent&nbsp;e)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(sprite.isMoving())&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprite.tick(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;repaint(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;void&nbsp;createAndShowGui()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Mcve3&nbsp;mainPanel&nbsp;=&nbsp;new&nbsp;Mcve3(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JFrame&nbsp;frame&nbsp;=&nbsp;new&nbsp;JFrame("MCVE"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;frame.getContentPane().add(mainPanel); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;frame.pack(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;frame.setLocationRelativeTo(null); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;frame.setVisible(true); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SwingUtilities.invokeLater(()&nbsp;->&nbsp;createAndShowGui()); &nbsp;&nbsp;&nbsp;&nbsp;}}class&nbsp;MySprite&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;final&nbsp;String&nbsp;SPRITE_SHEET_PATH&nbsp;=&nbsp;"http://" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;"orig12.deviantart.net/7db3/f/2010/338/3/3/" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;"animated_sprite_sheet_32x32_by_digibody-d3479l2.gif"; &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;final&nbsp;int&nbsp;MAX_MOVING_INDEX&nbsp;=&nbsp;4; &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;final&nbsp;int&nbsp;DELTA&nbsp;=&nbsp;4; &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;SpriteDirection&nbsp;direction; &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;Map<SpriteDirection,&nbsp;Image>&nbsp;standingImgMap&nbsp;=&nbsp;new&nbsp;EnumMap<>(SpriteDirection.class); &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;Map<SpriteDirection,&nbsp;List<Image>>&nbsp;movingImgMap&nbsp;=&nbsp;new&nbsp;EnumMap<>(SpriteDirection.class); &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;int&nbsp;x; &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;int&nbsp;y; &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;boolean&nbsp;moving&nbsp;=&nbsp;false; &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;int&nbsp;movingIndex&nbsp;=&nbsp;0; &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;MySprite(SpriteDirection&nbsp;direction,&nbsp;int&nbsp;x,&nbsp;int&nbsp;y)&nbsp;throws&nbsp;IOException&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.direction&nbsp;=&nbsp;direction; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.x&nbsp;=&nbsp;x; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.y&nbsp;=&nbsp;y; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;createSprites(); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;draw(Graphics&nbsp;g)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Image&nbsp;img&nbsp;=&nbsp;null; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!moving)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;img&nbsp;=&nbsp;standingImgMap.get(direction); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;img&nbsp;=&nbsp;movingImgMap.get(direction).get(movingIndex); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g.drawImage(img,&nbsp;x,&nbsp;y,&nbsp;null); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;void&nbsp;createSprites()&nbsp;throws&nbsp;IOException&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;URL&nbsp;spriteSheetUrl&nbsp;=&nbsp;new&nbsp;URL(SPRITE_SHEET_PATH); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedImage&nbsp;img&nbsp;=&nbsp;ImageIO.read(spriteSheetUrl); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;get&nbsp;sub-images&nbsp;(sprites)&nbsp;from&nbsp;the&nbsp;sprite&nbsp;sheet &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;magic&nbsp;numbers&nbsp;for&nbsp;getting&nbsp;sprites&nbsp;from&nbsp;sheet,&nbsp;all&nbsp;obtained&nbsp;by&nbsp;trial&nbsp;and&nbsp;error &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;x0&nbsp;=&nbsp;0; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;y0&nbsp;=&nbsp;64; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;rW&nbsp;=&nbsp;32; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;rH&nbsp;=&nbsp;32; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;row&nbsp;=&nbsp;0;&nbsp;row&nbsp;<&nbsp;4;&nbsp;row++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SpriteDirection&nbsp;dir&nbsp;=&nbsp;SpriteDirection.values()[row]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List<Image>&nbsp;imgList&nbsp;=&nbsp;new&nbsp;ArrayList<>(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;movingImgMap.put(dir,&nbsp;imgList); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;rY&nbsp;=&nbsp;y0&nbsp;+&nbsp;row&nbsp;*&nbsp;rH; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;col&nbsp;=&nbsp;0;&nbsp;col&nbsp;<&nbsp;5;&nbsp;col++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;rX&nbsp;=&nbsp;x0&nbsp;+&nbsp;col&nbsp;*&nbsp;rW; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedImage&nbsp;subImg&nbsp;=&nbsp;img.getSubimage(rX,&nbsp;rY,&nbsp;rW,&nbsp;rH); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(col&nbsp;==&nbsp;0)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;first&nbsp;image&nbsp;is&nbsp;standing &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;standingImgMap.put(dir,&nbsp;subImg); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;all&nbsp;others&nbsp;are&nbsp;moving &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;imgList.add(subImg); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;SpriteDirection&nbsp;getDirection()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;direction; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;setDirection(SpriteDirection&nbsp;direction)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(this.direction&nbsp;!=&nbsp;direction)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setMoving(false); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.direction&nbsp;=&nbsp;direction; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;int&nbsp;getX()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;x; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;setX(int&nbsp;x)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.x&nbsp;=&nbsp;x; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;int&nbsp;getY()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;y; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;setY(int&nbsp;y)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.y&nbsp;=&nbsp;y; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;boolean&nbsp;isMoving()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;moving; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;setMoving(boolean&nbsp;moving)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.moving&nbsp;=&nbsp;moving; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!moving)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;movingIndex&nbsp;=&nbsp;0; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;tick()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(moving)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch&nbsp;(direction)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;RIGHT: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;+=&nbsp;DELTA; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;LEFT: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;-=&nbsp;DELTA; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;FORWARD: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y&nbsp;+=&nbsp;DELTA; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;AWAY: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y&nbsp;-=&nbsp;DELTA; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;movingIndex++; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;movingIndex&nbsp;%=&nbsp;MAX_MOVING_INDEX; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;int&nbsp;getMovingIndex()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;movingIndex; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;setMovingIndex(int&nbsp;movingIndex)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.movingIndex&nbsp;=&nbsp;movingIndex; &nbsp;&nbsp;&nbsp;&nbsp;}}enum&nbsp;SpriteDirection&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;FORWARD,&nbsp;LEFT,&nbsp;AWAY,&nbsp;RIGHT}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java