1

私は acm ライブラリ (acm.jar) を使用しています。スタンフォード大学の学生が Java コース CS106A でグラフィカル アプリケーションを簡単に作成するために使用したのと同じライブラリです。

acm.jar はhttp://jtf.acm.org/にあります。

次のコードは、キャラクター スプライトをグラフィックス ウィンドウに追加します。z を押すと、キャラクターが弓を動かしながらアニメートし、Java スレッドを使用して垂直方向に動く矢がスポーンし始めます。今のところエラーはありません。

スレッド化された で衝突検出を実行できるようにしたいと考えていますGImage object(linkArrow)。これを実行しようとすると、プログラムでエラーが発生しました。

arrowPoint = new GPoint(linkArrow.getX(),linkArrow.getY());
arrowObject = getElementAt(arrowPoint);

次のエラーが表示されます。

Exception in thread "AWT-EventQueue-1" java.lang.NullPointerException

ctrl+f を押して bug と入力すると、プログラムのエラーの場所を確認できます。

ゲーム「BreakOut」に と を使用してグラフィカルな長方形と楕円形を使用する前に、衝突検出を行いましたが、 と を使用しても問題はありませGPointんでした。getElementAtGPointgetElementAt

これが私のコードです。最初のクラスは、スレッドを実行するメインプログラムです。2 番目のクラスはスレッドです。

        import java.awt.event.KeyEvent;
        import acm.graphics.GImage;
        import acm.program.GraphicsProgram;
        import acm.util.RandomGenerator;

        public class Link extends GraphicsProgram {


            private static final double GRAVITY = 1;
            public void init(){
                setSize(APPLICATION_WIDTH, APPLICATION_HEIGHT);
                addLink();

                addKeyListeners();
        }


            private void addLink(){
                linkCharacter = new GImage("link sprites/linkFaceRight/link_frame_1_face_right.png");
                add(linkCharacter,link_Location_XCoord,link_Location_YCoord);
            }

          public void keyPressed(KeyEvent e){ 
                /* Link's Movement
                 * 
                 */
              char linkMoveRightKey = e.getKeyChar();
            if(linkMoveRightKey == 'z')
                    {

                    xSpeed = 0;
                    ySpeed = 0;
                    pause(arrowDELAY);
                    linkCharacter.move(xSpeed, ySpeed);
                    linkCharacter.setImage(linkAttackWithBow[linkFrame]);

                    linkFrame++;
                    callArrow();

 // BUG 
           arrowPoint = new GPoint(linkArrow.getX(),linkArrow.getY());
           arrowObject = getElementAt(arrowPoint);

           }
  //                  


                   /*
                    * summon link's arrow
                    */
                    }

                    if(linkFrame>=linkAttackWithBow.length){
                        linkFrame = 0;
                    }


            }



            private void callArrow(){
                if(linkFrame == 2){
                 linkArrow = new ArrowThread(SIZE, rgen.nextColor());
                add(linkArrow,linkCharacter.getX(),linkCharacter.getY());

                Thread arrowThread = new Thread(linkArrow);
                arrowThread.start();




                }
            }

        private ArrowThread linkArrow;
            private int SIZE = 400;

            private RandomGenerator rgen = RandomGenerator.getInstance();
            private GImage gameBackgroundImage;

            private GImage linkCharacter;

            private double arrowDELAY = 28;


            private  int link_Location_XCoord = 50;
            private  int link_Location_YCoord = 50 ;
            private final int APPLICATION_WIDTH = 1200;
            private final int APPLICATION_HEIGHT = 800;
         private String[] linkAttackWithBow = {"link sprites/linkAttackWithBow/Link_Bow_Attack_Frame_1.png","link sprites/linkAttackWithBow/Link_Bow_Attack_Frame_2.png","link sprites/linkAttackWithBow/Link_Bow_Attack_Frame_3.png","link sprites/linkAttackWithBow/Link_Bow_Attack_Frame_1.png","link sprites/linkAttackWithBow/Link_Bow_Attack_Frame_2.png","link sprites/linkAttackWithBow/Link_Bow_Attack_Frame_3.png","link sprites/linkAttackWithBow/Link_Bow_Attack_Frame_1.png","link sprites/linkAttackWithBow/Link_Bow_Attack_Frame_2.png"};

            private int linkFrame = 0;
            private int xSpeed =5; //the number of pixels to move in x
            private int ySpeed = 0; //0 so you only move horizontally
        }

矢印を生成する Thread クラスは次のとおりです。

import java.awt.Color;

import acm.graphics.GImage;


public class ArrowThread extends GImage implements Runnable{

    public ArrowThread(int SIZE,Color color){
        super("link sprites/linkAttackWithBow/arrow.png", SIZE,SIZE);


    }

    public void run(){
        for(int i = 0; i < 1000/STEP;i++){
            pause(60);

            move(arrowSpeedX,arrowSpeedY);

        }

    }






    private static final int arrowSpeedX = 0;
    private static final int arrowSpeedY = -5;

    private static final double STEP  = 5; 


}
4

1 に答える 1

1

問題はlinkArrow、最初のフレームでメンバーが null であることです。チェックを参照してください:

if(linkFrame == 2){
    linkArrow = new ArrowThread(SIZE, rgen.nextColor());
于 2012-06-07T06:40:00.283 に答える