qq_43051967 2019-04-26 13:29 采纳率: 0%
浏览 301

用java写的弹球游戏,有一张图画不出。

问题:密码都进入if中了打印成功,为什么结果没有话result这张图

实际结果:图片说明

预期结果:图片说明

package javaLearn;

import javax.swing.JFrame;
import javax.swing.RepaintManager;

import java.awt.*;
//import javax.swing.*;
public class BallGame extends JFrame {
    //弹球游戏
    Image ball = Toolkit.getDefaultToolkit().getImage("images/2.png");
    Image desk = Toolkit.getDefaultToolkit().getImage("images/1.png");
    Image result = Toolkit.getDefaultToolkit().getImage("images/3.jpg");

    double x = 100;
    double y = 100;
    double drgee = 3.14/3;
    //设置标记flag控制是否repaint()
    boolean flag = true;

    public void paint(Graphics g) {
        System.out.println("窗口被画了一次!");
        g.drawImage(desk, 0, 30, null);
        g.drawImage(ball, (int)x, (int)y, null);


        x+=10*Math.cos(drgee);
        y+=10*Math.sin(drgee);
        //实现反弹
        if(y > 855-30 || y < 30) {
            drgee=-drgee;
        }
        if(x > 1167-100 || x < 0) {
            drgee = 3.14 - drgee;
        }
        //到达(262,82)停止repaint(),弹出一张图
        if((int)x == 262&& (int)y == 82){

            System.out.println("成功");
            //问题1:密码都进入if中了打印成功,为什么结果没有话result这张图
            g.drawImage(result, 303, 270, null);
            //到达(262,82)停止repaint()
            flag = false;

        }
    }





    void launchFrame() {
        setSize(1167,855);
        setLocation(50, 50);
        setVisible(true);
        while(flag) {
            repaint();
            try {
                Thread.sleep(40);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        BallGame games = new BallGame();
        games.launchFrame();

    }

}

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-09 04:01
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    在你的 launchFrame() 方法中,你调用了 repaint 方法来重新绘制窗口。但是,在这个方法的循环中,repaint 方法并没有被调用。因此,当你尝试访问 g 对象时,它仍然是旧的 ball 图像。

    为了解决这个问题,你需要在循环之外使用 g 对象进行重绘。例如:

    void launchFrame() {
        setSize(1167,855);
        setLocation(50, 50);
        setVisible(true);
    
        while(flag) {
            g.drawImage(desk, 0, 30, null); // 清除上一个画面
            g.drawImage(ball, (int)x, (int)y, null);
            x += 10 * Math.cos(drgee);
            y += 10 * Math.sin(drgee);
            // 实现反弹
            if(y > 855 - 30 || y < 30) {
                drgee = -drgee;
            }
            if(x > 1167 - 100 || x < 0) {
                drgee = 3.14 - drgee;
            }
            // 判断是否达到终点并停止repaint
            if((int)x == 262 && (int)y == 82){
                System.out.println("成功");
                g.drawImage(result, 303, 270, null);
                flag = false;
            }
        }
    }
    

    现在,每次循环结束时,g 对象将包含当前的 deskball 图像,从而实现了正确的重绘。

    评论

报告相同问题?