1

我有这些类,它们是我的游戏中基类的第三个和第四个孩子:

/*
 * List of player states:

* * 正常 * 爆炸 */

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 类中在线停止:

如果(objectState ==“正常”){

下一行是:

super.update();

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

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

谢谢

任何帮助约翰哈里斯

4

2 回答 2

3

永远不要将字符串与==. 这样做(假设 objectState 不能为空 - 否则你可以写"explode".equals(objectState)但我发现它更难阅读):

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

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

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

于 2013-07-01T13:03:09.223 回答
1

你的问题是那objectState == "normal"总是错误的。

"normal".equals(objectState)改为使用

于 2013-07-01T13:03:49.987 回答