如何根据击键更改图像 [英] How to change images based on keystrokes

查看:169
本文介绍了如何根据击键更改图像的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在为一个学校项目创建一个程序。这是一个基于粉丝的神奇宝贝程序,我很难理解如何根据击键来改变图像。



这是目前为止的角色代码Class

  import java.awt.Image; 
import java.awt.event.KeyEvent;
import java.io. *; // File类
import java.util。*; //扫描器类
import javax.swing.ImageIcon;
import javax.swing.JPanel;
import java.awt.image。*;


import javax.swing.ImageIcon;

公共类MainCharacter {

私人图片up,up1,up2,down,down1,down2,left,left1,left2,right,right1,right2;


private void loadImages(){


up = new ImageIcon(Up.png)。getImage();
up1 = new ImageIcon(Up1.png)。getImage();
up2 = new ImageIcon(Up2.png)。getImage();
down = new ImageIcon(Down.png)。getImage();
down1 = new ImageIcon(Down1.png)。getImage();
down2 = new ImageIcon(Down2.png)。getImage();
left = new ImageIcon(Left.png)。getImage();
left1 =新的ImageIcon(Left1.png)。getImage();
left2 = new ImageIcon(Left2.png)。getImage();
right = new ImageIcon(Right.png)。getImage();
right1 = new ImageIcon(Right1.png)。getImage();
right2 = new ImageIcon(Right2.png)。getImage();

}










/ * public Image getImage()
{
//不知道在这里返回什么
}
* /


public void keyPressed(KeyEvent e){

int key = e.getKeyCode();

if(key == KeyEvent.VK_LEFT){

//不知道该做什么

}

如果(key == KeyEvent.VK_RIGHT){
//不知道该怎么做

}


if(key == KeyEvent.VK_UP ){

//不知道该怎么做
}

if(key == KeyEvent.VK_DOWN){
//不知道该怎么做做
}
}

public void keyReleased(KeyEvent e){
int key = e.getKeyCode(); (key == KeyEvent.VK_LEFT){
//不知道该怎么办
}

if(key == KeyEvent.VK_RIGHT ){
//不知道该怎么办
}

if(key == KeyEvent.VK_UP){
//不知道该怎么办$ b $ (key == KeyEvent.VK_DOWN){
//不知道该做什么
}
}
}


以下是与地图一起移动的类:

  import java.awt.Color; 
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.JPanel;
import javax.swing.Timer;


