繁体   English   中英

画在画布上

[英]Drawing to canvas

所以我涉足制作游戏,我是一个相当凌乱的工人,然后我回去整理它。 因此,请忽略任何愚蠢的命名约定或方法。 等我回去整理一下。

所以基本上我想做一个主菜单,我只想在屏幕上画些东西并留在那里。 我正在将图形写入图像ATM并显示图像,就像我尝试绘制到画布上一样,它只是闪烁到屏幕上,然后变成空白。 我将其更改为可运行,因此可以放入sleep()尝试进行错误搜索。 我现在删除了我所有的错误搜索代码。 事实证明,当我在屏幕上放置图像超过50ms之前或之后拥有sleep()时,矩形停留在屏幕上并且在绘制后不会像1ms那样闪烁。

我不确定发生了什么。 我可能不太清楚,我深表歉意。

    import java.awt.Canvas;
import java.awt.Graphics;

import javax.swing.JFrame;


public class test extends Thread{

    public static void main(String[] args){

        test t = new test();
        t.start();
    }

    @Override
    public void run() {
        JFrame f = new JFrame("Test");
        Canvas c = new Canvas();
        Graphics g;

        c.setSize(400, 400);
        f.add(c);
        f.pack();

        f.setVisible(true);
        c.setVisible(true);

        try {
            sleep(2000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        g = c.getGraphics();

        g.drawRect(10, 10, 40, 68);

    }
}

基本上,这不是AWT中的绘画工作方式。 绘画应在组件的paint方法范围内进行。 在AWT中, Canvas似乎是首选的基本组件。

除了可以返回null之外,您永远不要使用getGraphics ,它只能表示上一次绘制循环中的Graphics上下文,添加到其中的任何内容都可能会被较新的绘制事件抹去...这可能正在发生。

看看AWT和Swing中的绘画,了解有关绘画工作原理的详细信息。

话虽如此,我不鼓励您使用基于AWT的API,因为它在15年前被Swing取代。

看看“ 执行自定义绘画 ”了解有关Swing中绘画的更多详细信息

您有点主意,但是有一些创建游戏的标准设计模式,供初学者查看此代码

基本上,您需要一种称为“游戏循环”的东西,该循环每秒更新并渲​​染到显示器一定数量的时间(帧速率或fps)。 渲染时,它将以特定间隔清除并在新位置重新绘制图像,如果fps为60,则您每秒将进行60次渲染(清除和重新绘制)。 我们还可以引入更高级的概念,例如缓冲策略(如上例所示),以减少撕裂和闪烁。

综上所述,您已经存在了,您只需要不断地执行g = c.getGraphics() ,...

while (true) {
     g = c.getGraphics();

     // set color
     // draw a rectangle

     g.dispose();
}

请注意我是如何添加处置的,这将释放所有未使用的内存。 为了澄清,这绝不是好的代码,但是它将为您提供一个起点:)

闪烁是由于只有一个屏幕,要停止此闪烁,您需要一种缓冲策略 基本上有两个缓冲区就像有两个屏幕,而在一个“屏幕”上渲染时,您可以清除并在第二个屏幕上绘制下一步,并在两个缓冲区之间进行切换。 这样可以减少闪烁。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM