簡體   English   中英

Box2D(處理):如何解決“由於某種原因而無法調用“ beginContact()”方法”錯誤?

[英]Box2D (Processing): how to solve the 'Could not invoke the “beginContact()” method for some reason' error?

首先,檢查一下( 鏈接 ):這是一個示例程序,取自github上的Processing Box2D庫,該庫在屏幕中央顯示一個框(可以用鼠標移動),同時串連一些小球落在它上面; 每當有球擊中箱子時,該球就會變成紅色。 我將四個.pde文件復制粘貼到單個.pde草圖中,運行它,並且效果很好。

現在,我的問題了。 我目前正在“處理”中制作游戲:您有一個球,一個玩家1和一個玩家2(都可以使用鍵盤移動)。 Box2D負責每個球員與球之間的物理互動,我必須說它處理得很好。 三個主要對象中的每一個都有其自己的類。 現在,我希望一旦球員1接觸到球,事情就會發生。 該示例代碼對於該范圍似乎很完美,對吧? 畢竟,它可以在我的計算機上使用。

因此,我開始復制相關部分:

  • 我在代碼的開頭復制粘貼了所有“導入”;
  • 我添加了box2d.listenForCollisions(); 內部setup();

我還在草圖的最底部添加了這兩個函數:

void beginContact(Contact cp) {
  Fixture f1 = cp.getFixtureA();
  Fixture f2 = cp.getFixtureB();
  Body b1 = f1.getBody();
  Body b2 = f2.getBody();
  Object o1 = b1.getUserData();
  Object o2 = b2.getUserData();

  if (o1.getClass() == Box.class) {
    Particle p = (Particle) o2;
    p.change();
  } 
  else if (o2.getClass() == Box.class) {
    Particle p = (Particle) o1;
    p.change();
  }
}

void endContact(Contact cp) {
}

我迅速將其更改為此(我基本上重命名了類,並替換了p.change(),該方法使該草圖中的球變成紅色,並且在進行聯系時希望發生什么):

(... same ...)

  if (o1.getClass() == Player.class) {
    Ball p = (Ball) o2;
    //do stuff when contact happens
  } 
  else if (o2.getClass() == Player.class) {
    Ball p = (Ball) o1;
    //do stuff when contact happens
  }
}

void endContact(Contact cp) {
}

但猜猜怎么了? 我收到“由於某些原因無法調用“ beginContact()”方法”錯誤! 我認為我沒有任何關鍵的文件或庫,因為該示例在我的計算機上運行良好,而我所做的只是復制粘貼並運行代碼。

我不能在這里粘貼整個代碼,因為它很大,但是我發誓Player類(玩家1類),Enemy類(玩家2類)和Ball類都有它們的固定裝置,而實際上我的類中沒有什么不同與示例草圖中的方法大相徑庭。 主體都是動態類型的,像例中的盒子一樣,玩家是矩形盒子,球是一個純圓形,就像在那兒變成紅色的小球一樣。

怎么了? 我是否錯過了該代碼中的重要一行? 即使示例代碼可以完美運行而不需要任何其他文件,我也要提到控制台還打印了一個“ at shiffman.box2d.Box2DContactListener.beginContact(Box2DContactListener.java:54)”錯誤:現在,就像我說的那樣,我不不需要我計算機中的Box2DContactListener.java文件來運行示例草圖...但是無論如何,如果我在線閱讀( 鏈接 ),我可以看到它所指的是:

public void beginContact(Contact c) {
    if (beginMethod != null) {
        try {
            beginMethod.invoke(parent, new Object[] { c });
        } catch (Exception e) {
            System.out.println("Could not invoke the \"beginContact()\" method for some reason.");
            e.printStackTrace();
            beginMethod = null;
        }
    }
}

你知道這是怎么回事嗎?

基本上,在if語句之前,您必須檢查兩個對象是否為'null'。 萬一是這樣,您只需休息一下。 您可以簡單地將其粘貼:

if (o1==null || o2==null) return;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM