如何渲染不同大小的瓷砖?

时间:2016-02-17 14:25:22

标签: java 2d tile

所以我有我的Tile课程:

    import java.awt.Graphics;
    import java.awt.image.BufferedImage;

    public class Tile {

    public static Tile[] tiles = new Tile[256];
    public static Tile airTile = new AirTile(0);
    public static Tile grassTile = new GrassTile(1);
    public static Tile dirtTile = new DirtTile(2);
    public static Tile rockTile = new RockTile(3);
    //public static Tile anvilTile = new AnvilTile(50);


    public static int w, h;
    public static final int TILE_WIDTH = 64, TILE_HEIGHT = 64;

    private BufferedImage texture;
    protected final int id;

    public Tile(BufferedImage texture, int id, int w, int  h){
        this.texture = texture;
        this.id = id;
        this.h = h;
        this.w = w;

        tiles[id] = this;

    }

    public void tick(){

    }

    public void render(Graphics g, int x, int y){
        g.drawImage(texture, x, y, w, h, null);
    }

    public boolean isSolid(){
        return false;

    }



    public int getId(){
        return id;
    }

    public int getWidth(){
        return w;
    }

    public int getHeight(){
        return h;
    }
    }

这是一个DirtTile类的例子

 import java.awt.image.BufferedImage;

 public class DirtTile extends Tile{

public DirtTile(int id) {
    super(Assets.dirt, id, 64, 64);

}

@Override
public boolean isSolid(){
    return false;
}

}

正如你所看到的,我的DirtTile类正在为我的Tile类提供它的宽度和高度,但是我想尝试制作更宽的图块(128 x 64):

package com.zetcode;

import java.awt.image.BufferedImage;

public class AnvilTile extends Tile{

public AnvilTile(int id) {
    super(Assets.anvil, id, 128, 64);

}

}

这样做可以将每个Tile设置为128px宽,我只希望AnvilTile类的宽度为128px,所以基本上我必须在我的Tile类中对Render方法进行更改,但是我不知道如何要做到这一点,任何建议将不胜感激。

1 个答案:

答案 0 :(得分:1)

这是因为您的wh字段是静态的,并且这些值在所有Tile个实例中共享。因此,当您创建新的AnvilTile对象时,对super的调用会将所有实例中的wh字段分别设置为128和64.

删除static修饰符以获得所需结果。现在这些字段是实例变量,这意味着每个Tile实例都有自己的wh值。