使用鼠标输入
Using mouseEntered
我正在尝试制作一个游戏,在该游戏中当物体撞击您时您会死亡,但我没有使用 MouseEntered 方法。有人可以告诉我怎么做吗?我还想问一下加载所有精灵图像的问题。我成功加载了它们,但未能使岩石从一个图像变为另一个图像。
测试员class
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.Timer;
public class Tester extends JPanel{
public JFrame window = new JFrame("Rock stuff");
public Timer tmr ;
public ArrayList<Rock> rocks = new ArrayList<Rock>();
public Tester(){
window.setBounds(500, 400, 500, 500);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setVisible(true);
window.add(this);
tmr = new Timer(1, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
for(Rock r:rocks)
r.move();
repaint();
}
});
this.addMouseListener(new MouseListener() {
@Override
public void mouseReleased(MouseEvent e) { }
@Override
public void mousePressed(MouseEvent e) {
for(Rock r:rocks) {
if(r.contains(e.getPoint())){
Rock newRock = r.split();
if(newRock != null){
rocks.add(newRock);
rocks.add(newRock);
}
else{
rocks.remove(r);
if(rocks.size()==0){
tmr.stop();
repaint();
JOptionPane.showMessageDialog(window, "Game Over");
}
}
return;
}
}
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
for(Rock r:rocks){
if(r.contains(e.getPoint())){
rocks.clear();
JOptionPane.showMessageDialog(window, "Game Over");
}
}
}
@Override
public void mouseClicked(MouseEvent e) {
}
});
addrock(10);
tmr.start();;
}
private void addrock(int count) {
Random rnd = new Random();
for(int i=0;i<count;i++)
rocks.add(new Rock( rnd.nextInt(getWidth()),
rnd.nextInt(getHeight()),
32,32,
(rnd.nextBoolean()?1:-1),
(rnd.nextBoolean()?1:-1),
true
) );
}
public void paint(Graphics g){
super.paint(g);
Rock.sw = getWidth();
Rock.sh = getHeight();
for(Rock r:rocks) r.draw(g);
}
public static void main(String[] args) {
new Tester();
}
}
岩石class
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
public class Rock extends Rectangle{
public static int sw, sh;
public int dx, dy;
public boolean isMoving;
public BufferedImage sprite;
//================================================= Constructors
public Rock(int x, int y, int width, int height, int dx, int dy, boolean isMoving) {
super();
this.width = width;
this.height = height;
this.x = x;
this.y = y;
this.dx = dx;
this.dy = dy;
this.isMoving = isMoving;
this.sprite = init();
}
//================================================= Methods
public BufferedImage init(){
BufferedImageLoader loader = new BufferedImageLoader();
BufferedImage spriteSheet = null;
try {
spriteSheet = loader.loadImage("hero.png");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
SpriteSheet ss = new SpriteSheet(spriteSheet);
sprite = ss.grabSprite(0, 0, 32, 32);
return sprite;
}
public void move() {
if(isMoving == false) return;
x += dx;
y += dy;
if(x + width > sw) {
x = sw - width;
dx = -dx;
}
if(y + height > sh) {
y = sh - height;
dy = -dy;
}
if(x < 0) {
x = 0;
dx = -dx;
}
if(y < 0) {
y=0;
dy = -dy;
}
}
public Rock split(){
Rock r = null;
Random rnd = new Random();
if(width > 20){
dx=(rnd.nextBoolean()?1:-1);
dy=(rnd.nextBoolean()?1:-1);
r = new Rock(x,y,width,height,dx,dy,true);
}
return r;
}
public void draw(Graphics g) {
g.drawImage(sprite,x,y,null);
}
}
mouseEntered
问题的基本答案是...
mouseEntered
会在鼠标进入组件时调用,当鼠标继续在组件内时永远不会调用。
相反,也许可以考虑使用 MouseMotionListener#mouseMoved
,当鼠标移到您的组件上时它会告诉您。
你的第二个问题需要更多代码,特别是 SpriteSheet
class,但我怀疑你需要知道你正在绘制的当前帧并简单地使用 SpriteSheet#grabSprite
来抓取框架的适当图像。
这需要你知道:
- 您尝试达到的每秒帧数
- 从循环开始经过的时间量(在这种情况下,一个循环是一秒)
这将允许您计算帧并从中计算您应该显示的图像
举个粗略的例子,你可以看看
我正在尝试制作一个游戏,在该游戏中当物体撞击您时您会死亡,但我没有使用 MouseEntered 方法。有人可以告诉我怎么做吗?我还想问一下加载所有精灵图像的问题。我成功加载了它们,但未能使岩石从一个图像变为另一个图像。
测试员class
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.Timer;
public class Tester extends JPanel{
public JFrame window = new JFrame("Rock stuff");
public Timer tmr ;
public ArrayList<Rock> rocks = new ArrayList<Rock>();
public Tester(){
window.setBounds(500, 400, 500, 500);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setVisible(true);
window.add(this);
tmr = new Timer(1, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
for(Rock r:rocks)
r.move();
repaint();
}
});
this.addMouseListener(new MouseListener() {
@Override
public void mouseReleased(MouseEvent e) { }
@Override
public void mousePressed(MouseEvent e) {
for(Rock r:rocks) {
if(r.contains(e.getPoint())){
Rock newRock = r.split();
if(newRock != null){
rocks.add(newRock);
rocks.add(newRock);
}
else{
rocks.remove(r);
if(rocks.size()==0){
tmr.stop();
repaint();
JOptionPane.showMessageDialog(window, "Game Over");
}
}
return;
}
}
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
for(Rock r:rocks){
if(r.contains(e.getPoint())){
rocks.clear();
JOptionPane.showMessageDialog(window, "Game Over");
}
}
}
@Override
public void mouseClicked(MouseEvent e) {
}
});
addrock(10);
tmr.start();;
}
private void addrock(int count) {
Random rnd = new Random();
for(int i=0;i<count;i++)
rocks.add(new Rock( rnd.nextInt(getWidth()),
rnd.nextInt(getHeight()),
32,32,
(rnd.nextBoolean()?1:-1),
(rnd.nextBoolean()?1:-1),
true
) );
}
public void paint(Graphics g){
super.paint(g);
Rock.sw = getWidth();
Rock.sh = getHeight();
for(Rock r:rocks) r.draw(g);
}
public static void main(String[] args) {
new Tester();
}
}
岩石class
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
public class Rock extends Rectangle{
public static int sw, sh;
public int dx, dy;
public boolean isMoving;
public BufferedImage sprite;
//================================================= Constructors
public Rock(int x, int y, int width, int height, int dx, int dy, boolean isMoving) {
super();
this.width = width;
this.height = height;
this.x = x;
this.y = y;
this.dx = dx;
this.dy = dy;
this.isMoving = isMoving;
this.sprite = init();
}
//================================================= Methods
public BufferedImage init(){
BufferedImageLoader loader = new BufferedImageLoader();
BufferedImage spriteSheet = null;
try {
spriteSheet = loader.loadImage("hero.png");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
SpriteSheet ss = new SpriteSheet(spriteSheet);
sprite = ss.grabSprite(0, 0, 32, 32);
return sprite;
}
public void move() {
if(isMoving == false) return;
x += dx;
y += dy;
if(x + width > sw) {
x = sw - width;
dx = -dx;
}
if(y + height > sh) {
y = sh - height;
dy = -dy;
}
if(x < 0) {
x = 0;
dx = -dx;
}
if(y < 0) {
y=0;
dy = -dy;
}
}
public Rock split(){
Rock r = null;
Random rnd = new Random();
if(width > 20){
dx=(rnd.nextBoolean()?1:-1);
dy=(rnd.nextBoolean()?1:-1);
r = new Rock(x,y,width,height,dx,dy,true);
}
return r;
}
public void draw(Graphics g) {
g.drawImage(sprite,x,y,null);
}
}
mouseEntered
问题的基本答案是...
mouseEntered
会在鼠标进入组件时调用,当鼠标继续在组件内时永远不会调用。
相反,也许可以考虑使用 MouseMotionListener#mouseMoved
,当鼠标移到您的组件上时它会告诉您。
你的第二个问题需要更多代码,特别是 SpriteSheet
class,但我怀疑你需要知道你正在绘制的当前帧并简单地使用 SpriteSheet#grabSprite
来抓取框架的适当图像。
这需要你知道:
- 您尝试达到的每秒帧数
- 从循环开始经过的时间量(在这种情况下,一个循环是一秒)
这将允许您计算帧并从中计算您应该显示的图像
举个粗略的例子,你可以看看