Witam,
Chciałbym w swojej grze zrobić komunikacje sieciową, tzn w czasie gry przeciwnicy będą mogli ze sobą pisać w czacie, niestety nie wiem jak rozwiązać umiejscowanie okienka czat i miejsca w którym pisali, tak, żeby działało to poprawnie. Myślałem, że wystarczy zwykłe podpięcie JFielda i JTextArea do paneli i umiejscowienie ich z boku ekranu ale niestety nie wyświetla ich poprawnie i gra nie działa(postac sie nie rusza).
Ogólnie to chodzi mi o coś takiego:
http://postimg.org/image/asosh1wc9/
Kod programu
package game;
public class CreateMap extends JFrame {
/**
*
*/
private Image dbImage;
private Graphics dbGraphics;
private static final long serialVersionUID = 1L;
private List<GameObjects> objects = new ArrayList<GameObjects>();
private Player player;
int[][] arr = new int[34][25];
double time = 0.00;
int diamondcounter = 0;
Boolean gameover = false;
private JTextField userText;
private JTextArea chatWindow;
private List<Stone> stoneList = new ArrayList<Stone>();
public CreateMap(String gamename, Boolean multi) {
super("Mapa ");
if (multi) {
setLayout(null); //tutaj chciałem podłączyć czata niestety z mizernym skutkiem
userText = new JTextField();
userText.setPreferredSize(new Dimension(200, 23));
JPanel pane = new JPanel();
JPanel pane1 = new JPanel();
JPanel pane2 = new JPanel();
chatWindow = new JTextArea(25, 18);
JLabel info = new JLabel("Chat");
pane.add(info);
pane1.add(new JScrollPane(chatWindow));
pane2.add(userText);
pane.setBounds(1000, 100, 200, 20);
pane1.setBounds(1000, 120, 200, 400);
pane2.setBounds(1000, 520, 200, 100);
add(pane);
add(pane1);
add(pane2);
pane1.setVisible(true);
pane2.setVisible(true);
pane.setVisible(true);
}
objects.add(new Grass());
objects.add(new Stone(-5, -5));
objects.add(new Diamond());
objects.add(new Background());
objects.add(new Playerobj());
timeCounter(true);
try { // wpisywanie zawartości pliku do tablicy2D
String line;
BufferedReader br = new BufferedReader(new FileReader(gamename));
int j = 0;
while ((line = br.readLine()) != null) {
for (int i = 0; i < line.length(); i++) {
arr[j][i] = Integer.parseInt(line.substring(i, 1 + i));
if (arr[j][i] == 2)
stoneList.add(new Stone(j, i));
}
j++;
}
br.close();
} catch (FileNotFoundException e) {
System.out.println("Nie znaleziono pliku");
} catch (IOException e) {
}
RandomGenerator randomPlace = new RandomGenerator(); // Generuje losowo
// miejsce w
// którym
// powstaje
// gracz
player = new Player(randomPlace.a, randomPlace.b);
this.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
Point playerposition = player.returnPosition();
switch (e.getKeyCode()) {
case KeyEvent.VK_LEFT:
if (arr[playerposition.x / 30 - 1][playerposition.y / 30] != 2)
player.moveHorizontal(-1);
if (playerposition.x <= 0)
player.moveHorizontal(1);
checkObject();
break;
case KeyEvent.VK_RIGHT:
if (arr[playerposition.x / 30 + 1][playerposition.y / 30] != 2)
player.moveHorizontal(1);
if (playerposition.x >= 960)
player.moveHorizontal(-1);
checkObject();
break;
case KeyEvent.VK_UP:
if (arr[playerposition.x / 30][playerposition.y / 30 - 1] != 2)
player.moveVertical(-1);
if (playerposition.y <= 30)
player.moveVertical(1);
checkObject();
break;
case KeyEvent.VK_DOWN:
if (arr[playerposition.x / 30][playerposition.y / 30 + 1] != 2)
player.moveVertical(1);
if (playerposition.y >= 690)
player.moveVertical(-1);
checkObject();
break;
}
repaint();
// try { Thread.sleep(100); } catch(InterruptedException ex) {}
}
});
}
@Override
public void paint(Graphics g) {
dbImage = createImage(990, 720);
dbGraphics = dbImage.getGraphics();
paintComponent(dbGraphics);
g.drawImage(dbImage, 0, 0, this);
}
public void paintComponent(Graphics g) {
Boolean wingame = true;
Point playerposition = player.returnPosition();// testy
for (int i = 0; i < 33; i++) {
for (int j = 1; j < 24; j++) {
if (arr[i][j] == 1)
g.drawImage(((Grass) (objects.get(0))).objpic, (i * 30),
(j * 30), 30, 30, null);
else if (arr[i][j] == 2)
g.drawImage(((Stone) (objects.get(1))).objpic, (i * 30),
(j * 30), 30, 30, null);
else if (arr[i][j] == 3) {
g.drawImage(((Diamond) (objects.get(2))).objpic, (i * 30),
(j * 30), 30, 30, null);
wingame = false;
} else if (arr[i][j] == -1)
g.drawImage(((Background) (objects.get(3))).objpic,
(i * 30), (j * 30), 30, 30, null);
}
}
g.drawImage(((Playerobj) (objects.get(4))).objpic, playerposition.x,
playerposition.y, 30, 30, null);
for (int i = 0; i < stoneList.size(); i++) {
if (arr[stoneList.get(i).x][stoneList.get(i).y + 1] == -1)
rollingStones(stoneList.get(i).x, stoneList.get(i).y, i);
}
g.setFont(new Font("MV Boli", Font.ITALIC, 20));
g.setColor(Color.RED);
g.drawString("Diamonds: " + diamondcounter, 800, 70);
g.drawString(String.format("Time: %.2f", time), 800, 90);
if (wingame == true) {
timeCounter(false);
winGameMassage();
}
}
void checkObject() {
Point playerposition = player.returnPosition();
playerposition.x /= 30;
playerposition.y /= 30;
if (arr[playerposition.x][playerposition.y] == 1) {
arr[playerposition.x][playerposition.y] = -1; // zmien z trawy na
// tło!
try {
AudioInputStream audio = AudioSystem
.getAudioInputStream(new File("lib/jar/trawasound.wav")); // wczytanie
// dźwięków
Clip clip = AudioSystem.getClip();
clip.open(audio);
clip.start();
} catch (UnsupportedAudioFileException uae) {
System.out.println(uae);
} catch (IOException ioe) {
System.out.println(ioe);
} catch (LineUnavailableException lua) {
System.out.println(lua);
}
} else if (arr[playerposition.x][playerposition.y] == 3) {
arr[playerposition.x][playerposition.y] = -1;
diamondincrease();
try {
AudioInputStream audio = AudioSystem
.getAudioInputStream(new File(
"lib/jar/diamentsound.wav"));
Clip clip = AudioSystem.getClip();
clip.open(audio);
clip.start();
} catch (UnsupportedAudioFileException uae) {
System.out.println(uae);
} catch (IOException ioe) {
System.out.println(ioe);
} catch (LineUnavailableException lua) {
System.out.println(lua);
}
}
}
int diamondincrease() {
return this.diamondcounter++;
}
void winGameMassage() {
WinGameMassage w = new WinGameMassage(time);
w.setSize(300, 100);
w.setVisible(true);
w.setResizable(false);
w.setLocationRelativeTo(null);
dispose();
}
void timeCounter(Boolean start) // Funkcja licząca czas
{
Thread t = new Thread() {
@Override
public void run() {
while (start) {
try {
Thread.sleep(10);
time = time + 0.01;
repaint();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
t.start();
}
long iteration = 0;
void rollingStones(int x, int y, int i) // Funkcja dotycząca upadku kamieni
{
// long t1= System.currentTimeMillis();
/*
* if(iteration%50==0)
*
*
* //kod przerysowywania
* long t2 = System.currentTimeMillis();
* long dt = t2-t1;
*/
/*
* if(dt<10) Thread.sleep(dt);
*/
Thread t1 = new Thread() {
@Override
public void run() {
while (arr[x][y + 1] == -1 && !gameover) {
try {
Thread.sleep(500);
arr[x][y] = -1;
stoneList.get(i).y = y + 1;
arr[x][y + 1] = 2;
Point playerposition = player.returnPosition();
playerposition.x /= 30;
playerposition.y /= 30;
repaint();
if (arr[playerposition.x][playerposition.y] == 2) {
gameover = true;
gameOver();
}
rollingStones(x, y + 1, i);
} catch (InterruptedException e) {
}
;
}
}
};
t1.start();
}
void gameOver() {
timeCounter(false);
JOptionPane.showMessageDialog(null, "You lose!");
System.exit(0);
}
}