2016-03-24 15 views
-5

EDITED:申し訳ありませんが、他のトピックは役に立たない。見てください:それはちょうどコピー+貼り付けです。それ以上のことはありません。パックマン:複数のゴーストを作成することはできません

p.update(); 
Blinky.update(); 

maze.update(); 
dc.eatDot(p); 
pc.eatPill(p); 
gc.collision(p); 
gc.collision(Blinky); 

そして今、次のとおりです:

オリジナルのコードでしたコンストラクタで

 p.update(); 
     Blinky.update(); 
     Pinky.update(); 
     Inky.update(); 
     Clyde.update(); 


     maze.update(); 
     dc.eatDot(p); 
     pc.eatPill(p); 
     gc.collision(p); 

     gc.collision(Blinky); 
     gc.collision(Pinky); 
     gc.collision(Inky); 
     gc.collision(Clyde); 

Blinky = new Ghost(240, 250, 0); 
Pinky = new Ghost(105, 69, 1); 
Inky = new Ghost(465, 573, 2); 
Clyde = new Ghost(321, 357, 3); 

ゴーストクラス:

package objects; 

import java.awt.Graphics; 
import java.awt.Image; 
import java.awt.Rectangle; 
import java.io.IOException; 
import java.util.Random; 

public class Ghost extends Entity { 

private int lastDir = 0; 
public int rndDir; 

public int tipo; 

private int chase = 0; 

//private int state; //0 - scatter, 1 - chase, 2 - frightened 

public Ghost(int x, int y, int tipo){ 
    this.x = x; 
    this.y = y; 
    this.tipo = tipo; 

    init(); 
} 

@Override 
public void init(){ 

    //state = 0; 
    this.startFrame = 4; 
    this.endFrame = startFrame + 1; 
    this.frameNumber = startFrame; 
    this.frameSpeed = 4; //quanto maior, mais lento 

    try{ 

     if(this.tipo == 0){ 
      this.ss = new SpriteSheet(i.load("/img/gBlinky.png")); 
      System.out.println("Criado Blinky!"); 
     } else if(this.tipo == 1){ 
      this.ss = new SpriteSheet(i.load("/img/gPinky.png")); 
      System.out.println("Criado Pinky!"); 
     }else if(this.tipo == 2){ 
      this.ss = new SpriteSheet(i.load("/img/gInky.png")); 
      System.out.println("Criado Inky!"); 
     }else if(this.tipo == 3){ 
      this.ss = new SpriteSheet(i.load("/img/gClyde.png")); 
      System.out.println("Criado Clyde!"); 
     } 

    }catch (Exception e){System.out.println("Erro na inicialização dos fantasmas: "+e);} 



    this.velX = -speed; 
    //preVelX = -speed; 
} 

@Override 
public void update(){ 

    try{ 
     this.x += velX; 
     this.y += velY; 


     //passagem pelo túnel 
     if(this.x < -35 && y > 290 && this.y < 310) 
      this.x = 494;   
     if(this.x > 510 && y > 290 && this.y < 310) 
      this.x = -19; 

     this.Animation(); 

    } catch(NullPointerException s) { 
     //s.printStackTrace(); 
     throw new IllegalStateException("Some Ghost has a null property", s); 
    } 

} 

public void chase(Entity e){ 

    Random rndGen = new Random(); 
    chase = rndGen.nextInt(1000); 

    if(chase % 2 == 0){ 
     if(e.x > this.x){ 
      velX = speed; 
     } else { 
      velX = -speed; 
     } 
     preVelY = 0; 

    } else { 
     if(e.y > this.y){ 
      velY = speed; 
     } else { 
      velY = -speed; 
     } 
     velX = 0;   
    } 

} 

@Override 
public void collisionGate(Gate gate){ 

    boolean[] g = new boolean[4]; 
    g[0] = gate.up; 
    g[1] = gate.right; 
    g[2] = gate.down; 
    g[3] = gate.left; 

    if(velX != 0){ 
      if(velX > 0) 
       g[3] = false; 
      else 
       g[1] = false; 
     } 

     if(velY != 0){ 
      if(velY > 0) 
       g[0] = false; 
      else 
       g[2] = false; 
    } 

    int saidas = 0; 
    for(int i = 0; i < g.length; i++){ 
     if(g[i] == true){ 
      saidas++; 
     } 
    } 


    if((velX > 0 && gate.right == false) || 
     (velX < 0 && gate.left == false) || 
     (velY > 0 && gate.down == false) || 
     (velY < 0 && gate.up == false) || 
      saidas > 1){ 

     Random rndGen = new Random(); 
     do{ 
      rndDir = rndGen.nextInt(4);    
     } while(g[rndDir] == false); 

     setVel(rndDir); 
    } 

} 

public void setVel(int k){ 
    switch(k){ 
     default: System.out.println("Erro em setVel()"); 
      break; 
     case 0: 
      velY = -speed; 
      velX = 0; 
      break; 
     case 1: 
      velX = speed; 
      velY = 0; 
      break; 
     case 2: 
      velY = speed; 
      velX = 0; 
      break; 
     case 3: 
      velX = -speed; 
      velY = 0; 
      break; 
    } 
    changeDirection(); 
} 


@Override 
public void draw(Graphics g){ 
    g.drawImage(getEntityImage(), x, y, null);   
} 

public void changeDirection(){ 
    if(velX > 0){ 
     startFrame = 0; 
     endFrame = startFrame + 1; 
     frameNumber = startFrame;  
    } 
    if(velX < 0){ 
     startFrame = 4; 
     endFrame = startFrame + 1; 
     frameNumber = startFrame;  
    } 
    if(velY > 0){ 
     startFrame = 2; 
     endFrame = startFrame + 1; 
     frameNumber = startFrame;  
    } 
    if(velY < 0){ 
     startFrame = 6; 
     endFrame = startFrame + 1; 
     frameNumber = startFrame;  
    } 
} 

} 

