Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 2D滚动-背景不显示_Java_Scroll - Fatal编程技术网

Java 2D滚动-背景不显示

Java 2D滚动-背景不显示,java,scroll,Java,Scroll,我正在尝试制作一个滚动游戏——玩家(在空间中)一直处于屏幕中央。当他左右上下移动时,背景精灵片将随机生成彩色星星-因此移动的星星将指示玩家移动的方向 我现在面临的问题是,当我运行游戏时,星星没有显示出来。每个瓷砖都应该是32x32,每个瓷砖至少包含一颗星星,“nostars”瓷砖是空的。当我运行游戏时,我只得到一个黑屏 RandomLevel.java: protected void generateLevel() { for(int y = 0; y < height; y++)

我正在尝试制作一个滚动游戏——玩家(在空间中)一直处于屏幕中央。当他左右上下移动时,背景精灵片将随机生成彩色星星-因此移动的星星将指示玩家移动的方向

我现在面临的问题是,当我运行游戏时,星星没有显示出来。每个瓷砖都应该是32x32,每个瓷砖至少包含一颗星星,“nostars”瓷砖是空的。当我运行游戏时,我只得到一个黑屏

RandomLevel.java:

protected void generateLevel() {
    for(int y = 0; y < height; y++) {
        for(int x = 0; x < width; x++) {
            bgtiles[x + y * width] = random.nextInt(4);
        }
    }
}
Sprite.java

public void render(int xScroll, int yScroll, Screen screen) {
    screen.setOffset(xScroll, yScroll);

    int x0 = xScroll >> 5;
    int x1 = (xScroll + screen.width + 32) >> 5;
    int y0 = yScroll >> 5;
    int y1 = (yScroll + screen.height + 32) >> 5;

    for(int y = y0; y < y1; y++) {
        for(int x = x0; x < x1; x++) {
            getTile(x, y).render(x, y, screen);
        }
    }
}
public Tile getTile(int x, int y) {
if(x < 0 || y < 0 || x >= width || y >= height) return Tile.nostars;
    if(bgtiles[x + y * width] == 0) return Tile.stars1;
    if(bgtiles[x + y * width] == 1) return Tile.stars2;
    if(bgtiles[x + y * width] == 2) return Tile.stars3;
    if(bgtiles[x + y * width] == 3) return Tile.stars4;

    else return Tile.nostars;
}
public class SpaceTile extends Tile {

   public SpaceTile(Sprite sprite) {
    super(sprite);
}

public void render(int x, int y, Screen screen) {
    screen.renderTile(x << 5, y << 5, this);
}
public static SpriteSheet bgtiles = new SpriteSheet("/textures/bgsheet.png", 256);
public static Sprite spaceSprite = new Sprite(32, 0, 0, SpriteSheet.bgtiles);
public static Sprite stars1 = new Sprite(64, 0, 0, SpriteSheet.bgtiles);
public static Sprite stars2 = new Sprite(96, 0, 0, SpriteSheet.bgtiles);
public static Sprite stars3 = new Sprite(128, 0, 0, SpriteSheet.bgtiles);
public static Sprite stars4 = new Sprite(160, 0, 0, SpriteSheet.bgtiles);
public class Tile {

public int x, y;
public Sprite sprite;

public static Tile nostars = new SpaceTile(Sprite.spaceSprite);
public static Tile stars1 = new SpaceTile(Sprite.stars1);
public static Tile stars2 = new SpaceTile(Sprite.stars2);
public static Tile stars3 = new SpaceTile(Sprite.stars3);
public static Tile stars4 = new SpaceTile(Sprite.stars4);

public Tile(Sprite sprite) {
    this.sprite = sprite;
}

public void render(int x, int y, Screen screen) {   
}

public boolean solid() {
    return false;
}
public class Game extends Canvas implements Runnable { 
private static final long serialVersionUID = 1L;

public static int width = 300;
public static int height = width / 16 * 9;
public static int scale = 3;

public static String title = "Game";

private Thread thread;
private JFrame frame;
private Keyboard key;
private Level level;
private boolean running = false;

private Screen screen;

private BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
private int[] pixels = ((DataBufferInt) image.getRaster().getDataBuffer()).getData();

public Game() {
    Dimension size = new Dimension(width * scale, height * scale);
    setPreferredSize(size);

    screen = new Screen(width, height);
    frame = new JFrame();
    key = new Keyboard();
    level = new RandomLevel(64, 64);

    addKeyListener(key);
}

public synchronized void start() {
    running = true;
    thread = new Thread(this, "Display");
    thread.start();
}

public synchronized void stop() {
    running = false;
    try {
        thread.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

public void run() {
    double ns = 1000000000.0 / 60.0;
    double delta = 0;

    int frames = 0;
    int updates = 0;

    long lastTime = System.nanoTime();
    long timer = System.currentTimeMillis();

    requestFocus();

    while (running) {
        long now = System.nanoTime();

        delta += (now - lastTime) / ns;
        lastTime = now;

        while(delta >= 1) {
            update();
            updates++;
            delta--;
        }

        render();
        frames++;

        if(System.currentTimeMillis() - timer >= 1000) {
            timer += 1000;
            frame.setTitle(title + "  |  " + updates + " ups, " + frames + " fps");
            frames = 0;
            updates = 0;
        }
    }

    stop();
}

int x, y = 0;

public void update() {
    key.update();
    if(key.up == true) y--;
    if(key.down == true) y++;
    if(key.left == true) x--;
    if(key.right == true) x++;
}

public void render() {
    BufferStrategy bs = getBufferStrategy();
    if (bs == null) {
        createBufferStrategy(3);
        return;
    }

    screen.clear();
    level.render(x, y, screen);

    for(int i = 0; i < pixels.length; i++) {
        pixels[i] = screen.pixels[i];
    }

    Graphics g = bs.getDrawGraphics();
    g.drawImage(image, 0, 0, getWidth(), getHeight(), null);
    g.dispose();
    bs.show();
}

public static void main(String[] args) {
    Game game = new Game();
    game.frame.setResizable(false);
      game.frame.setTitle(Game.title);
      game.frame.add(game);
      game.frame.pack();
      game.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      game.frame.setLocationRelativeTo(null);
      game.frame.setVisible(true);

    game.start();
}

}
Tile.java

public void render(int xScroll, int yScroll, Screen screen) {
    screen.setOffset(xScroll, yScroll);

    int x0 = xScroll >> 5;
    int x1 = (xScroll + screen.width + 32) >> 5;
    int y0 = yScroll >> 5;
    int y1 = (yScroll + screen.height + 32) >> 5;

    for(int y = y0; y < y1; y++) {
        for(int x = x0; x < x1; x++) {
            getTile(x, y).render(x, y, screen);
        }
    }
}
public Tile getTile(int x, int y) {
if(x < 0 || y < 0 || x >= width || y >= height) return Tile.nostars;
    if(bgtiles[x + y * width] == 0) return Tile.stars1;
    if(bgtiles[x + y * width] == 1) return Tile.stars2;
    if(bgtiles[x + y * width] == 2) return Tile.stars3;
    if(bgtiles[x + y * width] == 3) return Tile.stars4;

    else return Tile.nostars;
}
public class SpaceTile extends Tile {

   public SpaceTile(Sprite sprite) {
    super(sprite);
}

public void render(int x, int y, Screen screen) {
    screen.renderTile(x << 5, y << 5, this);
}
public static SpriteSheet bgtiles = new SpriteSheet("/textures/bgsheet.png", 256);
public static Sprite spaceSprite = new Sprite(32, 0, 0, SpriteSheet.bgtiles);
public static Sprite stars1 = new Sprite(64, 0, 0, SpriteSheet.bgtiles);
public static Sprite stars2 = new Sprite(96, 0, 0, SpriteSheet.bgtiles);
public static Sprite stars3 = new Sprite(128, 0, 0, SpriteSheet.bgtiles);
public static Sprite stars4 = new Sprite(160, 0, 0, SpriteSheet.bgtiles);
public class Tile {

public int x, y;
public Sprite sprite;

public static Tile nostars = new SpaceTile(Sprite.spaceSprite);
public static Tile stars1 = new SpaceTile(Sprite.stars1);
public static Tile stars2 = new SpaceTile(Sprite.stars2);
public static Tile stars3 = new SpaceTile(Sprite.stars3);
public static Tile stars4 = new SpaceTile(Sprite.stars4);

public Tile(Sprite sprite) {
    this.sprite = sprite;
}

public void render(int x, int y, Screen screen) {   
}

public boolean solid() {
    return false;
}
public class Game extends Canvas implements Runnable { 
private static final long serialVersionUID = 1L;

public static int width = 300;
public static int height = width / 16 * 9;
public static int scale = 3;

public static String title = "Game";

private Thread thread;
private JFrame frame;
private Keyboard key;
private Level level;
private boolean running = false;

private Screen screen;

private BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
private int[] pixels = ((DataBufferInt) image.getRaster().getDataBuffer()).getData();

public Game() {
    Dimension size = new Dimension(width * scale, height * scale);
    setPreferredSize(size);

    screen = new Screen(width, height);
    frame = new JFrame();
    key = new Keyboard();
    level = new RandomLevel(64, 64);

    addKeyListener(key);
}

public synchronized void start() {
    running = true;
    thread = new Thread(this, "Display");
    thread.start();
}

public synchronized void stop() {
    running = false;
    try {
        thread.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

public void run() {
    double ns = 1000000000.0 / 60.0;
    double delta = 0;

    int frames = 0;
    int updates = 0;

    long lastTime = System.nanoTime();
    long timer = System.currentTimeMillis();

    requestFocus();

    while (running) {
        long now = System.nanoTime();

        delta += (now - lastTime) / ns;
        lastTime = now;

        while(delta >= 1) {
            update();
            updates++;
            delta--;
        }

        render();
        frames++;

        if(System.currentTimeMillis() - timer >= 1000) {
            timer += 1000;
            frame.setTitle(title + "  |  " + updates + " ups, " + frames + " fps");
            frames = 0;
            updates = 0;
        }
    }

    stop();
}

int x, y = 0;

public void update() {
    key.update();
    if(key.up == true) y--;
    if(key.down == true) y++;
    if(key.left == true) x--;
    if(key.right == true) x++;
}

public void render() {
    BufferStrategy bs = getBufferStrategy();
    if (bs == null) {
        createBufferStrategy(3);
        return;
    }

    screen.clear();
    level.render(x, y, screen);

    for(int i = 0; i < pixels.length; i++) {
        pixels[i] = screen.pixels[i];
    }

    Graphics g = bs.getDrawGraphics();
    g.drawImage(image, 0, 0, getWidth(), getHeight(), null);
    g.dispose();
    bs.show();
}

public static void main(String[] args) {
    Game game = new Game();
    game.frame.setResizable(false);
      game.frame.setTitle(Game.title);
      game.frame.add(game);
      game.frame.pack();
      game.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      game.frame.setLocationRelativeTo(null);
      game.frame.setVisible(true);

    game.start();
}

}
}

Game.java

public void render(int xScroll, int yScroll, Screen screen) {
    screen.setOffset(xScroll, yScroll);

    int x0 = xScroll >> 5;
    int x1 = (xScroll + screen.width + 32) >> 5;
    int y0 = yScroll >> 5;
    int y1 = (yScroll + screen.height + 32) >> 5;

    for(int y = y0; y < y1; y++) {
        for(int x = x0; x < x1; x++) {
            getTile(x, y).render(x, y, screen);
        }
    }
}
public Tile getTile(int x, int y) {
if(x < 0 || y < 0 || x >= width || y >= height) return Tile.nostars;
    if(bgtiles[x + y * width] == 0) return Tile.stars1;
    if(bgtiles[x + y * width] == 1) return Tile.stars2;
    if(bgtiles[x + y * width] == 2) return Tile.stars3;
    if(bgtiles[x + y * width] == 3) return Tile.stars4;

    else return Tile.nostars;
}
public class SpaceTile extends Tile {

   public SpaceTile(Sprite sprite) {
    super(sprite);
}

public void render(int x, int y, Screen screen) {
    screen.renderTile(x << 5, y << 5, this);
}
public static SpriteSheet bgtiles = new SpriteSheet("/textures/bgsheet.png", 256);
public static Sprite spaceSprite = new Sprite(32, 0, 0, SpriteSheet.bgtiles);
public static Sprite stars1 = new Sprite(64, 0, 0, SpriteSheet.bgtiles);
public static Sprite stars2 = new Sprite(96, 0, 0, SpriteSheet.bgtiles);
public static Sprite stars3 = new Sprite(128, 0, 0, SpriteSheet.bgtiles);
public static Sprite stars4 = new Sprite(160, 0, 0, SpriteSheet.bgtiles);
public class Tile {

public int x, y;
public Sprite sprite;

public static Tile nostars = new SpaceTile(Sprite.spaceSprite);
public static Tile stars1 = new SpaceTile(Sprite.stars1);
public static Tile stars2 = new SpaceTile(Sprite.stars2);
public static Tile stars3 = new SpaceTile(Sprite.stars3);
public static Tile stars4 = new SpaceTile(Sprite.stars4);

public Tile(Sprite sprite) {
    this.sprite = sprite;
}

public void render(int x, int y, Screen screen) {   
}

public boolean solid() {
    return false;
}
public class Game extends Canvas implements Runnable { 
private static final long serialVersionUID = 1L;

public static int width = 300;
public static int height = width / 16 * 9;
public static int scale = 3;

public static String title = "Game";

private Thread thread;
private JFrame frame;
private Keyboard key;
private Level level;
private boolean running = false;

private Screen screen;

private BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
private int[] pixels = ((DataBufferInt) image.getRaster().getDataBuffer()).getData();

public Game() {
    Dimension size = new Dimension(width * scale, height * scale);
    setPreferredSize(size);

    screen = new Screen(width, height);
    frame = new JFrame();
    key = new Keyboard();
    level = new RandomLevel(64, 64);

    addKeyListener(key);
}

public synchronized void start() {
    running = true;
    thread = new Thread(this, "Display");
    thread.start();
}

public synchronized void stop() {
    running = false;
    try {
        thread.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

public void run() {
    double ns = 1000000000.0 / 60.0;
    double delta = 0;

    int frames = 0;
    int updates = 0;

    long lastTime = System.nanoTime();
    long timer = System.currentTimeMillis();

    requestFocus();

    while (running) {
        long now = System.nanoTime();

        delta += (now - lastTime) / ns;
        lastTime = now;

        while(delta >= 1) {
            update();
            updates++;
            delta--;
        }

        render();
        frames++;

        if(System.currentTimeMillis() - timer >= 1000) {
            timer += 1000;
            frame.setTitle(title + "  |  " + updates + " ups, " + frames + " fps");
            frames = 0;
            updates = 0;
        }
    }

    stop();
}

int x, y = 0;

public void update() {
    key.update();
    if(key.up == true) y--;
    if(key.down == true) y++;
    if(key.left == true) x--;
    if(key.right == true) x++;
}

public void render() {
    BufferStrategy bs = getBufferStrategy();
    if (bs == null) {
        createBufferStrategy(3);
        return;
    }

    screen.clear();
    level.render(x, y, screen);

    for(int i = 0; i < pixels.length; i++) {
        pixels[i] = screen.pixels[i];
    }

    Graphics g = bs.getDrawGraphics();
    g.drawImage(image, 0, 0, getWidth(), getHeight(), null);
    g.dispose();
    bs.show();
}

public static void main(String[] args) {
    Game game = new Game();
    game.frame.setResizable(false);
      game.frame.setTitle(Game.title);
      game.frame.add(game);
      game.frame.pack();
      game.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      game.frame.setLocationRelativeTo(null);
      game.frame.setVisible(true);

    game.start();
}

}
公共类游戏扩展画布实现可运行{
私有静态最终长serialVersionUID=1L;
公共静态整数宽度=300;
公共静态内部高度=宽度/16*9;
公共静态int标度=3;
公共静态字符串title=“游戏”;
私有线程;
私有JFrame;
私钥;
私人层面;
私有布尔运行=false;
私人屏幕;
私有BuffereImage=新的BuffereImage(宽度、高度、BuffereImage.TYPE_INT_RGB);
私有int[]像素=((DataBufferInt)image.getRaster().getDataBuffer()).getData();
公共游戏(){
尺寸尺寸=新尺寸(宽度*比例,高度*比例);
设置首选大小(大小);
屏幕=新屏幕(宽度、高度);
frame=新的JFrame();
键=新键盘();
级别=新的随机级别(64,64);
addKeyListener(键);
}
公共同步的void start(){
运行=真;
线程=新线程(此“显示”);
thread.start();
}
公共同步无效停止(){
运行=错误;
试一试{
thread.join();
}捕捉(中断异常e){
e、 printStackTrace();
}
}
公开募捐{
双ns=100000000.0/60.0;
双增量=0;
int帧=0;
int=0;
long lastTime=System.nanoTime();
长定时器=System.currentTimeMillis();
requestFocus();
(跑步时){
long now=System.nanoTime();
增量+=(现在-上次)/ns;
上次=现在;
而(增量>=1){
更新();
更新++;
三角洲--;
}
render();
frames++;
if(System.currentTimeMillis()-计时器>=1000){
定时器+=1000;
frame.setTitle(title+“|”+更新+“ups”+“frames+“fps”);
帧=0;
更新=0;
}
}
停止();
}
int x,y=0;
公共无效更新(){
key.update();
如果(key.up==true)y--;
如果(key.down==true)y++;
如果(key.left==true)x--;
如果(key.right==true)x++;
}
公共无效呈现(){
BufferStrategy bs=getBufferStrategy();
如果(bs==null){
创新战略(3);
返回;
}
screen.clear();
渲染级别(x、y、屏幕);
对于(int i=0;i
bgsheet.png

在generatelevel()中,我只尝试使用前4个tile,而不是全部64个tile

当我运行游戏时,我希望看到4颗不同的星星分散在各处,但我只是得到一个黑屏


提前感谢您的帮助

从发布的代码来看,您似乎忘记将背景加载到图像中。我将此代码放入名为loadAssets()的新公共方法中。在调用game.start()之前调用此函数

我还在render()中注释掉了以下代码

screen.clear();
渲染级别(x、y、屏幕);
对于(int i=0;i
据我所知,您使用BuffereImage image调用绘图,但实际上尚未将图像数据加载到变量image中。我将提供一个代码片段,您可能需要对其进行一些裁剪

 File imageFile = new File("/path/to/image.file");
 BufferedImage image = ImageIO.read(imageFile);
可能会有一种更快的方法,正如您刚才所说的

private BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
但正如您可能想象的那样,这实际上并没有将图像变量连接到图像文件。我最好的猜测是,我提供的代码将工作,但老实说,你必须尝试它


如果您有任何问题,请留言

问题很简单,我对每个精灵都有错误的坐标。抱歉浪费了你的时间,谢谢你的帮助

public static Sprite spaceSprite = new Sprite(32, 0, 0, SpriteSheet.bgtiles);
public static Sprite stars1 = new Sprite(32, 1, 0, SpriteSheet.bgtiles);
public static Sprite stars2 = new Sprite(32, 2, 0, SpriteSheet.bgtiles);
public static Sprite stars3 = new Sprite(32, 3, 0, SpriteSheet.bgtiles);
public static Sprite stars4 = new Sprite(32, 4, 0, SpriteSheet.bgtiles);

你能添加一些上下文吗?您是用纯Java构建它还是使用库?如果只是Java,请列出您用于渲染的JComponent的代码。只是Java-已添加到游戏classI中,我到目前为止还不太走运-很抱歉,这是一个noob,但这段代码应该放在哪里?@Oliver我在您调用addKeyListener之后放置了整个try块。这不是添加代码的最佳位置,但它确实使代码正常工作。我会添加一个loadAssets方法(参见编辑的代码)并在开始之前调用它。这似乎会使星星出现,但不是以平铺的形式出现-图像刚刚被拉伸并放置在屏幕上;他们并不是随机的generated@Oliver在绘制方法中使用缓冲图像的宽度/高度。这应该可以防止它拉伸。但是瓷砖仍然没有被渲染。我正在尝试将bgsheet.png拆分为64个平铺,即64个不同的星星,并在屏幕上随机生成它们,而不是简单地将整个图像绘制到屏幕上。