什么是tile,以及它们是如何在BufferedImage中创建的

Edd*_*man 5 java bufferedimage bitmap

我之前在sun java论坛上发布了一个问题,我发现很难理解我从回复者那里收到的第一个回复,虽然看起来他给了我正确的解决方法.问题的链接是:

http://forums.sun.com/thread.jspa?threadID=5436562&tstart=0

有人回答我应该使用BufferedImage并制作瓷砖.我真的不明白瓷砖的意思是什么BufferedImage.

我希望有人向我解释一下瓷砖是什么以及它们是如何在瓷砖中创建的BufferedImage.

我在网上搜索了一段时间,但找不到任何可以帮助我理解瓷砖基础知识和创建瓷砖的链接.任何指向网站的指针也表示赞赏.

我需要帮助理解与其相关的切片BufferedImage以及它们的创建方式.

Syn*_*r0r 14

2D游戏中的"平铺"仅仅意味着"小于整个屏幕的图像,您可以多次重复使用以创建背景".

这是一个工作示例,其中创建了四个图块(向每个像素添加一些随机噪声).每个图块为50x50像素.

然后是一个"地图"(在你的情况下你称之为"网格"),表示你想放在哪里的地方.

从该地图开始,BufferedImage创建一个更大的(请注意,它只是一个示例,在实际程序中,您将要使用BufferedImage副本,而不是像素逐个副本).

地图是9x7,每个图块是50x50像素,因此得到的图像是9*50 x 7*50(即450乘350).

请注意,下面的内容实际上只是一个简单的示例,尽可能简短,展示如何使用多个磁贴创建更大的BufferedImage:目标不是提供有关最佳Swing使用的教程,也不提供如何从中挤出所有性能的教程. BufferedImages等

import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.Random;

public class ToyTiled extends JFrame {

    private static final int IMAGE_TYPE = BufferedImage.TYPE_INT_ARGB;

    private BufferedImage img;

    public static void main( String[] args ) {
        new ToyTiled();
    }

    public ToyTiled() {
        super();
        this.add(new JPanel() {
            @Override
            protected void paintComponent(Graphics g) {
                g.drawImage(img, 0, 0, null);
            }

        });
        img = new BufferedImage( 450, 350, IMAGE_TYPE );   // here you should create a compatible BufferedImage
        this.setSize(img.getWidth(), img.getHeight());
        this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);


        final int NB_TILES = 4;
        BufferedImage[] tiles = new BufferedImage[NB_TILES];
        tiles[0] = createOneTile( new Color( 255, 255, 255 ) );
        tiles[1] = createOneTile( new Color( 255,   0, 255 ) );
        tiles[2] = createOneTile( new Color(   0,   0, 255 ) );
        tiles[3] = createOneTile( new Color(   0, 255, 255 ) );  

        final int[][] map = new int[][] {
                { 1, 0, 2, 3, 0, 1, 2, 2, 2 },
                { 0, 2, 3, 0, 1, 2, 2, 2, 3 },
                { 1, 0, 2, 3, 0, 1, 2, 2, 2 },
                { 2, 1, 0, 1, 2, 3, 2, 0, 0 },
                { 1, 0, 2, 3, 0, 1, 2, 2, 3 },
                { 1, 0, 2, 2, 1, 1, 2, 2, 3 },
                { 1, 0, 2, 3, 0, 1, 2, 2, 3 },
        };

        for (int i = 0; i < map[0].length; i++) {
            for (int j = 0; j < map.length; j++) {
                final BufferedImage tile = tiles[map[j][i]];
                for (int x = 0; x < tile.getWidth(); x++) {
                    for (int y = 0; y < tile.getHeight(); y++) {
                        img.setRGB( x + i * 50, y + j * 50, tile.getRGB(x,y) );
                    }
                }
            }
        }

        this.setVisible( true );
    }

    private BufferedImage createOneTile( final Color c ) {
        final Random r = new Random();
        final BufferedImage res = new BufferedImage( 50, 50, IMAGE_TYPE );
        for (int x = 0; x < res.getWidth(); x++) {
            for (int y = 0; y < res.getHeight(); y++) {
                res.setRGB( x, y, c.getRGB() - r.nextInt(150) );
            }
        }
        return res;
    }

}
Run Code Online (Sandbox Code Playgroud)

  • @Eddy Freeman:如果这是一个解决问题的答案,或者让你走上正轨,那么选择它作为你问题的"答案"是有礼貌的. (2认同)