Java中的精灵运动

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中的精灵运动相关的知识,希望对你有一定的参考价值。

我开始学习java作为业余爱好,因为我想做一个小游戏。我学习了java的基础知识,并且我决定尝试解决游戏开发问题。我的JFrame和一切都很好,我在技术上没有错误,但我的小矩形人不会在屏幕上移动。这是我的代码:

package main;

import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;

public class Race extends JFrame {

public int speed=5;
public int up=1;
public int left=2;
public int down=3;
public int right=4;
public int direction=0;

Rectangle p1 = new Rectangle (500,400,20,40);

public Race()
{
    super("Race");
    setSize(1000,800);
    setVisible(true);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Container cont=getContentPane();
    cont.setBackground(Color.orange);
    setResizable(false);
}

public void paint(Graphics g)
{
    super.paint(g);
    g.setColor(Color.red);
    g.fillRect(p1.x, p1.y, p1.width, p1.height);
}


public class Move extends Thread implements KeyListener
{
    public void run()
    {
        addKeyListener(this);

        while(true)
        {
            try
            {
                repaint();

                if(direction==up)
                {
                    p1.y-=(int)speed;
                }
                if(direction==down)
                {
                    p1.y+=(int)speed;
                }
                if(direction==right)
                {
                    p1.x+=(int)speed;
                }
                if(direction==left)
                {
                    p1.x-=(int)speed;
                }   
                    Thread.sleep(75);
            }
                catch (Exception e)
                {
                    break;
                }
            }
        }

    @Override
    public void keyPressed(KeyEvent event) {
        // TODO Auto-generated method stub

    }

    @Override
    public void keyReleased(KeyEvent event) {
        // TODO Auto-generated method stub

    }

    @Override
    public void keyTyped(KeyEvent event) {
        // TODO Auto-generated method stub
        if(event.getKeyChar()=='w')
        {
            direction = up;
        }
        if(event.getKeyChar()=='d')
        {
            direction = left;
        }
        if(event.getKeyChar()=='s')
        {
        direction = down;   
        }
        if(event.getKeyChar()=='a')
        {
            direction = left;
        }
    }

    }





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

}

谢谢!

答案

有几个问题:

  1. 您没有创建Move实例,因此没有任何内容正在侦听键。
  2. 我认为你甚至不需要在后台线程中运行的Move类。获取KeyListener逻辑并将其放入Race类中,然后通过调用addKeyListener(this);“启用”keyListener,以便它开始监听按键。 Race extends JFrame implements KeyListener{ Race(){ ... addKeyListener(this); } @Override public void keyTyped(KeyEvent event) { if(event.getKeyChar()=='w') { direction = up; } if(event.getKeyChar()=='d') { direction = left; } if(event.getKeyChar()=='s') { direction = down; } if(event.getKeyChar()=='a') { direction = left; } repaint(); }

另见这个问题:Unresponsive KeyListener for JFrame获得更多帮助。

另一答案

如果在Race类中调用Move类,请执行以下操作:

public Move move;

然后在你的Race构造函数下调用它:

move = new Move();

在你移动类你做一个像这样的构造函数:

public Move()
    {
        run();
    }

这应该让它移动:)

对于抬头,您需要将按键d更改为向右而不是向左。

以上是关于Java中的精灵运动的主要内容,如果未能解决你的问题,请参考以下文章

Atitit  如何让精灵控件运动

html 在http://burnmind.com/tutorials/dr上发布的“如何将精灵的拖动运动限制在Phaser的X和Y轴上”教程的代码

如何在片段着色器中平铺部分纹理

精灵动画从左到右,我应该选择啥?动态的还是运动的?

Cocos2d-x《赵云要格斗》--虚拟摇杆控制精灵上下左右运动

CSS中的媒体片段URI替代方案?