2012-01-01 7 views
1

gameServer.java:アクセスする変数

import java.util.ArrayList; 

public class gameServer{ 

    public static server server; 
    public static gameRunner gameRunner; 
    public static ArrayList<packet> packets = new ArrayList<packet>(); 

    public static void main(String[] args) throws Exception { 
     server = new server(); 
     server.startServer(5050); 
     Runnable listenServer = new Runnable() { 
      public void run() { 
       while(true) { 
        packets.add(server.getPacket()); 
       } 
      } 
     }; 
     new Thread(listenServer).start(); 
     gameRunner = new gameRunner(); 
     while(true) { 
      if(packets.size() <= 0) 
       continue; 
      gameRunner.executeMessage(packets.get(0)); 
      packets.remove(0); 
     } 
    } 
} 

server.js:

import java.net.*; 
import java.util.Date; 

public class server { 

    public static DatagramSocket socketServer; 
    private Date date = new Date(); 

    public void startServer (int port) throws SocketException { 
     socketServer = new DatagramSocket(port); 
     System.out.println("Started Server on port: " + port); 
    } 
public void sendPacket (packet packet) { 
     String message = null; 
     for(int i = 0; i < packet.header.length; i++) { 
      message += packet.header[i] + "\r\n"; 
     } 
     message += "\r\n" + packet.message; 
     String[] info = packet.address.split(":"); 
     try { 
      sendPacket(message, (Inet4Address)InetAddress.getByName(info[0]), Integer.parseInt(info[1])); 
     } catch (Exception e) { 
      System.out.println("failed to determine host"); 
     } 
    } 

}

gameRunner.js:

import java.util.ArrayList; 
import java.util.Date; 


public class gameRunner { 

    public static ArrayList<object> objects = new ArrayList<object>(); 
    public static player[] players = new player[1000]; 

    public Date date = new Date(); 

    Runnable updatePlayers = new Runnable() { 
     public void run() { 
      while(true) { 
       long StartTime = date.getTime(); 
       for(int i = 0; i < players.length; i++) { 
        if(players[i] == null) 
         continue; 
        players[i].updatePos(); 
       } 
       while(StartTime + 100 < date.getTime()) { } 
      } 
     } 
    }; 

    Runnable sendPlayerPackets = new Runnable() { 
     public void run() { 
      while(true) { 
       parent.gameServer.sendPacket(player[0].packet); //<<<---- 
       } 
     } 
    }; 

} 

は私がに新しいですクラス、抽象的、本来的なものなど。 gameRunnerからgameServerのsocketServerオブジェクトにアクセスしてメッセージを送信できるようにする必要があります。私はこれを行う方法がわからない、事前に感謝します。

答えて

4

EDIT1は推測右:)設計上の

いくつかの単語:彼らは、デフォルトとして、クラスの一部である場合

  • これらの静力学のほとんどは恐ろしいです、あなたは唯一のプロパティは、静的にする必要があります値、Singletonビジネスとあなたが本当に酔って怠惰なとき - しかし、それは別の話題です(あなたがコーディングをしている場合は、あなたはそれのハングを取得します)

  • 実際にあなたはプロパティをパブリックにすることはできません。パブリックなgetter/setterメソッドを使用して、常にプライベートまたは保護されている必要があります。プロパティへのアクセスを制限したり、取得または設定の処理を制御できます。 server.sendPacket(player[0].packet);

    をサーバーに渡すには:あなたは簡単に(sendPlayerPackets.runに())このようなメッセージを送ることができる静を踏まえ、今

(これはJavaで非常に退屈になりがち) gameRunnerに沿って、あなたはどうなる:

(gameRunner.java中)

public class gameRunner { 
    public static ArrayList<object> objects = new ArrayList<object>(); 
    public static player[] players = new player[1000]; 

    public server gameServer; 

    /* ... */ 
    Runnable sendPlayerPackets = new Runnable() { 
    public void run() { 
     while(true) { 
      gameServer.sendPacket(gameRunner.players[0].packet); //<<<---- 
      } 
    } 
}; 

とgameServer.java中を:

要するに

public class A { 
    public B foo; 
    public C bar; 

    public A() { 
     // java does not like exposing this, but screw that 
     foo = new B(this, 10); 
     C = new C(this); 
    } 
} 

public class B { 
    private class A parent; 
    public int numB; 

    public B(A parent, int num) { 
     this.parent = parent; 

     numB = num; 
    } 
} 

public class C { 
    private class A parent; 
    public int numC; 

    public C(A parent) { 
     this.parent = parent; 

     if(parent != null && parent.B != null) 
     numC = parent.B.numB; 
    } 
} 

public class gameServer{ 
    /* ... */ 
    public static void main(String[] args) throws Exception { 
    /* ... */ 
    gameRunner = new gameRunner(); 
    gameRunner.gameServer = server; 
    /* ... */ 
    } 
} 

古い部分

は純粋に私は推測本能にあなたはこれをしたいあなたはそれにアクセスできるようにするために子供に親を渡す必要があります。

この例では、BをCよりも前に初期化しなければならないことに注意してください。これを回避するには、私が推測するイベントが必要です。とにかく、アイデアは明確に定義されていないように見えるので、あなたが何をやり直したいのか考えてみてください。

+0

あなたは私の更新を見てください、ありがとう –

+0

+1は、質問があったはずだった答えに。 :-) –

0
int numB = A.bb.num; 

する必要があります。しかし、コンストラクタ(numで行っていることです)によって設定された静的変数をBに設定することは、おそらく良い考えではないため、達成しようとしていることを記述できる場合は便利です。また、 "parent"という単語を使用しているため、継承を行うように思えますが、コード例に継承はありません。

+0

私はgameserverで作業していますが、オブジェクト "UdpServer"を持つ "main"クラスと別の "playerController"を持っています。オブジェクト "playerController"からUdpServerのsend関数を使いたいと思います。 "UdpServer"にはオープンしているUDPソケットがあり、ポートに接続しています。だから私は "メイン"クラスの1つを使用する必要がある "UdpServer"の新しいインスタンスを作成することはできません。 –

+0

@PatrickLorio:私が理解していると思います - 'Main'(' A'に相当)には 'playerController'からアクセスしたい静的な' UdpServer'( 'B'に相当)が含まれています'C'の)?実際のクラス名を使用する必要があります。あなたの状況を理解しやすくしています。それで私が示したコードはうまくいくはずです。ただし、静的インスタンスではコードのテストが難しくなることがあります。 'UdpServer'をパラメータとして' playerController'コンストラクタに渡すことを考慮する必要があります。 –

0

Bでゲッター方法getNum() { return num; }を作成し、CでB.getNum()を呼び出します。Bへの参照がどこに来るのかわかりません。CはBを拡張しません。