【问题标题】:JAVA Client-server gameJAVA客户端-服务器游戏
【发布时间】:2013-05-01 11:44:25
【问题描述】:

我必须准备一个受game 启发的游戏。当然它应该很简单,但不幸的是它必须使用客户端-服务器通信才能让两个玩家一起玩。到目前为止,我准备了纹理,并试图让其中一辆汽车移动。可悲的是,它并不像看起来那么简单。我被卡住了,无法继续……我只想使用四个箭头:UP - 汽车加速,DOWN - 汽车减速,LEFT - 左转,RIGHT - 右转。当然,如果我们不按UP按钮或DOWN按钮,汽车应该减速,但更慢。我求提示!

这是我的代码:

package destructionderby;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

class CRX extends JFrame implements KeyListener
{
   File imageFile2;
   BufferedImage crxModel;
   public int speed;
   int posX, posY;
   JPanel crxPanel;
   public CRX()
    {
        speed = 0;
        posX=562;
        posY = 420;
        crxPanel = new JPanel();
        imageFile2 = new File("crx.png");
        try
        {
            crxModel = ImageIO.read(imageFile2);
        }
        catch (IOException e) 
        {
            System.err.println("File access error");
        }
        addKeyListener(this);
    }
    public void paint(Graphics g) 
    {
        while (true)
        {
            Graphics2D g2d = (Graphics2D) g;
            g2d.drawImage(crxModel, posX+speed, posY, null);
            repaint();
        }
    }

    //-------------------KEY LISTENER--------------------
    public void keyTyped (KeyEvent key)
    {
            if (key.getKeyCode()==38) //38 == UP; 40==DOWN; 37==LEFT; 39==RIGHT
            {
                speed +=10;
            }
            if (key.getKeyCode()==40)
            {
                if (speed >10)
                {
                    speed-=10;
                }
                else speed=0;
            }
    }
    @Override
    public void keyPressed(KeyEvent key)
    {

    }
    @Override
    public void keyReleased(KeyEvent key)
    {

    }
}

class MainWindow extends JFrame
{
    JPanel mainWindow;
    BufferedImage backgroundImage;
    CRX crx;
    MainWindow()
    {
        super("Destruction Derby");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(800,600);
        setResizable(false);
        setVisible(true);
        init();
    }
    void init()
    {
        mainWindow = new JPanel();
        File imageFile= new File("background.png");        
        //:::...ZAŁADOWANIE OBRAZKA TŁA:::...
        try 
        {
            backgroundImage = ImageIO.read(imageFile);
        } 
        catch (IOException e) 
        {
            System.err.println("File access error");
        }
        crx = new CRX();
        paint(getGraphics());
     }

    @Override
    public void paint(Graphics g) 
    {
        Graphics2D g2d = (Graphics2D) g;
        g2d.drawImage(backgroundImage, 0, 0, this);
        crx.paint(getGraphics());
    }
}

public class DestructionDerby 
{    
    public static void main(String[] args) 
    {
        new MainWindow();
    }
}

还有我的 NetBeans 项目:http://www2.zippyshare.com/v/30402578/file.html

【问题讨论】:

  • 那么实际的问题是什么?
  • 好吧,汽车不想上移,在轨道上下移。更重要的是,我不知道如何旋转我的车以左转/右转……恐怕我不能使用方法 drawImage()。

标签: java swing client-server


【解决方案1】:
  1. JFrame 默认从不对 KeyEvent 做出反应,把 JPanel 放在那里

  2. 不要直接在 JFrame 上绘制(),而是使用 JPanel

  3. 在 JPanel 中覆盖 paintComponent,添加 super.paintComponent() 作为第一行代码(paint() 相同)

  4. 使用 KeyBindings(这里有关于这些键的大量示例)而不是 KeyListener

  5. 为什么会有两个JFrame,不要扩展JFrame,创建一个局部变量

  6. 也将图像加载到局部变量

【讨论】:

  • 不要临时使用 getGraphics() 是打印到文件或打印机的正确方法,而不是自定义绘画
  • 老实说,我不知道如何避免使用 getGraphics 方法...我不明白第 3 点,也不知道如何将 Image 加载到局部变量。对不起,我还在学习。我添加了 Jpanel,删除了 JFrame,添加了 KeyBindings。到目前为止,汽车正在移动,但留下了阴影。有一个代码:[链接]pastebin.com/w0VveKCP你有什么想法,如何旋转这辆车?问题是汽车必须朝着汽车引擎盖的方向移动。
  • see what I'm talking about,请忽略我的第 6 点(并以同样的方式声明 JFrame),code example about point 3rd,我将使用我的第 1 点。添加一些汽车图像的代码示例:-)
  • @dzeju555: ImageApp 是其中几个点的一个例子。
  • @mKorbel 我试图覆盖paintComponent() 方法并使用repaint() 方法代替paint。不幸的是,这辆车甚至没有画出来。我分析了这些例子,但没有帮助。有最新的代码:pastebin.com/ehsewTxe 你能引导我一步一步让它工作吗?到目前为止,我只想移动这辆车,没有阴影,没有错误。
猜你喜欢
  • 2015-03-24
  • 1970-01-01
  • 2022-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多