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对象以发送消息。我不确定如何做到这一点,提前谢谢。
答案 0 :(得分:4)
EDIT1猜对了:)
关于设计的一些话:
这些静力学中的大多数都很糟糕,你应该只在属性成为类的一部分时保持属性,例如默认值,Singleton业务以及当你真的喝醉和懒惰时 - 但这是一个不同的主题(如果你继续编码,你会得到这个主题)
实际上,您不应该公开属性,它们应该始终是私有的或受保护的,使用公共getter / setter方法 - 这样您就可以限制对属性的访问,并可以控制get或set上发生的事情。 (但这在java中往往非常繁琐)
现在,保持静态,您可以轻松发送这样的消息(在sendPlayerPackets.run()中):server.sendPacket(player[0].packet);
要将服务器传递给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 gameServer{
/* ... */
public static void main(String[] args) throws Exception {
/* ... */
gameRunner = new gameRunner();
gameRunner.gameServer = server;
/* ... */
}
}
旧部分
纯粹凭直觉我想你想要这个:
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;
}
}
简而言之:您必须将父级传递给子级才能访问它。
请注意,在此示例中,B必须在C之前初始化,为了解决这个问题,我需要事件。无论如何,这个想法似乎没有明确定义,你应该考虑一下你想要完成什么(并告诉我们)。
答案 1 :(得分:0)
int numB = A.bb.num;
应该这样做。但是,如果您可以描述您要完成的任务,那将是有用的,因为具有由构造函数设置的静态变量(这是您在num
中使用B
所做的)最多可能不是一个好主意。此外,由于您使用的是“父”一词,听起来您打算继承,但代码示例没有任何继承。
答案 2 :(得分:0)
在B中创建一个getter方法getNum() { return num; }
,并在C中调用B.getNum()
。我不确定B的引用在哪里.C不扩展B,是你想要的?