【问题标题】:Is it possible to access an object created inside of a method?是否可以访问在方法内部创建的对象?
【发布时间】:2019-10-07 00:27:33
【问题描述】:

我正在为我的游戏设计和开发课程做最后的项目。我有一个方法可以为角色创建一个类对象和一个空间几何来表示一个敌人角色。

创建了敌人角色,但我无法访问在该方法中创建的对象,只是几何。

这是创建敌人的方法:

/*
Method to create an enemy model.  
*/
protected Spatial makeEnemy(String t, float x, float y, float z) {

    Character emy = new Character(t);

    // load a character from jme3test-test-data
    Spatial enemy = assetManager.loadModel(emy.getLocation());
    if (t=="ogre") {
        enemy.scale(4.0f);
    } else {
        enemy.scale(1.0f);
    }

    enemy.setLocalTranslation(x, y, z);

    //add physics
    enemy_phy = new RigidBodyControl(2f);
    enemy.addControl(enemy_phy);
    bulletAppState.getPhysicsSpace().add(enemy_phy);

    //add a light to make the model visible
    DirectionalLight sun = new DirectionalLight();
    sun.setDirection(new Vector3f(-0.1f, -0.7f, 1.0f));
    enemy.addLight(sun);
    enemy.rotate(0.0f, 3.0f, 0.0f);
    return enemy;
}//end makeEnemy

字符类如下:

public class Character {

    private String modelLocation; //the location of the model
    private int hitPoints;
    private int atk;
    private int score;

    Character() {
        modelLocation = "Models/Ninja/Ninja.mesh.xml";//makes the ninja the default character
        hitPoints = 10;
        atk = 1;
        score = 0;
    }//end no argument constructor

    /*
    This will be the constructor used primarily for 
    creating enemy characters.
    */
    Character(String s){
        if(s=="ogre"){
            modelLocation = "Models/Sinbad.j3o";
            hitPoints = 5;
            atk = 1;
            score= 0;
        } else {
            modelLocation = "Models/Oto/Oto.mesh.xml";
            hitPoints = 10;
            atk = 1;
            score = 0;
        }
    }//end constructor

    /*
    This constructor will be used for 
    creating the player character.
    */
    Character(String s, int h, int a){
        modelLocation = s;
        hitPoints = h;
        atk = a;
        score= 0;//score always starts at zero
    }//end constructor

    /*
    Getter Methods
    */
    public String getLocation() {
        return modelLocation;
    }//end getLocation
    public int getHitPoints() {
        return hitPoints;
    }//end getHitPoints
    public int getAtk() {
        return atk;
    }//end getAtk
    public int getScore() {
        return score;
    }//end getScore

    /*
    Setter methods
    */
    public void setHitPoints(int n) {
        hitPoints = n;
    }//end setHitPoints
    public void setAtk(int n) {
        atk = n;
    }//end setAtk
    public void setScore(int n) {
        score = n;
    }//end setScore

    //method to deal damage to character
    public void takeDamage(int a) {
        hitPoints = hitPoints - a;
    }//end takeDamage

    //mehtod to add to character score
    public void addScore() {
        if(modelLocation == "Models/Sinbad.j3o") {
            score = score + 1; // 1 point for a ogre
        } else {
            score = score + 2; //2 points for golems
        }//end if else
    }//end addScore
}//end character

在另一种方法中,我可以访问在此方法中创建的空间并对其进行更改,但不能访问创建的 emy 字符对象。我只需要知道如何从方法外部访问其hitPoints 变量等。

【问题讨论】:

  • 旁注:if (t=="ogre") { 不是你在 Java 中比较 String 的方式

标签: java jmonkeyengine


【解决方案1】:

局部变量只能在“本地”访问,这意味着只能在通常由大括号 ({}) 定义的范围内创建它们(只有方法知道它们在哪里)。

要解决上述问题并使带有 Character 的变量在方法之外可用,您有几个选择:

  • 将 Character 变量实现为实例(甚至可能是类变量)并在方法内对其进行初始化。
  • 更好的方法是通过您的方法返回 Character 变量。

假设 Spatial 对象描述了 Character 的位置,您可以将 Character 和 Spatial 作为键值对返回。在这种情况下,我会采用另一种方法,并在 Character 对象本身中为每个 Character 定义 Spatial(我不知道您的架构是否允许这样做)。

【讨论】:

    【解决方案2】:

    因为它是 jMonkeyEngine,所以考虑一下: 使 Character 扩展 AbstractControl。那么:

    enemy.addControl(emy);
    

    您现在可以通过以下方式访问它:

    Character char = enemy.getControl(Character.class);
    char.setHitPoints(10000);
    

    控件是你的朋友:https://wiki.jmonkeyengine.org/jme3/advanced/custom_controls.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-24
      • 2017-09-20
      • 2015-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-14
      • 2012-08-21
      相关资源
      最近更新 更多