Улучшения Java и NullPointerException - PullRequest
1 голос
/ 14 марта 2012

Это мой первый пост, поэтому извините, если я сделаю какие-либо ошибки. : /

Хорошо, я работал над битой с java прежде, чем никогда не пытался сделать игру до сих пор. Я пытался сделать простой платформер с помощью Walls, но мне было трудно. У меня есть простая настройка кода:

Люди хотели получить трассировку стека. (Старый я исправил это, но я получил новую ошибку, см. Далее)

java.lang.NullPointerException
at Start.start(Start.java:27)
at sun.applet.AppletPanel.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

(старое) исключение:

java.lang.NullPointerException
at level.getStartDirt(level.java:9)
at Start.start(Start.java:28)
at sun.applet.AppletPanel.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

новейшая трассировка стека:

Exception in thread "AWT-EventQueue-1" java.lang.NullPointerException
at Start.paint(Start.java:75)
at Start.update(Start.java:67)
at sun.awt.RepaintArea.updateComponent(Unknown Source)
at sun.awt.RepaintArea.paint(Unknown Source)
at sun.awt.windows.WComponentPeer.handleEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$000(Unknown Source)
at java.awt.EventQueue$1.run(Unknown Source)
at java.awt.EventQueue$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$2.run(Unknown Source)
at java.awt.EventQueue$2.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

Строка 75:

level.paint(g);

Строка 68:

paint(doubleG);

Стартовый класс:

import java.applet.Applet;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;


public class Start extends Applet implements Runnable, KeyListener{

private Image i;
private Graphics doubleG;
//--Square s1;
Dirt dirt[];
level lvl;

@Override
public void init() {
    this.setSize(800, 600);
    addKeyListener(this);

}

@Override
public void start(){
            level lvl = new level();
    Thread thread = new Thread(this);
    thread.start();
    lvl.getStartDirt();
}

@Override
public void run() {
    //thread information

    while(true){
        //--s1.update(this);
        repaint();      

        try {
            Thread.sleep(17);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

@Override
public void destroy() {

}

@Override
public void update(Graphics g) {
    if(i == null)
    {
        i = createImage(this.getWidth(), this.getHeight());
        doubleG = i.getGraphics();
    }

    doubleG.setColor(getBackground());
    doubleG.fillRect(0, 0, this.getWidth(), this.getHeight());

    doubleG.setColor(getForeground());
    paint(doubleG);

    g.drawImage(i, 0, 0, this);

}

@Override
public void paint(Graphics g) {
    lvl.getPaintDirt(g);
    //--s1.paint(g);
}

@Override
public void keyPressed(KeyEvent e) {


}

@Override
public void keyReleased(KeyEvent e) {


}

@Override
public void keyTyped(KeyEvent e) {


}

}

Sqaure класс:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;


public class Square {

private int x = 500;
private int y = 25;
private int width = 50;
private int height = 50;
private double dx = 0;
private double dy = 0;
private double gravity = 15;
private double energyloss = .65;
private double xFriction = .9;
private double dt = .2;

public Square(int sx, int sy){
    x = sx;
    y = sy;

}

public void update(Start sp){
    if (x < 0){
        x = 0;
        dx = -dx;
    }else if (x > sp.getWidth() - 50){

        x = sp.getWidth() - 50;
        dx = -dx;
    }else{
        x += dx;
    }


    if(y == sp.getHeight() - 50 -1){
        dx *= xFriction;
        if (Math.abs(dx) < .8){
            dx = 0;
        }
    }

    //gravity
    //if(y > sp.getHeight() - 51){
    //  y = sp.getHeight() - 51;
    //  dy *= energyloss;
    //  dy *= -1;
    //}else{
    //  if (Math.abs(dy)< (gravity/dt)/5.25 && y == sp.getHeight() - 51){
    //      dy = 0;
    //      y = sp.getHeight() - 51;
    //  }


        //position  formula
        y += dy*dt + .5*gravity*dt*dt;
        dy += gravity *dt;


}

public Rectangle getBoundries(){
    Rectangle rect = new Rectangle(x, y, width, height);
    return rect;
}

public void paint(Graphics g) {
    g.setColor(Color.red);
    g.fillRect(x, y, 50, 50);

}

}

Класс грязи:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;

public class Dirt {

int x,y,width,height;

public Dirt(int sx, int sy){
    x = sx;
    y = sy;
    width = 50;
    height = 50;
}

public void destroy() {

}

public void paint(Graphics g) {
    g.setColor(Color.orange);
    g.fillRect(x, y, 50, 50);

}

public Rectangle getBoundries(){
    Rectangle rect = new Rectangle(x, y, width, height);
    return rect;
}

}

класс уровня:

import java.awt.Graphics;


public class level {
Dirt d[] = new Dirt[9];

public Dirt[] getStartDirt(){

    d[1] = new Dirt(400, 600);
    d[1] = new Dirt(0, 600);
    d[2] = new Dirt(50, 600);
    d[3] = new Dirt(100, 600);
    d[4] = new Dirt(150, 600);
    d[5] = new Dirt(200, 600);
    d[6] = new Dirt(250, 600);
    d[7] = new Dirt(300, 600);
    d[8] = new Dirt(350, 600);


    return d;
}

public void getPaintDirt(Graphics g){

            d[0].paint(g);
    d[1].paint(g);
    d[2].paint(g);
    d[3].paint(g);
    d[1].paint(g);
    d[4].paint(g);
    d[5].paint(g);
    d[6].paint(g);
    d[7].paint(g);
    d[8].paint(g);
}

}

Еще несколько вопросов: -Я получаю исключение NullPointerException при запуске, почему / что это значит? -Есть более простой способ сделать несколько штук Dirt на lvl? -Я слышал, что есть лучший способ сделать столкновение (@ dirt.getBoundries w / intersect)

Спасибо! Привет, Тим.

1 Ответ

2 голосов
/ 15 марта 2012

Комментарии к вашему вопросу имеют хорошее значение. При быстром взгляде не похоже, что вы создаете переменную lvl - разве это делается через DI?

Но трассировка стека обычно дает вам точную строку, которая является проблемой.

...