2016-12-02 124 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对象。