2016-12-02 108 views
1

我一直在研究塔防遊戲中的反射,但我一直在努力讓這個遊戲正常工作。基於字符串值構建對象

首先是這裏的背景:
我們正在加工過程中,這是學校的一項要求。我們可能不會導入任何其他庫。

我想要構建的對象首先從菜單接收爲字符串。從那裏我把它轉換成階級價值,從那裏我想把塔放在適當的位置。下面提供的方法代碼以及一個我們傳統方法的開關。

void spawnSelected(String selectedTower) { 
    selectedTower = ENGINE_PREFIX + selectedTower; 
    try{ 
     Class c = Class.forName(selectedTower); 
     println(c); 
     try{ 
     Constructor C = c.getConstructor(PVector.class); 
     println(C); 
     //C.newInstance(); 
     /*}catch(InstantiationException s){ 
     println(s); 
     }catch(IllegalAccessException r){ 
     println(r); 
     */}catch(NoSuchMethodException p){ 
     println(p); 
     }catch(ReflectiveOperationException i){ 
     println(i); 
     } 
    }catch(ClassNotFoundException e){ 
     println(e); 
    } 

    /*switch(selectedTower) { 
    case "air_tower": 
     new air_tower(mp.drawLocation); 
     break; 
    case "dark_tower": 
     new dark_tower(mp.drawLocation); 
     break; 
    case "fire_tower": 
     new fire_tower(mp.drawLocation); 
     break; 
    case "light_tower": 
     new light_tower(mp.drawLocation); 
     break; 
    case "nature_tower": 
     new nature_tower(mp.drawLocation); 
     break; 
    case "water_tower": 
     new water_tower(mp.drawLocation); 
     break; 
    default: 
     selectedTower ="Air_tower"; 
     break; 
    }*/ 
    } 

我給爲空氣塔的構造:

class air_tower extends Basic_Tower { 
    air_tower(PVector Loc){ 
    super(Loc); 
    cost = 100; 
    String[] effects = { 
    }; 

    int[] effectEffectivenes = { 
    }; 
    img = loadImage("Air.png"); 
    type = "air"; 
    projectileSpeed = 360; 
    projectileAcceleration = 5; 
    range = 175; 
    fireRate = 1400; 
    damage = 27.5; 
    numberOfTargets = 1; 
    AoE = 0; 
    } 
} 

我估計basic_tower構造也可能是相關的。所以這裏是:

Basic_Tower(PVector Loc) { 

這個傢伙擴展對象,這是我們最基本的對象可能。那傢伙有一個空的構造函數。

我的try-catch回來與此錯誤:

java.lang.NoSuchMethodException: Basic_TowerDefense_Engine$air_tower.(processing.core.PVector)

有誰看到我做錯了嗎?

更新: 所以我試圖使用函數getConstructors() 當我做了返回是一個空的數組。這是我現在開始研究的一個主角。

+0

NoSuchMethodException:Basic_TowerDefense_Engine $ air_tower:你缺少一種方法。 – CocoNess

+0

'air_tower'是'Basic_TowerDefense_Engine'的內部類嗎? – Mureinik

+0

@CocoNess但肩膀getConstructor總是獲取對象的構造函數?我已經定義了。 – TDSrock

回答

0

一個內部類的構造函數的第一個參數是隱含的封閉類:

Constructor con = 
    c.getConstructor(Basic_TowerDefense_Engine.class, PVector.class); 
con.newInstance(this /* presumably? */, mp.drawLocation); 

提問者注意:請閱讀更詳細的上下文有關問題的意見,以及如何解決走過來的。

+0

嗯,不幸的是,似乎沒有工作。只是創建該con已經導致以下錯誤:java.lang.NoSuchMethodException:Basic_TowerDefense_Engine $ air_tower。 (Basic_TowerDefense_Engine,processing.core.PVector) – TDSrock

+0

我只是偶然發現了一些有趣的東西。 getconstructors函數根本沒有返回。可能這是你的一個指標什麼是錯的? – TDSrock

+0

@TDSrock沒有注意到修飾符,我有多愚蠢。你可以嘗試將'air_tower'的構造函數改爲public嗎? – Mureinik

0

韋爾普我得到它的工作。

事實證明,我沒有明確地向我的建築師公開表明.getConstructors根本找不到任何東西。

但是,當我公開的時候它被認可了。從那裏結合我已經有的@Mureinik提供的答案,我得到了最終答案。

導致以下代碼爲構造函數和obj的init。

Constructor C = c.getConstructor(Basic_TowerDefense_Engine.class, PVector.class); 
C.newInstance(head, mp.drawLocation); 

其中head是Basc_TowerDefense_Engine對象。