我知道有类似的问题,但不完全是这样,我保存的jpanel罚款,但我有一些图像,我已经导入到程序,粉刷到jpanel上罚款,但相同的图像绘制在面板上没有保存在bufferedImage,有什么建议吗?
我可能会补充说,我已经尝试直接保存jpanel,但是我一直保存jpanel的开始图像,而不是更新的带有游戏屏幕的图片,如果您对我在那里做错了什么有任何建议的话,那就太棒了。
我的代码:
主班
public class WhackAMole extends JFrame implements Sprites{
Board board = new Board();
public WhackAMole(){
this.setSize(BOARD_WIDTH, BOARD_HEIGHT);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
this.setTitle("Whack-A-Mole");
this.add(board);
this.addMouseListener(board);
}
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new WhackAMole().setVisible(true);
}
});
}
}
...我的Jpanel课程
package whackamole;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import javax.swing.Timer;
/**
*
* @author hutch
*/
public class Board extends JPanel implements Sprites, MouseListener{
Clouds[] clouds = new Clouds[4];
static MoleHill[] moleHill = new MoleHill[12];
static Mole mole;
private JButton start;
private JLabel scoreBoardLabel;
private JLabel countDownLabel;
private ImageIcon ii;
private Image title;
private ImageIcon ii2;
private Image scoreBoard;
private int score;
private int countdown = 3;
private boolean gameScreen;
private boolean inGame;
private int levelSpeed = 10;
private File backGroundFile = new File("Background.png");
public Board(){
this.setLayout(null);
ii = new ImageIcon(getClass().getResource("Title.png"));
title = ii.getImage().getScaledInstance(500, 110, Image.SCALE_SMOOTH);
ii2 = new ImageIcon(getClass().getResource("ScoreBoard.png"));
scoreBoard = ii2.getImage().getScaledInstance(270, 150, Image.SCALE_SMOOTH);
scoreBoardLabel = new JLabel("", SwingConstants.CENTER);
scoreBoardLabel.setBounds(330, 215, 115 , 80);
scoreBoardLabel.setFont(new Font("Serif", Font.BOLD, 25));
scoreBoardLabel.setForeground(Color.YELLOW);
countDownLabel = new JLabel("", SwingConstants.CENTER);
countDownLabel.setBounds(330, 215, 115 , 80);
countDownLabel.setFont(new Font("Serif", Font.BOLD, 45));
countDownLabel.setForeground(Color.BLACK);
start = new JButton("START");
start.setBounds(300, 400, 180 , 60);
start.setFocusPainted(false);
start.setFont(new Font("Serif", Font.BOLD, 25));
start.setForeground(Color.WHITE);
start.setBackground(new Color(102,68,0));
start.addActionListener(new play());
this.add(start);
this.setSize(BOARD_WIDTH, BOARD_HEIGHT);
initiateClouds();
initiateMoleHills();
}
public Image background(){
Image image = null;
try {
image = ImageIO.read(backGroundFile).getScaledInstance(BOARD_WIDTH, BOARD_HEIGHT, Image.SCALE_SMOOTH);
} catch (IOException ex) {
Logger.getLogger(Board.class.getName()).log(Level.SEVERE, null, ex);
}
return image;
}
/**
* initiates cloud array
*/
public final void initiateClouds(){
for(int i =0 ; i < clouds.length; i++){
clouds[i] = new Clouds(0,0);
}
}
/**
* initiates mole array
*/
public final void initiateMoleHills(){
int y = 420;
int x = 135;
int width = -10;
int height = 35;
for(int i = 0 ; i < 4; i++){
moleHill[i] = new MoleHill(x, y, width, height);
x += 120;
}
y = 570;
x = 75;
width = 20;
height = 50;
for(int j = 4 ; j < 8; j++){
moleHill[j] = new MoleHill(x, y, width, height);
x += 160;
}
y = 780;
x = 15;
width = 50;
height = 80;
for(int k = 8 ; k < 12; k++){
moleHill[k] = new MoleHill(x, y, width, height);
x += 190;
}
}
/**
*
* @param g
*/
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
startScreen(g);
if(gameScreen == true){
gameScreen(g);
}
if(inGame == true && gameScreen == true){
playing(g);
}
}
/**
* painting the start screen
* @param g
*/
public void startScreen(Graphics g){
Graphics2D g2d = (Graphics2D) g;
this.setBackground(new Color(128,191,255)); //blue sky
drawTitle(g);
}
/**
* painting the game screen
* @param g
*/
public void gameScreen(Graphics g){
Graphics2D g2d = (Graphics2D) g;
drawTitle(g);
drawClouds(g);
drawFieldAndHill(g);
drawScoreBoard(g);
drawHideBar(g);
drawMoleHills(g);
//saveBackground(); --------------------------------------WAS HERE----------------------------------------<
}
/**
* painting the game screen
* @param g
*/
public void playing(Graphics g){
Graphics2D g2d = (Graphics2D) g;
drawFieldAndHill(g);
drawTitle(g);
drawClouds(g);
drawScoreBoard(g);
drawMole(g);
drawHideBar(g);
drawMoleHills(g);
}
/**
* draws main title
* @param g
*/
public void drawTitle(Graphics g){
Graphics2D g2d = (Graphics2D) g;
g2d.drawImage(title, 150, 70, null);
}
/**
* draws scoreboard
* @param g
*/
public void drawScoreBoard(Graphics g){
Graphics2D g2d = (Graphics2D) g;
g2d.drawImage(scoreBoard, 250, 200, null);
}
/**
* draws clouds
* @param g
*/
public void drawClouds(Graphics g){
Graphics2D g2d = (Graphics2D) g;
for(int i = 0 ; i < clouds.length; i++){ //drawing clouds
g2d.drawImage(clouds[i].getImage(), clouds[i].getX() + clouds[i].move(), clouds[i].getY(), this);
if(clouds[i].getX() + clouds[i].movement == BOARD_WIDTH + 200){
clouds[i].setMove();
}
}
}
/**
* draws bars to hide moles
* @param g
*/
public void drawHideBar(Graphics g){
Graphics2D g2d = (Graphics2D) g;
g2d.setColor(new Color(102,204,0));
g2d.fillRect(0, 445, BOARD_WIDTH, 50); //top part for upper moles
g2d.fillRect(0, 605, BOARD_WIDTH, 80); //middlepart for middle moles
g2d.fillRect(0, 830, BOARD_WIDTH, 50); //bottom part for lower moles
}
/**
* draws mole hills
* @param g
*/
public void drawMoleHills(Graphics g){
Graphics2D g2d = (Graphics2D) g;
for(int i = 0 ; i < moleHill.length; i++){ //mole hills
g2d.drawImage(moleHill[i].getImage(), moleHill[i].getX(), moleHill[i].getY(), this);
}
}
/**
* draws hills and fields
* @param g
*/
public void drawFieldAndHill(Graphics g){
Graphics2D g2d = (Graphics2D) g;
g2d.setColor(new Color(30,179,0)); //darker outlines
g2d.drawOval(0, 300, BOARD_WIDTH, BOARD_HEIGHT);
g2d.drawRect(-5, 500, BOARD_WIDTH, BOARD_HEIGHT);
g2d.setColor(new Color(102,204,0));
g2d.fillRect(0, 400, BOARD_WIDTH, BOARD_HEIGHT); //hill and field
g2d.fillOval(0, 300, BOARD_WIDTH, BOARD_HEIGHT);
}
/**
* draws moles
* @param g
*/
public void drawMole(Graphics g){
Graphics2D g2d = (Graphics2D) g;
g2d.drawImage(mole.getImage(), mole.getX(), mole.getY() + mole.move(), this);
}
/**
* saves the background
*/
public final void saveBackground(){
if(!backGroundFile.exists()){
BufferedImage image = new BufferedImage(BOARD_WIDTH, BOARD_HEIGHT,BufferedImage.TYPE_INT_RGB);
try {
Graphics2D graphic = image.createGraphics();
repaint();
printAll(graphic);
ImageIO.write(image, "png", backGroundFile);
} catch (IOException ex) {
Logger.getLogger(Board.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
/**
* updates scoreboard with score
*/
public void updateScore(){
scoreBoardLabel.setText(String.valueOf(score));
}
/**
* method to start the game process
*/
public void playGame(){
countDown();
ScheduledExecutorService ex = Executors.newSingleThreadScheduledExecutor();
Runnable task = () -> {
mole = new Mole(35,790,0,0,false);
inGame = true;
this.add(scoreBoardLabel);
scoreBoardLabel.setVisible(true);
saveBackground(); //NOW HERE-------------------------------------------<
new Timer(10, new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
updateScore();
repaint();
if(score >= 50){
inGame = false;
repaint();
start.setVisible(true);
start.setText("NEXT LEVEL");
Mole.speed ++;
countdown = 3;
score = 0;
scoreBoardLabel.setVisible(false);
updateScore();
((Timer)e.getSource()).stop();
}
}
}).start();
};
ex.schedule(task, 4000, TimeUnit.MILLISECONDS);
}
public void countDown(){
this.add(countDownLabel);
countDownLabel.setVisible(true);
countDownLabel.setText(String.valueOf(countdown));
new Timer(1000, new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
countdown --;
countDownLabel.setText(String.valueOf(countdown));
if(countdown == 0){
countDownLabel.setText("GO");
}
if(countdown == -1){
((Timer)e.getSource()).stop();
countDownLabel.setVisible(false);
}
}
}).start();
}
@Override
public void mouseClicked(MouseEvent e) {
if(mole.getBounds().contains(e.getPoint())){
if(mole.isHit() == false){
mole.hit();
int level = mole.getOriginalY();
switch(level){
case 790:
score += 5;
break;
case 580:
score += 15;
break;
case 430:
score += 25;
break;
}
}
}
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
class play implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
start.setVisible(false);
gameScreen = true;
start.setVisible(false);
repaint();
playGame();
setCursor(Toolkit.getDefaultToolkit().createCustomCursor(
new ImageIcon(getClass().getResource("Mallet.png")).getImage().getScaledInstance(400, 400, Image.SCALE_SMOOTH),
new Point(0,0),"custom cursor"));;
}
}
public static BufferedImage imageToBufferedImage(Image im) {
BufferedImage bi = new BufferedImage
(im.getWidth(null),im.getHeight(null),BufferedImage.TYPE_INT_RGB);
Graphics bg = bi.getGraphics();
bg.drawImage(im, 0, 0, null);
bg.dispose();
return bi;
}
}..。
发布于 2022-01-10 18:03:14
没有绘制图像的原因是Graphics#drawImage没有绘制图像。
要解决这一问题,您将在用于呈现我创建的do will循环的方法中看到,以检查draw方法是否返回true。这表明图像已经绘制成功。
..。
public void startScreen(Graphics g){
Graphics2D g2d = (Graphics2D) g;
g2d.setColor(new Color(128,191,255));
g2d.fillRect(0, 0, BOARD_WIDTH, BOARD_HEIGHT); //blue sky
Ellipse2D.Double circle = new Ellipse2D.Double(40, 40, 80, 80); //sun
g2d.setColor(Color.YELLOW);
g2d.fill(circle);
boolean cloudImage1 = false;
boolean cloudImage2 = false;
do{ //start clouds
cloudImage1 = g2d.drawImage(startclouds[0].getImage(), 90, 100, null);
cloudImage2 = g2d.drawImage(startclouds[1].getImage(), 600, 100, null);
}while(cloudImage1 == false || cloudImage2 == false);
drawTitle(g); //draws main title
g2d.setColor(new Color(102,204,0)); //green grass
g2d.fillRect(0, 560, BOARD_WIDTH, BOARD_HEIGHT);
boolean fenceCheck1 = false;
boolean fenceCheck2 = false;
do{ //draws fence
fenceCheck1 = g2d.drawImage(fence, -105, 370, null);
fenceCheck2 = g2d.drawImage(fence, fence.getWidth(null) / 2 + 8, 370, null);
}while(fenceCheck1 == false); //check image is loaded before save
for(int i = 0 ; i < startMoles.length;){ //start screen moles
boolean check = g2d.drawImage(startMoles[i].getImage(), startMoles[i].getX(), startMoles[i].getY(), null);
if(check == true){ //check image is loaded before save
i++;
}
}
for(int i = 0 ; i < startMoleHills.length;){ //start screen mole hills
boolean check = g2d.drawImage(startMoleHills[i].getImage(), startMoleHills[i].getX(), startMoleHills[i].getY(), this);
if(check == true){ //check image is loaded before save
i++;
}
}
boolean grassImage1 = false;
boolean grassImage2 = false;
boolean grassImage3 = false;
do{ //grass oimages
grassImage1 = g2d.drawImage(grass, 100, 700, null); //check image is loaded before save
grassImage2 = g2d.drawImage(grass, 500, 650, null); //check image is loaded before save
grassImage3 = g2d.drawImage(grass, 600, 500, null); //check image is loaded before save
}while(grassImage1 == false || grassImage2 == false || grassImage3 == false);
boolean flowerImage1 = false;
boolean flowerImage2 = false;
do{ //flower images
flowerImage1 = g2d.drawImage(flower1, 50, 600, null); //check image is loaded before save
flowerImage2 = g2d.drawImage(flower1, 600, 700, null); //check image is loaded before save
}while(flowerImage1 == false || flowerImage2 == false);
}..。
这是保存面板的方法。
..。
public final void saveStartBackground(){
if(!startBackGroundFile.exists()){
BufferedImage image = new BufferedImage(BOARD_WIDTH, BOARD_HEIGHT,BufferedImage.TYPE_INT_RGB);
try {
Graphics2D graphic = image.createGraphics();
startScreen(graphic);
ImageIO.write(image, "png", startBackGroundFile);
} catch (IOException ex) {
Logger.getLogger(Board.class.getName()).log(Level.SEVERE, null, ex);
}
}
}..。
这是启动保存的方法。
..。
public void loadGame(){
gamePlayMusic();
saveStartBackground();
saveBackground();
saveEndBackground();
gunShot();
moleNoise();
this.add(start);
}..。
在jframe设置为可见之前,我称之为它,因此,在游戏开始之前,确保面板都是好的。
..。
public class WhackAMole extends JFrame implements Sprites{
Board board = new Board();
public WhackAMole(){
this.setSize(BOARD_WIDTH, BOARD_HEIGHT);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
this.setTitle("Whack-A-Mole");
this.add(board);
this.addMouseListener(board);
board.loadGame();
this.setVisible(true);
this.setResizable(false);
}
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new WhackAMole();
}
});
}}
https://stackoverflow.com/questions/70632940
复制相似问题