Я новичок в концепции BufferedImage, и у меня очень мало знаний, кроме того, что он может позволить мне анимировать спрайты персонажей для создаваемой мной репликации pa c -man. Я следовал инструкциям, чтобы добраться до сути, но при попытке обновить позицию игрока с помощью KeyListener или элементарного «x_coordinate ++;», кажется, ничего не происходит визуально. Я заметил, что строительство моих классов откусили, и может привести к ничего не произойдет, но в тех случаях, когда мне удалось изменение значений из консоли, то BufferedImage настойчив в презрев мои пожелания.
1002 *
GraphicsPanel. java import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import java.awt.event.MouseListener;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.swing.Timer;
public class GraphicsPanel extends JPanel implements KeyListener, MouseListener{
private int background_x;
private BufferedImage spriteSheet = null;
private BufferedImage player;
private Player p;
private Timer t;
public void init() {
BufferedImageLoader loader =new BufferedImageLoader();
try {
spriteSheet = loader.loadImage("images/pacman.png");
}catch(IOException e) {
e.printStackTrace();
}
this.addKeyListener(this);
p = new Player(214,315,this);
}
public GraphicsPanel(){
setPreferredSize(new Dimension(448,596));
t = new Timer(70, new ClockListener(this));
this.setFocusable(true);
}
public void paintComponent(Graphics g)
{
Graphics2D g2 = (Graphics2D) g;
g2.setColor(Color.black);
g2.fillRect(0, 0, 448, 596);
ClassLoader cldr = this.getClass().getClassLoader();
String imagePath = "images/background.png";
URL imageURL = cldr.getResource(imagePath);
ImageIcon image = new ImageIcon(imageURL);
image.paintIcon(this, g2, 0, 50);
init();
t.start();
p.draw(g2,this);
}
public void clock() {
System.out.println(p.getX()+ " " + p.getY());
repaint();
}
public BufferedImage getSpriteSheet() {
return spriteSheet;
}
@Override
public void keyPressed(KeyEvent e) {
//simple movement to help to ensure the most clarity with errors.
if(e.getKeyCode()==KeyEvent.VK_RIGHT)
p.setX(p.getX()+1);
if(e.getKeyCode()==KeyEvent.VK_LEFT)
p.setX(p.getX()-1);
if(e.getKeyCode()==KeyEvent.VK_UP)
p.setY(p.getY()+1);
if(e.getKeyCode()==KeyEvent.VK_DOWN)
p.setY(p.getY()-1);
repaint();
}
@Override
public void keyReleased(KeyEvent e) {
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
}
Player. java
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import javax.swing.ImageIcon;
public class Player {
private int x_coordinate;
private int y_coordinate;
private int xdirection;
private int ydirection;
private BufferedImage player;
private BufferedImage spriteSheet = null;
public Player(int x_coordinate, int y_coordinate,GraphicsPanel game){
this.x_coordinate = x_coordinate;
this.y_coordinate = y_coordinate;
Spritesheet ss = new Spritesheet(game.getSpriteSheet());
player = ss.grabImage(1,1, 32, 32);
}
public void tick() {
//to be used for smooth movement and animation
}
public void draw(Graphics g, Component c) {
g.drawImage(player, x_coordinate, y_coordinate, null);
}
public int getX() {
return x_coordinate;
}
public void setX(int x_coordinate) {
this.x_coordinate = x_coordinate;
}
public int getY() {
return y_coordinate;
}
public void setY(int y_coordinate) {
this.y_coordinate = y_coordinate;
}
}
BufferedImageLoader. java
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
public class BufferedImageLoader {
private BufferedImage image;
public BufferedImage loadImage(String path) throws IOException {
image = ImageIO.read(getClass().getResource(path));
return image;
}
}
SpriteSheet. java
import java.awt.image.BufferedImage;
public class Spritesheet {
private BufferedImage image;
public Spritesheet(BufferedImage image) {
this.image =image;
}
public BufferedImage grabImage(int col, int row, int width, int height) {
BufferedImage img = image.getSubimage((col*32)-32, (row*32)-32, width, height);
return img;
}
}
ClockListener. java
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class ClockListener implements ActionListener {
GraphicsPanel f;
ClockListener(GraphicsPanel c)
{
f = c;
}
public void actionPerformed(ActionEvent e) {
f.clock();
}
}
Графика Основная java
import javax.swing.JFrame;
import javax.swing.JPanel;
public class GraphicsMain extends JFrame{
public static void main(String[] args) {
GraphicsMain window = new GraphicsMain();
JPanel p = new JPanel();
p.add(new GraphicsPanel()); // add a class that extends JPanel
window.setTitle("PAC-MAN");
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setContentPane(p);
window.pack();
window.setLocationRelativeTo(null);
window.setVisible(true);
}
}