2013-06-23 3 views
2

J'ai récemment téléchargé un code de jeu simple à partir d'un tutoriel en ligne. J'essaie actuellement de le rendre multijoueur. Cependant, dans ma partie du programme où les coordonnées sont écrites sur un socket, les variables ne sont pas mises à jour. J'ai cherché partout sur internet cherchant une réponse mais je n'en ai trouvé aucune. J'ai testé le code et les Ints sont envoyés avec succès.Variable ne se mettant pas à jour dans le fil

Mon Client.java

import java.net.*; 
import java.util.Scanner; 
import java.io.*; 

import javax.swing.SwingUtilities; 



public class Client implements Runnable{ 

    public void run() { 

     Craft crObj = new Craft(); 
     int playerX = 3001; 
    int playerY = 300; 
     String serverName = "127.0.0.1"; 
     int port = 6789; 
     int port1 = 6788; 
     Socket client = null, client1 = null; 
     System.out.println("Connecting to " + serverName + " on port " + port); 
     OutputStream outsetup = null, out1setup = null; 


     try { 
     client = new Socket(serverName, port); 
     client1 = new Socket(serverName, port1); 
     } catch (IOException e) { 
      System.out.println(e); 
     } 
     System.out.println("Connected"); 

     Scanner test = new Scanner(System.in); 
     try { 
      outsetup = client.getOutputStream(); 
      out1setup = client1.getOutputStream(); 
     } catch(IOException e) { 
      System.out.println(e); 
     } 
     DataOutputStream out = new DataOutputStream(outsetup); 
     DataOutputStream out1 = new DataOutputStream(out1setup); 


     while(true) { 
      try { 
//Doesn't Update Here 
       playerX = crObj.getX(); 
       playerY = crObj.getY(); 
       out.writeInt(playerX); 
       out.flush(); 
       out1.writeInt(playerY); 
       out1.flush(); 

      } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      } 

     } 

    } 
} 

Mon Craft.java

import java.awt.Image; 
import java.awt.event.KeyEvent; 

import javax.swing.ImageIcon; 

public class Craft { 

    private String craft = "craft.png"; 
    Client clObj = new Client(); 
    public int dx; 
    public int dy; 
    public int x; 
    public int y; 
    private Image image; 
    public ImageIcon ii; 

    public Craft() { 
     ImageIcon ii = new ImageIcon(this.getClass().getResource(craft)); 
     image = ii.getImage(); 
     x = 40; 
     y = 60; 
    } 


    public void move() { 
     x += dx; 
     y += dy; 
    } 

    public int getX() { 
     return x; 
    } 

    public int getY() { 
     return y; 
    } 

    public Image getImage() { 
     return image; 
    } 
    public void keyPressed(KeyEvent e) { 

     int key = e.getKeyCode(); 

     if (key == KeyEvent.VK_LEFT) { 
      dx = -2; 
      ii = new ImageIcon(this.getClass().getResource("craftBACK.png")); 
      image = ii.getImage(); 
     } 

     if (key == KeyEvent.VK_RIGHT) { 
      dx = 2; 
      ii = new ImageIcon(this.getClass().getResource("craft.png")); 
      image = ii.getImage(); 
     } 

     if (key == KeyEvent.VK_UP) { 
      dy = -2; 
      ii = new ImageIcon(this.getClass().getResource("craftUP.png")); 
      image = ii.getImage(); 
     } 

     if (key == KeyEvent.VK_DOWN) { 
      dy = 2; 
      ii = new ImageIcon(this.getClass().getResource("craftDOWN.png")); 
      image = ii.getImage(); 
     } 
    } 

    public void keyReleased(KeyEvent e) { 
     int key = e.getKeyCode(); 

     if (key == KeyEvent.VK_LEFT) { 
      dx = 0; 
     } 

     if (key == KeyEvent.VK_RIGHT) { 
      dx = 0; 
     } 

     if (key == KeyEvent.VK_UP) { 
      dy = 0; 
     } 

     if (key == KeyEvent.VK_DOWN) { 
      dy = 0; 
     } 

    } 
} 

Board.java

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Toolkit; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyAdapter; 
import java.awt.event.KeyEvent; 

import javax.swing.JPanel; 
import javax.swing.Timer; 


public class Board extends JPanel implements ActionListener { 
    public int xMain = 0; 
    Client clObj = new Client(); 
    private Timer timer; 
    private Craft craft; 

    public Board() { 

     addKeyListener(new TAdapter()); 
     setFocusable(true); 
     setBackground(Color.BLACK); 
     setDoubleBuffered(true); 

     craft = new Craft(); 

     timer = new Timer(5, this); 
     timer.start(); 
    } 


    public void paint(Graphics g) { 
     super.paint(g); 

     Graphics2D g2d = (Graphics2D)g; 
     g2d.drawImage(craft.getImage(), craft.getX(), craft.getY(), this); 

     Toolkit.getDefaultToolkit().sync(); 
     g.dispose(); 
    } 


    public void actionPerformed(ActionEvent e) { 
     craft.move(); 
     xMain = craft.getX(); 
     System.out.println(xMain); 
     repaint(); 
    } 


    private class TAdapter extends KeyAdapter { 

     public void keyReleased(KeyEvent e) { 
      craft.keyReleased(e); 
     } 

     public void keyPressed(KeyEvent e) { 
      craft.keyPressed(e); 
     } 
    } 

} 

RType.java

import javax.swing.JFrame; 

public class RType extends JFrame { 

    public RType() { 

     add(new Board()); 

     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setSize(400, 300); 
     setLocationRelativeTo(null); 
     setTitle("R - Type"); 
     setResizable(false); 
     setVisible(true); 
     (new Thread(new Client())).start(); 
    } 

    public static void main(String[] args) { 
     new RType(); 
    } 
} 

Répondre

1

Étant donné que vous accédez à des valeurs de différents threads les rendant volatiles devraient aider.

Remplacer

public int dx; 
public int dy; 
public int x; 
public int y; 

avec

public volatile int dx; 
public volatile int dy; 
public volatile int x; 
public volatile int y; 

Vous pourriez aussi avoir besoin de mettre un peu de retard dans votre while (true) boucle

playerX = crObj.getX(); 
playerY = crObj.getY(); 

Obtenir ces valeurs après un certain délai (Discussion .sleep (100))

+0

Désolé, le à ne pas travailler les variables restent à leurs valeurs de départ. :( – user2016705

Questions connexes