【发布时间】:2017-05-10 16:07:45
【问题描述】:
一段时间以来,我一直在尝试让游戏在 Java 中运行,在对其他人的 Sprite 函数感到非常痛苦之后,我自己制作了自己的 Sprite 函数,但不明白为什么我不能删除它。我知道它正在改变背景的像素以显示我的弓箭手精灵,因为它出现了,但无论出于何种原因,我都无法将像素改回原来的样子。有谁知道为什么会这样或我该如何解决? 链接到带有图像的谷歌文档: https://docs.google.com/document/d/1eU6faW1d7valq1yE_Bo09IPMbXuuZ6ZgqUu3BesaJUw/edit?usp=sharing
import javax.swing.*;
import javax.imageio.*;
import java.io.*;
import java.awt.image.BufferedImage;
public class Sprite {
BufferedImage image;
public Sprite(BufferedImage image) throws IOException{
this.image = image;
}
public BufferedImage getSprite(){
return this.image;
}
public int getX(){
return this.image.getMinX();
}
public int getY(){
return this.image.getMinY();
}
//to spawn a sprite on top of another image.
public void spawn(JFrame frame, BufferedImage world,int x, int y) throws
IOException{
int orig_x = x;
for (int sprite_y = 0; sprite_y < this.image.getHeight(); sprite_y++){
for (int sprite_x = 0; sprite_x < this.image.getWidth(); sprite_x++){
int sprite_pixel = this.image.getRGB(sprite_x,sprite_y);
int sprite_alpha = (sprite_pixel>>24) & 0xff;
int sprite_red = (sprite_pixel>>16) & 0xff;
int sprite_green = (sprite_pixel>>8 ) & 0xff;
int sprite_blue = sprite_pixel & 0xff;
int pixel = (sprite_alpha<<24) | (sprite_red<<16) | (sprite_green<<8) |
sprite_blue;
world.setRGB(x,y,pixel);
x++;
}
y++;
x = orig_x;
}
}
public void erase(JFrame frame,BufferedImage world, BufferedImage
orig_world) throws IOException{
int sprite_x = this.image.getMinX();
int sprite_y = this.image.getMinY();
int orig_sprite_x = sprite_x;
for (int stepper_y = this.image.getMinY(); stepper_y <
this.image.getHeight(); stepper_y++){
for (int stepper_x = this.image.getMinX(); stepper_x <
this.image.getWidth(); stepper_x++){
int sprite_pixel = orig_world.getRGB(sprite_x,sprite_y);
//get pixel from orginal sprite
int sprite_alpha = (sprite_pixel>>24) & 0xff;
//get alpha value from original sprite
int sprite_red = (sprite_pixel>>16) & 0xff;
//get red value from original sprite
int sprite_green = (sprite_pixel>>8 ) & 0xff;
//get green value from original sprite
int sprite_blue = sprite_pixel & 0xff;
//get blue value from original sprite
int pixel = (sprite_alpha<<24) | (sprite_red<<16) |
(sprite_green<<8) | sprite_blue;
//set the pixel equal to the old values
world.setRGB(sprite_x,sprite_y,pixel);
//place the pixel
sprite_x++;
}
sprite_x = orig_sprite_x;
// setting equal to original is so that at the end of each row it resets
to the farthest left pixel.
sprite_y++;
}
}
public static void main(String[] args) throws IOException{
Sprite orig_world = new Sprite(ImageIO.read(new
File("C:/Users/sfiel42/Documents/game/castles.png")));
Sprite world = new Sprite(ImageIO.read(new
File("C:/Users/sfiel42/Documents/game/castles.png")));
JLabel label = new JLabel();
label.setLocation(0,0);
label.setIcon(new ImageIcon(world.getSprite()));
label.setVisible(true);
JFrame frame = new JFrame();
frame.setVisible(true);
frame.setSize(783,615);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(label);
Sprite archer = new Sprite(ImageIO.read(new
File("C:/Users/sfiel42/Documents/game/archer.png")));
archer.spawn(frame,world.getSprite(),250,400);
archer.erase(frame,world.getSprite(),orig_world.getSprite());
}
}
【问题讨论】:
标签: java jframe sprite bufferedimage