是否可以动态地将图像添加到bufferedImage

时间:2017-11-15 18:31:07

标签: java image game-engine bufferedimage

我正在开发一款小型游戏,它使用图像在一个关卡中生成房间。我使用图像,所以我可以使用以下代码读取不同的颜色并相应地设置房间:

private void addImage(BufferedImage image, int x, int y){
        int w = image.getWidth();
        int h = image.getHeight();
        boolean playerSpawned = false;
        Random r = new Random();
        int fails = 0;

        for (int imageX = x; imageX < w; imageX++)
            for (int imageY = y; imageY < h; imageY++){
                int pixel = image.getRGB(imageX, imageY);

                int green = (pixel >> 8) & 0xff;
                int blue = (pixel) & 0xff;
                int red = (pixel >> 16) & 0xff;

                if(blue == 255)
                    if((!playerSpawned && (r.nextInt(4) + 1) == 4) || fails == 3){
                    handler.addObject(new Player(imageX * 32, imageY * 32, ID.player, handler,this));
                    playerSpawned = true;
                    } else {
                        fails++;
                    }
                if(blue == 200) // handle rotation
                    handler.addObject(new door(imageX * 32, imageY * 32, ID.door,this,0));
                if(green == 0 && red == 0 && blue == 0)
                    if(r.nextInt(100) == r.nextInt(200))
                        handler.addObject(new enemy(imageX * 32, imageY * 32, ID.enemy, handler,this));
            }

        for (int imageX = 0; imageX < w; imageX++)
            for (int imageY = 0; imageY < h; imageY++){
                int pixel = image.getRGB(imageX, imageY);

                int red = (pixel >> 16) & 0xff;

                if(red == 255)
                    handler.addObject(new Block(imageX * 32, imageY * 32, ID.block,this,0));
                if(red == 200)
                    handler.addObject(new Block(imageX * 32, imageY * 32, ID.block,this,1));
                if(red == 175)
                    handler.addObject(new Block(imageX * 32, imageY * 32, ID.block,this,2));
                if(red == 150)
                    handler.addObject(new Block(imageX * 32, imageY * 32, ID.block,this,3));
                if(red == 125)
                    handler.addObject(new Block(imageX * 32, imageY * 32, ID.block,this,4));
            }
    }

这是我用来生成关卡的图像示例。黑色像素只是空白区域,而红色像素产生块,蓝色像素产生在某些条件下打开的门。

enter image description here

我使用此方法生成的第一个房间工作正常。问题是我无法弄清楚如何在关卡中添加房间。我想说的是我可以根据玩家离开房间的方向添加一个房间。(如果玩家向南走到一个房间,我希望它在他的南边生成一个房间。)

为了检测播放器的方向,我使用此功能打印正确的方向:

public room nextRoom(int xx, int yy){
        int numX = 0, numY = 0;

        if(xx > this.x + 1024 + 32){
            numX++;
            System.out.println("right");
        }
        if(xx < this.x){
            numX--;
        System.out.println("left");
        }
        if(yy > this.y + 576 + 32){
            System.out.println("up");
            numY++;
        }
        if(yy < this.y){
            System.out.println("down");
            numY--;
        }

        new room(content, numX, numY, manager, game, handler).toString();
        return new room(content, numX, numY, manager, game, handler);
    }

这里&#39; numX&#39;和#num;&#39;是基于中央房间的房间坐标(中心房间有坐标(0,0),而右边有坐标(1,0)。然后我用这些坐标来计算房间的最终尺寸,以像素为单位)

这个函数返回它应该生成的房间,然后像这样加载:

addImage(new bufferedImageLoader().loadImage("/level_base.png"), room.getX(), room.getY());
            addImage(room.getContent(), room.getX(), room.getY());

&#39; addImage()&#39;是上面写的问题中的函数!

此处要加载的第一个项目是基础,第二个图像是确定房间内容的叠加层。

问题在于,每当我尝试加载新房间时,只显示背景而不是新添加的块。它还删除了玩家刚刚离开的房间的背景,但在那里留下了块......

有人知道如何在这个系统中添加房间吗?

0 个答案:

没有答案