2016-02-17 4 views
1

поэтому у меня плитка класс:Как отредактировать плитки разных размеров?

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 дает мой класс плитки это ширина и высота, однако я хотел чтобы попытаться сделать более широкую плитку (128 х 64):

package com.zetcode; 

import java.awt.image.BufferedImage; 

public class AnvilTile extends Tile{ 

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

} 

}

Выполнение этого устанавливает, что каждая плитка имеет ширину 128 пикселей, я хочу, чтобы класс AnvilTile имел ширину 128 пикселей, поэтому в основном мне придется внести изменения в метод Render в моем классе Tile, однако я не знаю, как это сделать, Любые предложения будут ценны.

+0

Проблема заключается в этой строке 'public static int w, h;'. Подсказка: это связано с использованием ключевого слова 'static'. - Кстати, я бы предположил, что ваш редактор предупредит вас об этом в вашем конструкторе. – Thomas

+0

Какая глупая ошибка, спасибо! – Alex

ответ

1

Это потому, что ваши поля w и h являются статическими, и эти значения являются общими для всех экземпляров Tile. Поэтому, когда вы создаете новый объект AnvilTile, вызов super устанавливает поляи h по всем экземплярам на 128 и 64 соответственно.

Удалите модификатор static для достижения желаемого результата. Теперь поля являются переменными экземпляра, что означает, что каждый экземпляр Tile имеет свои собственные значения для w и h.

Смежные вопросы