0

我想用瓷砖使地图无限,但是当我进入某些部分时,它只是黑色并且不会正确渲染。这是 Screen.java 和 Game.java 的代码。Screen.java:(我认为问题出在哪里)

package com.vipgamming.Frytree.graphics;

import java.util.Random;

public class Screen {

private int width, height;
public int[] pixels;
public final int MAP_SIZE = 128;
public final int MAP_SIZE_MASK = MAP_SIZE -1;
public int[] tiles = new int [MAP_SIZE*MAP_SIZE];

private Random random = new Random();

public Screen(int width, int height) {
    this.width = width;
    this.height = height;
    pixels = new int[width * height];

    for (int i = 0; i < MAP_SIZE + MAP_SIZE; i++) {
        tiles[i] = random.nextInt (0xffffff);
    }
}

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

public void render(int xOffset, int yOffset) {
    for (int y = 0; y < height; y++) {
        int yy = y+yOffset;
        //if (yy < 0 || yy >= height ) break;
        for (int x = 0; x < width; x++) {
            int xx = x+xOffset;
            //if (xx < 0 || xx >= width) break;
            int tileIndex = ((xx >> 4) & MAP_SIZE_MASK) + ((yy >> 4) & MAP_SIZE_MASK) * 8;
            pixels[x + y * width] = tiles[tileIndex];
           }
        }
    }

 }

游戏.java

package com.vipgamming.Frytree;

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferInt;

import javax.swing.JFrame;

import com.vipgamming.Frytree.graphics.Screen;
import com.vipgamming.Frytree.input.Keyboard;

public class Game extends Canvas implements Runnable {

private static final long serialVersionUID = 1L;
public static int width = 300;
public static int height = width /16 * 10;
public static int scale = 3;
public static String title = "FryTree";

private Thread thread;
private JFrame frame;
private Keyboard key;
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();

    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() {
    long lastTime = System.nanoTime();
    long timer = System.currentTimeMillis();
    final double ns = 1000000000.0 / 60.0;
    double delta = 0;
    int frames = 0;
    int updates = 0;
    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;
                System.out.println(updates + "ups, " + frames +" fps");
                frame.setTitle(title + "  |  " + updates + "ups, " + frames +" fps");
                updates = 0;
                frames = 0;
            }
        }
    stop(); 
}
int x=0, y=0;
public void update() {
    key.update();
    if (key.up) y--;
    if (key.down) y++;
    if (key.left) x--;
    if (key.right) x++;
    }

public void render() {
    BufferStrategy bs = getBufferStrategy();
    if (bs == null) {
        createBufferStrategy(3);
        return;
    }
    screen.clear();
    screen.render(x, y);

    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();
    }
}

它没有给出任何错误。

4

1 回答 1

0

for构造函数的循环中,我认为您想要乘以MAP_SIZEMAP_SIZE而不是相加。

于 2012-10-23T13:15:53.213 回答