とエンティティ抽象クラス:

package objects; 

import java.awt.Graphics; 
import java.awt.Image; 
import java.awt.Rectangle; 


public abstract class Entity { 

    public ImageLoader i = new ImageLoader(); 
    public SpriteSheet ss; 
    public int frame; 
    public int frameSpeed, frameNumber, startFrame, endFrame; 
    public int counterSS = 0; 
    public Image frameSS; 

    public int centerX, centerY; 

    public int x,y; 
    public int velX, velY; 
    public int preVelX, preVelY; 

    public int speed = 3; 

    public void init(){} 
    public void update(){} 
    public void draw(Graphics g){} 
    public void collisionGate(Gate gate){} 

    public Image getEntityImage(){ 
     return frameSS;   
    } 

    public void Animation(){ 

     frameSS = ss.crop2(25*frameNumber, 0, 25, 25); 
     //System.out.println(counterSS); 

     if(counterSS % frameSpeed == 0){ 
      if(frameNumber < endFrame){ 
       frameNumber++; 
      } else { 
       frameNumber = startFrame; 
      } 
     } 

     if(counterSS > 20*frameSpeed){ 
      counterSS = 0; 
     }else { 
      counterSS++; 
     } 

     if(velX == 0 && velY == 0) 
      counterSS--; 
    } 

    public Rectangle getBounds(){ 
     Rectangle r = new Rectangle(this.x, this.y, 25, 25); 
     return r; 
    } 

    public Rectangle getCenterBounds(){ 
     Rectangle r = new Rectangle(this.x+11, this.y+11, 3, 3); 
     return r; 
    } 
} 

私は学習のためのパックマンをやっています。これは、1人の幽霊と完璧に動作しますが、私は、次のエラーを得た複数のゴーストを作成しようとすると:あなたはで完全なコードを確認することができます