公共类MapMovement扩展JPanel实现ActionListener {

私人计时器计时器;
私人地图;
private MainCharacter mainCharacter;

public MapMovement(){

addKeyListener(new TAdapter());
setFocusable(true);
setBackground(Color.BLACK);
setDoubleBuffered(true);

map = new Map();

timer = new Timer(5,this);
timer.start();
}


public void paint(Graphics g){
super.paint(g);

Graphics2D g2d =(Graphics2D)g;
g2d.drawImage(map.getImage(),map.getX(),map.getY(),1000,1500,this);

Toolkit.getDefaultToolkit()。sync();
g.dispose();
}


public void actionPerformed(ActionEvent e){


map.move();
repaint();


$ b private class TAdapter extends KeyAdapter {

public void keyReleased(KeyEvent e){
map.keyReleased(e);
//mainCharacter.keyReleased(e);
}

public void keyPressed(KeyEvent e){
map.keyPressed(e);
//mainCharacter.keyPressed(e);


$ b $ / code $ / pre>

}



更新:

这里是Map类

  import java.awt.Image; 
import java.awt.event.KeyEvent;

import javax.swing.ImageIcon;

public class Map {

private String map =Map-1stCity.png;

private int dx;
private int dy;
private int x;
private int y;
私人图片图片;

public Map(){
ImageIcon ii = new ImageIcon(this.getClass()。getResource(map));
image = ii.getImage();
x = -100;
y = -100;
}


public void move(){
x + = dx;
y + = dy;
}

public int getX(){
return x;
}

public int getY(){
return y;
}

public Image getImage(){
return image;
}

public void keyPressed(KeyEvent e){

int key = e.getKeyCode();

if(key == KeyEvent.VK_LEFT){
dx = 1;
}

if(key == KeyEvent.VK_RIGHT){
dx = -1;
}

if(key == KeyEvent.VK_UP){
dy = 1;
}

if(key == KeyEvent.VK_DOWN){
dy = -1;



public void keyReleased(KeyEvent e){
int key = e.getKeyCode();

if(key == KeyEvent.VK_LEFT){
dx = 0;
}

if(key == KeyEvent.VK_RIGHT){
dx = 0;
}

if(key == KeyEvent.VK_UP){
dy = 0;
}

if(key == KeyEvent.VK_DOWN){
dy = 0;
}
}
}

感谢您的全力帮助

解决方案

概述



基本上,需要知道当前的关键状态和当前帧(基于每个位置有两个图像的事实)。

通过这些信息,您可以确定哪个你应该显示的字符图像。



示例



这个例子非常简单,它演示了键绑定API 使用 KeyListener ,因为它解决了处理焦点的问题。它还演示了通过单个基础 Action



修改当前状态是多么容易。示例的 MainCharacter 有一个方法(感兴趣的),它用于根据当前的 KeyState 来确定应显示哪个图像(一个 enum )和当前 frame



getCharacter 方法每隔10帧就会切换图片,以便在当前位置之间提供动画...

  import java.awt.BorderLayout; 
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.imageio.ImageIO;
import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
$ b public class Character {

public static void main(String [] args){
new Character(); (){


public字符(){
EventQueue.invokeLater(new Runnable(){
@Override
public void run(){
尝试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch(ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex){
}

JFrame框架= new JFrame(Testing);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new GamePane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}

公共类GamePane扩展JPanel {

private MainCharacter mc;
私钥KeyState keyState;
private int frame;

public GamePane(){

mc = new MainCharacter();

Timer timer = new Timer(40,new ActionListener(){
@Override
public void actionPerformed(ActionEvent e){
frame ++;
if (frame> 100){
frame = 0;
}
repaint();
}
});
timer.start();


InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW);
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP,0),Up);
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN,0),Down);
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT,0),Left);
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT,0),Right);

ActionMap am = getActionMap();
am.put(Up,new KeyStateAction(KeyState.UP));
am.put(Down,new KeyStateAction(KeyState.DOWN));
am.put(Left,new KeyStateAction(KeyState.LEFT));
am.put(Right,new KeyStateAction(KeyState.RIGHT));
}

@Override
public Dimension getPreferredSize(){
return new Dimension(200,200);


@Override
protected void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2d =(Graphics2D)g.create();
Image img = mc.getCharacter(keyState,frame);
int x =(getWidth() - img.getWidth(this))/ 2;
int y =(getHeight() - img.getHeight(this))/ 2;
g2d.drawImage(img,x,y,this);
g2d.dispose();
}

public class KeyStateAction extends AbstractAction {

private KeyState state;

public KeyStateAction(KeyState state){
this.state = state;
}

@Override
public void actionPerformed(ActionEvent e){
keyState = state;





public enum KeyState {

UP,DOWN,LEFT,RIGHT ;

}

public class MainCharacter {

private Map< KeyState,List< Image>> mapImage;

public MainCharacter(){
mapImage = new HashMap<>(25);
尝试{
mapImage.put(KeyState.UP,loadImages(Up));
mapImage.put(KeyState.DOWN,loadImages(Down));
mapImage.put(KeyState.LEFT,loadImages(Left));
mapImage.put(KeyState.RIGHT,loadImages(Right));
} catch(IOException exp){
exp.printStackTrace();
}
}

保护列表<图片> loadImages(String name)抛出IOException {

List< Image> images = new ArrayList<>(25);
images.add(ImageIO.read(new File(name +1.png)));
images.add(ImageIO.read(new File(name +2.png)));

返回图片;


$ b public Image getCharacter(KeyState keyState,int frame){

Image img = null;
列表<图片> images = mapImage.get(keyState);
if(images == null){
images = mapImage.get(KeyState.DOWN);
}
int index =(frame / 10)%2 == 0? 0:1;
img = images.get(index);

return img;

}

}

}

正如我在我的评论中所说的,不要在 Graphics 上下文中调用 dispose 不会创建,因为这不仅会影响您正在绘制的内容,还会影响您之后可能绘制的内容。


I'm creating a program for a school project. It is a fan based program of Pokémon and I am having a little trouble understanding how to change images based on the key strokes.

Here is the code so far for the Character Class

import java.awt.Image;
import java.awt.event.KeyEvent;
import java.io.*;                        //the File class
import java.util.*;                     //the Scanner class
import javax.swing.ImageIcon;
import javax.swing.JPanel;
import java.awt.image.*;


import javax.swing.ImageIcon;

public class MainCharacter {

  private Image up, up1, up2, down, down1, down2, left, left1, left2, right, right1, right2;


  private void loadImages() {


     up = new ImageIcon("Up.png").getImage();
     up1 = new ImageIcon("Up1.png").getImage();
     up2 = new ImageIcon("Up2.png").getImage();
     down = new ImageIcon("Down.png").getImage();
     down1 = new ImageIcon("Down1.png").getImage();
     down2= new ImageIcon("Down2.png").getImage();
     left = new ImageIcon("Left.png").getImage();
     left1 = new ImageIcon("Left1.png").getImage();
     left2 = new ImageIcon("Left2.png").getImage();
     right = new ImageIcon("Right.png").getImage();
     right1 = new ImageIcon("Right1.png").getImage();
     right2 = new ImageIcon("Right2.png").getImage();

  }










/*public Image getImage() 
{
     //dont know what to return here
}
*/


  public void keyPressed(KeyEvent e) {

     int key = e.getKeyCode();

     if (key == KeyEvent.VK_LEFT) {

     //dont know what to do

     }

     if (key == KeyEvent.VK_RIGHT) {
        //dont know what to do

     }


     if (key == KeyEvent.VK_UP) {

        //dont know what to do
     }

     if (key == KeyEvent.VK_DOWN) {
        //dont know what to do
     }
  }

  public void keyReleased(KeyEvent e) {
     int key = e.getKeyCode();

     if (key == KeyEvent.VK_LEFT) {
        //dont know what to do
     }

     if (key == KeyEvent.VK_RIGHT) {
        //dont know what to do
     }

     if (key == KeyEvent.VK_UP) {
        //dont know what to do
     }

     if (key == KeyEvent.VK_DOWN) {
        //dont know what to do
     }
  }
}

Here is the class where it moves along with the map:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.JPanel;
import javax.swing.Timer;


public class MapMovement extends JPanel implements ActionListener {

private Timer timer;
private Map map;
 private MainCharacter mainCharacter;

public MapMovement() {

    addKeyListener(new TAdapter());
    setFocusable(true);
    setBackground(Color.BLACK);
    setDoubleBuffered(true);

    map = new Map();

    timer = new Timer(5, this);
    timer.start();
}


public void paint(Graphics g) {
    super.paint(g);

    Graphics2D g2d = (Graphics2D)g;
    g2d.drawImage(map.getImage(), map.getX(), map.getY(), 1000, 1500, this);

    Toolkit.getDefaultToolkit().sync();
    g.dispose();
}


public void actionPerformed(ActionEvent e) {


      map.move();
    repaint();  
}


private class TAdapter extends KeyAdapter {

    public void keyReleased(KeyEvent e) {
        map.keyReleased(e);
            //mainCharacter.keyReleased(e);
    }

    public void keyPressed(KeyEvent e) {
        map.keyPressed(e);
            //mainCharacter.keyPressed(e);

    }
}

}

UPDATE:

here is the Map class

import java.awt.Image;
import java.awt.event.KeyEvent;

import javax.swing.ImageIcon;

public class Map {

private String map = "Map-1stCity.png";

private int dx;
private int dy;
private int x;
private int y;
private Image image;

public Map() {
    ImageIcon ii = new ImageIcon(this.getClass().getResource(map));
    image = ii.getImage();
    x = -100;
    y = -100;
}


public void move() {
    x += dx;
    y += dy;
}

public int getX() {
    return x;
}

public int getY() {
    return y;
}

public Image getImage() {
    return image;
}

public void keyPressed(KeyEvent e) {

    int key = e.getKeyCode();

    if (key == KeyEvent.VK_LEFT) {
        dx = 1;
    }

    if (key == KeyEvent.VK_RIGHT) {
        dx = -1;
    }

    if (key == KeyEvent.VK_UP) {
        dy = 1;
    }

    if (key == KeyEvent.VK_DOWN) {
        dy = -1;
    }
}

public void keyReleased(KeyEvent e) {
    int key = e.getKeyCode();

    if (key == KeyEvent.VK_LEFT) {
        dx = 0;
    }

    if (key == KeyEvent.VK_RIGHT) {
        dx = 0;
    }

    if (key == KeyEvent.VK_UP) {
        dy = 0;
    }

    if (key == KeyEvent.VK_DOWN) {
        dy = 0;
    }
}
}

Thank you for all your help in advance!

解决方案

Overview

Basically, you're going to need to know the current key state and the current frame (based on the fact that you have two images per position).

With this information, you can then determine which character image you should be displaying.

Example

This example is very simple and it demonstrates the key bindings API over using KeyListener as it resolves issues dealing with focus. It also demonstrates how easy it is to modify the current state through a single base Action

The example's MainCharacter has a single method (of interest) which is used to determine which image should be displayed based on the current KeyState (an enum in this example) and the current frame.

The getCharacter method switches the image every 10 frames in order to provide the animation between the current position...

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.imageio.ImageIO;
import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Character {

    public static void main(String[] args) {
        new Character();
    }

    public Character() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new GamePane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class GamePane extends JPanel {

        private MainCharacter mc;
        private KeyState keyState;
        private int frame;

        public GamePane() {

            mc = new MainCharacter();

            Timer timer = new Timer(40, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    frame++;
                    if (frame > 100) {
                        frame = 0;
                    }
                    repaint();
                }
            });
            timer.start();


            InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW);
            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), "Up");
            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), "Down");
            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), "Left");
            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), "Right");

            ActionMap am = getActionMap();
            am.put("Up", new KeyStateAction(KeyState.UP));
            am.put("Down", new KeyStateAction(KeyState.DOWN));
            am.put("Left", new KeyStateAction(KeyState.LEFT));
            am.put("Right", new KeyStateAction(KeyState.RIGHT));
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            Image img = mc.getCharacter(keyState, frame);
            int x = (getWidth() - img.getWidth(this)) / 2;
            int y = (getHeight() - img.getHeight(this)) / 2;
            g2d.drawImage(img, x, y, this);
            g2d.dispose();
        }

        public class KeyStateAction extends AbstractAction {

            private KeyState state;

            public KeyStateAction(KeyState state) {
                this.state = state;
            }

            @Override
            public void actionPerformed(ActionEvent e) {
                keyState = state;
            }

        }

    }

    public enum KeyState {

        UP, DOWN, LEFT, RIGHT;

    }

    public class MainCharacter {

        private Map<KeyState, List<Image>> mapImage;

        public MainCharacter() {
            mapImage = new HashMap<>(25);
            try {
                mapImage.put(KeyState.UP, loadImages("Up"));
                mapImage.put(KeyState.DOWN, loadImages("Down"));
                mapImage.put(KeyState.LEFT, loadImages("Left"));
                mapImage.put(KeyState.RIGHT, loadImages("Right"));
            } catch (IOException exp) {
                exp.printStackTrace();
            }
        }

        protected List<Image> loadImages(String name) throws IOException {

            List<Image> images = new ArrayList<>(25);
            images.add(ImageIO.read(new File(name + "1.png")));
            images.add(ImageIO.read(new File(name + "2.png")));

            return images;

        }

        public Image getCharacter(KeyState keyState, int frame) {

            Image img = null;
            List<Image> images = mapImage.get(keyState);
            if (images == null) {
                images = mapImage.get(KeyState.DOWN);
            }
            int index = (frame / 10) % 2 == 0 ? 0 : 1;
            img = images.get(index);

            return img;

        }

    }

}

As I said in my comments, don't call dispose on a Graphics context you did not create as this can affect not only what you are painting but what might be painted after you.

这篇关于如何根据击键更改图像的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