Java继承超

标签 java eclipse inheritance super

<分区>

我有这些类,它们是我游戏中基类的第 3 个和第 4 个子类:

/*
 * List of player states:

* * normal * explode */

public class LocalPlayer extends MovingObjects{

//minus 1 laps to start to accommodate going over the start line for the first time
public int lapsCompleted = -1;      

public LocalPlayer(int localPlayerNumber) {

    /*
     * This line below and the variable localPlayerNumber will not be needed or will be different
     * if later on decide to do custom rocket designs - not needed for this stage but bear in mind if the decision is
     * made to go down that road this and the game object will have to be reconsidered as early as possible.
     */
    super(16, "assets/images/player" + localPlayerNumber , ".jpg", new Vector(373, 450 + (55 * localPlayerNumber))); 


}

//basic constructor just initialises MovingObjects Variables to zero values
public LocalPlayer(){
    super();
}

///// Uploading Position Methods

public void update(){
    if(objectState == "explode"){

    }
    if(objectState == "normal"){

        super.update();

        //look for edge of map and stop player leaving and reduce speed to 0
        if(position.x > rightEdge - icon.getIconWidth()){
            position.x = rightEdge - icon.getIconWidth();
            speed = 0;
        }else{
            if(position.x < leftEdge){
                position.x = leftEdge;
                speed = 0;
            }
        }

        if(position.y > downEdge - icon.getIconHeight()){
            position.y = downEdge - icon.getIconHeight();
            speed = 0;
        }else{
            if(position.y < upEdge){
                position.y = upEdge;
                speed = 0;
            }
        }
    }       
}

///// Movement Methods

//Increases speed
public void up(){
    if(speed == 0){
        speed = 2;// 2 is minimum speed to achieve all driving angles
    }else
    if(speed < 11){
        speed++;
    }
}

//Decreases speed
public void down(){
    if(speed > 2){
        speed--;
    }else{
        speed = 0;
    }
}

//Turns image and angle 22.5 degrees to the right
public void right(){
    if(angle == 337.5)
    {
        angle = 0;
        imageNumber = 0;
    }else{          
        angle = angle + 22.5;
        imageNumber = imageNumber + 1;
    }
}

//Turns image and angle 22.5 degrees to the left
public void left(){
    if(angle == 0)
    {
        angle = 337.5;
        imageNumber = 15;
    }else{          
        angle = angle - 22.5;
        imageNumber = imageNumber - 1;
    }
}   

// works out start grid currently only vertical lines
    //add more levels either start all the same way or needs updating
    public Vector getStartPos(int serverNumber, CheckPoints line)
    {
        int row ;
        Vector vReturn;
        if (serverNumber % 2 == 0) {
            // even
            row = serverNumber/2;

            //this needs some explaining:
            //vectorX  = row * width of image * gap to next player
            //vectorY = getline y and inset slightly(will see how goes)
            vReturn  =  new Vector((line.pos1.x + 10 ) - row * (50 + 10), line.pos1.y + 5);             
        } else {
            // odd
            row = (serverNumber + 1)/2;     
            vReturn  =  new Vector((line.pos2.x  +10) - row * (50 + 10), line.pos2.y - 55);             
        }           
            return vReturn;
    }
}

和:

 import java.awt.image.BufferedImage;


 public class NetworkedLocalPlayer extends LocalPlayer{

RocketSpecificServer server = new RocketSpecificServer();   

public NetworkedLocalPlayer(String ipAddress,int numOfImages,String filePre, String fileE, CheckPoints finishLine) {

    //sign player into server
    server.setUpNetwork(ipAddress); 

    LoadContent.gameSettings = (GameSettings) server.signIn();

    //get server number (needed for initialising)
    serverNumber = Integer.parseInt(((StringReturnSerial)server.getServerNumber()).s);

    //this is temp and should be changed later!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    //filePre = filePre + serverNumber;
    filePre = filePre + 1;

    //Initialise image variables
    imageVariables(numOfImages,filePre,fileE);

    //work out pos
    position = getStartPos(serverNumber,finishLine);

    //get images
    initImageArray();

}

public void update(){
    //updates players info table checks the state of this object 
    //hasn't been changed by another player
    LoadContent.serverPlayerInfo =(PlayerPositionsSerial) server.getPos();
    objectState = LoadContent.serverPlayerInfo.playersArray[serverNumber][4];

    //usual update 
    super.update();

    //updates server        
    LoadContent.serverPlayerInfo = (PlayerPositionsSerial) server.updatePos(angle, position.x, position.y,objectState);
}
}

问题是更新方法。在 NetworkedLocalPLayer 玩家类中,它向服务器请求一个序列化类,该类包含游戏中的所有玩家位置(以及其他一些位),该类分配给实现我的游戏循环的 LoadContent 类中的静态版本。 update 方法然后检查它自己在 playertable 数组中的位置以更新它自己的 objectState 变量,我可以在使用断点时看到它返回,因为它应该是“正常的”。然后它调用父更新方法,该方法开始执行并将在 LocalPlayer 类中在线停止:

if(objectState == "normal"){

下一行是:

super.update();

它应该调用 MovingObjects 类的 super 更新方法,如果您认为它会有所帮助,我也可以提供它,但基本上我在 MovingObjects 类内部和 LocalPlayer 类中的 super.update() 调用上有一个中断点永远不会被击中。

当我更改游戏循环中的一个变量以关闭多人游戏时,这与此无关但直接使用了 localPlayer 类,因为它是这种方法非常好,并且多年来一直没有改变。那么我不能像这样使用 super 有什么原因吗?我现在收到任何错误或异常

谢谢

任何帮助约翰·哈里斯

最佳答案

从不compare Strings with == .这样做(假设 objectState 不能为 null - 否则你可以写 "explode".equals(objectState) 但我发现它更难阅读):

public void update(){
    if(objectState.equals("explode")){

    }
    if(objectState.equals("normal")){
        super.update();
        // ...
    }
}

如果使用 Java 7,您还可以 switch on Strings (查看 Java 7 引入的更改)。

关于Java继承超,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17405044/

相关文章:

c++ - 重写虚拟方法时,Cat 与 Animal 不协变

Java将大文件逐 block 读入字节数组

java - ListView 中的 NullPointErexception

java - Maven/Eclipse 插件 : easiest way to have new Maven project have dependency on legacy non-Maven project?

eclipse - 如何在现有的Eclipse项目中开启Mercurial?

c++ - 如何从基类中暴露隐藏的重载?

c++ - 使用 C++ 子类实例作为默认参数?

java - 使用 Swing 中的 JOptionPane 类的两种方法

java - 谷歌地图与我的应用程序

java - ORMLite android类字段是其他类的id