Criado Blinky! 
Criado Pinky! 
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
Criado Inky! 
Criado Clyde! 
    at pacman.GamePanel.actionPerformed(GamePanel.java:113) 
    at javax.swing.Timer.fireActionPerformed(Timer.java:312) 
    at javax.swing.Timer$DoPostEvent.run(Timer.java:244) 
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:705) 
    at java.awt.EventQueue.access$000(EventQueue.java:101) 
    at java.awt.EventQueue$3.run(EventQueue.java:666) 
    at java.awt.EventQueue$3.run(EventQueue.java:664) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:675) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:90) 

https://github.com/dimarcinho/pacman

私はデバッグを実行すると、それはまた、スロー私は非常に奇妙なMSG:英語で

Ouvindo em javadebug Executando programa do usuário Não foi possível enviar o ponto de interrupção MethodBreakpoint [objects.Ghost].collisionGate2 '(Lobjects/Gate;)Lvoid;', razão: O método 'collisionGate2' com assinatura '(Lobjects/Gate;)Lvoid;' não existe na classe objects.Ghost.

javadebugで聞きます。ユーザプログラム

Not possible to send Interrupted Point MethodBreakpoint [objects.Ghost].collisionGate2 '(Lobjects/Gate;)Lvoid;', reason: The method 'collisionGate2' with signature '(Lobjects/Gate;)Lvoid;' doesn't exists on class objects.Ghost.

を実行 私はcollisionGate()メソッドを実行するためにいくつかのコードをしようとしていたし、これは試練の一つであったが、私はすでにそれを削除し、それが任意の場所で使用されていません!私には非常に奇妙です!メソッドcollisionGate2はもう存在しません!

また、私は2つの幽霊で実行しようとすると、ときどきうまくいきます。 :$

+0

の可能性のある重複した[NULLポインタ例外であり、私はそれをどのように修正すればよいですか?](http://stackoverflow.com/questions/218384/what-is- a-null-pointer-exception-and-how-do-i-fix-it) – John3136

+0

正確な答えを得るためには、コードを提供する必要があります。スタックトレースだけではありません。 – TheMirrox

+0

実際、Githubのリンクを投稿しました。 私はJavaで新しく、デバッグについてあまり知らないが、複数のGhostを作成するとエラーが発生する。1つのGhotsで完全に動作し、他の人のための基本的なコピー+ペーストです。 – fenaryh

答えて

0

よろしくお願いします。私は問題を発見した。コンストラクタで

は、私が持っていた:

public GamePanel(){ 

    setFocusable(true); 

    t = new Timer(20, this); 
    t.start(); 

    maze = new Maze(); 
    dc = new DotController();   
    gc = new GateController(); 
    pc = new PillController(); 
    maze.createDots(dc); 
    maze.createPills(pc);   
    maze.createGates(gc); 


    p = new Player(240, 465); 

    Blinky = new Ghost(240, 250, 0);//240,250 
    Pinky = new Ghost(105, 69, 1); 
    Inky = new Ghost(465, 573, 2); 
    Clyde = new Ghost(321, 357, 3); 

    addKeyListener(new KeyInput(p)); 

    init(); 

} 

私は最後までタイマーのインスタンスを変更し、それが今取り組んでいます。私はミリ秒の違いは、エラーの原因と考えています。それは時には2つの幽霊で時にはうまくいった理由も説明します。

ありがとうございました!

最終的なコード:

public GamePanel(){ 

     setFocusable(true); 

     maze = new Maze(); 
     dc = new DotController();   
     gc = new GateController(); 
     pc = new PillController(); 
     maze.createDots(dc); 
     maze.createPills(pc);   
     maze.createGates(gc); 


     p = new Player(240, 465); 

     Blinky = new Ghost(240, 250, 0);//240,250 
     Pinky = new Ghost(105, 69, 1); 
     Inky = new Ghost(465, 573, 2); 
     Clyde = new Ghost(321, 357, 3); 

     addKeyListener(new KeyInput(p)); 

     init(); 

     t = new Timer(20, this); 
     t.start(); 
    } 
関連する問題