1
2
3
4
5
6
7 package org.sourceforge.jvb3d;
8
9 import java.awt.GraphicsConfiguration;
10 import java.net.InetSocketAddress;
11
12 import javax.media.j3d.Canvas3D;
13 import javax.swing.JFrame;
14
15 import com.sun.j3d.utils.universe.SimpleUniverse;
16 import org.sourceforge.jvb3d.Model.*;
17 import org.sourceforge.jvb3d.Network.*;
18 import org.sourceforge.jvb3d.Loader.*;
19 import org.sourceforge.jvb3d.Control.*;
20
21 /***
22 * @author spootnick
23 *
24 * Klasa główna tworząca okienko i wszyskie potrzebne obiekty
25 */
26 public class Jvb3d extends JFrame{
27 private Canvas3D canvas3D;
28
29 private Model model;
30
31 private SceneLoader loader;
32
33 private Control c;
34
35 private INetworkModel network;
36
37
38
39 /***
40 * konstruktor głównej klasy
41 * @param isServer czy klasa ma być klientem czy serwerem
42 * @param host adres serwera z którym klient ma się połączyć
43 * @param port port na którym działa serwer
44 * @param map ścieżka do pliku mapy
45 * @throws Exception
46 */
47 public Jvb3d(boolean isServer,String host,int port,String map) throws Exception{
48
49 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64 GraphicsConfiguration config = SimpleUniverse
65 .getPreferredConfiguration();
66 canvas3D = new Canvas3D(config);
67 canvas3D.setDoubleBufferEnable(true);
68
69 this.getContentPane().add("Center", canvas3D);
70
71 loader = new SceneLoader();
72 if(map!=null)
73 loader.loadScene(map);
74 else
75 loader.loadScene("data/room.xml");
76
77 if(isServer){
78 this.setTitle("Jvb3d:Server");
79 model = new Model(canvas3D,true);
80 startServer(port);
81 }else{
82 this.setTitle("Jvb3d:Client");
83 model = new Model(canvas3D,false);
84 startClient(host,port);
85 }
86
87
88
89 model.setStaticScene(loader.getStaticScene());
90
91
92 c.getInputAdapter().setScreen(800,600);
93 this.canvas3D.addKeyListener(c.getInputAdapter());
94 this.canvas3D.addMouseMotionListener(c.getInputAdapter());
95 this.canvas3D.addMouseListener(c.getInputAdapter());
96
97 this.setSize(800, 600);
98
99 this.setVisible(true);
100
101 }
102
103 private void startServer(int port) throws Exception{
104 String id=model.createLocalPlayer();
105 NetworkServerFacadeHolder.setNetworkFacade(new ServerFacade());
106 NetworkServerFacade serverFacade = NetworkServerFacadeHolder.getNetworkFacade();
107 serverFacade.setModelInterface(model);
108 network=serverFacade;
109 c = new Control(network, model);
110 serverFacade.start(port);
111 c.setLocalPlayerID(id);
112 c.setLocalPlayerName(id);
113 c.setTask(new ServerTask(),50);
114 }
115
116 private void startClient(String host,int port) throws Exception {
117 NetworkClientFacadeHolder.setNetworkFacade(new ClientFacade());
118 NetworkClientFacade clientFacade = NetworkClientFacadeHolder.getNetworkFacade();
119 clientFacade.setModelInterface(model);
120 network= clientFacade;
121 c = new Control(network, model);
122 String id=clientFacade.join(new InetSocketAddress(host,port));
123 model.createLocalPlayer(id);
124 c.setLocalPlayerID(id);
125 c.setLocalPlayerName(id);
126 c.setTask(new ClientTask(),200);
127 }
128
129 /***
130 * zczytuje argumenty, i w zależności od nich tworzy klasę z odpowiednimi parametrami
131 * @param args argumenty
132 */
133 public static void main(String[] args) {
134 boolean isServer=false;
135 int port=4000;
136 String host=null;
137 String mapFile=null;
138 try{
139 if(args[0].equals("server"))
140 isServer=true;
141 else
142 isServer=false;
143 if(isServer)
144 {
145 port=Integer.parseInt(args[1]);
146 if(args.length>=3)
147 mapFile=args[2];
148 }else{
149 host=args[1];
150 port=Integer.parseInt(args[2]);
151 if(args.length>=4)
152 mapFile=args[3];
153 }
154 }catch(Exception ex){
155 System.out.println("usage: server port [map_file]");
156 System.out.println("or: client host port [map_file]");
157 System.exit(0);
158 }
159 try{
160 new Jvb3d(isServer,host,port,mapFile);
161 }catch(Exception ex){
162 System.err.println(ex);
163 }
164 }
165 }