是否可以访问在方法内部创建的对象?

时间:2019-10-07 00:27:33

标签: java jmonkeyengine

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

已创建敌人角色,但我无法访问仅通过几何方法在方法中创建的对象。

这是制造敌人的方法:

/*
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变量。

2 个答案:

答案 0 :(得分:1)

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

要解决上述问题,并在方法外使“字符”变量可用,您可以选择以下几种方法:

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

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

答案 1 :(得分:0)

由于它是jMonkeyEngine,请考虑以下事项: 使Character扩展AbstractControl。然后:

enemy.addControl(emy);

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

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

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