java.lang.ArrayIndexOutofBounds2D像素阵列上的异常
我试着做一个简单的游戏,你可以走着捡棍子。我使用2D像素阵列跟踪所有图形输出和动画。在我将所有像素值设置为0的java.lang.ArrayIndexOutofBounds2D像素阵列上的异常,java,arrays,Java,Arrays,我试着做一个简单的游戏,你可以走着捡棍子。我使用2D像素阵列跟踪所有图形输出和动画。在我将所有像素值设置为0的clear()过程中,它会给我一个ArrayIndexOutOfBoundsException 输出: Exception in thread "Display" java.lang.ArrayIndexOutOfBoundsException: 225 at com.game.sticks.Game.render(Game.java:105) at com.game.sticks.Ga
clear()
过程中,它会给我一个ArrayIndexOutOfBoundsException
输出:
Exception in thread "Display" java.lang.ArrayIndexOutOfBoundsException: 225
at com.game.sticks.Game.render(Game.java:105)
at com.game.sticks.Game.run(Game.java:82)
at java.lang.Thread.run(Unknown Source)
主要代码:
package com.game.sticks;
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 javax.swing.JFrame;
import com.game.sticks.Graphics.Screen;
import com.game.sticks.Player.Player;
public class Game extends Canvas implements Runnable{
private static final long serialVersionUID = 1L;
public static int width = 400;
public static int height = width / 16 * 9;
public static int scale = 3;
public static String title = "Pickn' Sticks";
boolean running = false;
JFrame frame = new JFrame();
Thread thread;
private Stick stick;
private Player player;
public int[][] pixels = new int[width][height];
public BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
public Game() {
}
Game(int i) {
Dimension size = new Dimension(width * scale, height * scale);
setPreferredSize(size);
}
public synchronized void start() {
thread = new Thread(this,"Display");
stick = new Stick();
player = new Player();
running = true;
thread.start();
}
public synchronized void stop() {
running = false;
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Game game = new Game(1);
game.frame.setVisible(true);
game.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
game.frame.add(game);
game.frame.pack();
game.frame.setLocationRelativeTo(null);
game.frame.setResizable(false);
game.frame.setTitle(title);
game.start();
}
public void run() {
setFocusable(true);
while (running) {
update();
render();
}
stop();
}
public void update() {
player.update();
System.out.println("updating");
}
public void render() {
BufferStrategy bs = getBufferStrategy();
if (bs == null) {
createBufferStrategy(3);
return;
}
clear();
for(int i = 0;i<width;i++) {
for(int i2 = 0;i2<height;i++) {
pixels[i][i2] = -4325345;
}
}
for(int x = 0;x < width;x++) {
for(int y = 0;y < height;y++) {
image.setRGB(x,y,pixels[x][y]);
}
}
System.out.println("rendering");
Graphics g = bs.getDrawGraphics();
g = bs.getDrawGraphics();
g.setColor(Color.green);
g.drawImage(image, 0, 0, getWidth(), getHeight(), null);
g.dispose();
bs.show();
}
private void clear() {
for(int i = 0; i<width; i++) {
for(int i2 = 0; i2<height; i++) {
pixels[i][i2] = 0;
}
}
}
}
package com.game.sticks;
导入java.awt.Canvas;
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.Graphics;
导入java.awt.image.BufferStrategy;
导入java.awt.image.buffereImage;
导入javax.swing.JFrame;
导入com.game.sticks.Graphics.Screen;
导入com.game.sticks.Player.Player;
公共类游戏扩展画布实现可运行{
私有静态最终长serialVersionUID=1L;
公共静态整数宽度=400;
公共静态内部高度=宽度/16*9;
公共静态int标度=3;
公共静态字符串title=“Pickn”Sticks”;
布尔运行=假;
JFrame=新JFrame();
螺纹;
私人棍棒;
私人玩家;
公共整数[]像素=新整数[宽度][高度];
公共BuffereImage=新的BuffereImage(宽度、高度、BuffereImage.TYPE_INT_RGB);
公共游戏(){
}
游戏(国际一){
尺寸尺寸=新尺寸(宽度*比例,高度*比例);
设置首选大小(大小);
}
公共同步的void start(){
线程=新线程(此“显示”);
斗杆=新斗杆();
player=新玩家();
运行=真;
thread.start();
}
公共同步无效停止(){
运行=错误;
试一试{
thread.join();
}捕捉(中断异常e){
e、 printStackTrace();
}
}
公共静态void main(字符串[]args){
游戏=新游戏(1);
game.frame.setVisible(true);
game.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
game.frame.add(游戏);
game.frame.pack();
game.frame.setLocationRelativeTo(空);
game.frame.setresizeable(false);
游戏.框架.设置标题(标题);
game.start();
}
公开募捐{
设置聚焦(真);
(跑步时){
更新();
render();
}
停止();
}
公共无效更新(){
player.update();
System.out.println(“更新”);
}
公共无效呈现(){
BufferStrategy bs=getBufferStrategy();
如果(bs==null){
创新战略(3);
返回;
}
清除();
对于(inti=0;i您的内部for循环中有一个输入错误。您应该增加i2而不是i
private void clear() {
for(int i = 0; i<width; i++) {
for(int i2 = 0; i2<height; i2++) {
pixels[i][i2] = 0;
}
}
}
private void clear(){
for(int i=0;i有两种类型。首先,在第104行的for循环中,递增器应该是i2++而不是i++。它应该如下所示:
for(int i = 0;i<width;i++) {
for(int i2 = 0;i2<height;i2++) { //The change is from i++ to i2++
pixels[i][i2] = -4325345;
}
}
for(inti=0;i您的程序实际上犯了两个错误。因为您只需复制和粘贴代码
第一个是private void clear()
方法
谢谢。我当时正在复制和粘贴嵌套for循环,我想我犯了一个愚蠢的错误。我现在会注意的。
private void clear() {
for(int i = 0;i<width;i++) {
for(int i2 = 0;i2<height;i++) {
pixels[i][i2] = 0;
}
}
}
for(int i = 0;i<width;i++) {
for(int i2 = 0;i2<height;i++) {
pixels[i][i2] = -4325345;
}
}