Ich habe gerade erst vor einer Weile mit der Codierung begonnen. Ich versuche gerade ein FruitNinja Spiel mit JPanel
zu erstellen und ich habe ziemlich viel mit allem gemacht (mit Ausnahme der Schleifen, die das Spiel und den Rest der Frucht-/Bombenanimationen machen)Problem mit dem MouseMotionListener
Bisher habe ich animierte nur die Apple.png
(wird zu animieren andere Früchte bekommen, wenn ich damit fertig bin)
ich versuche, eine checkHit
Methode zu machen, dass meine Maus überprüft, ob oder nicht auf das Bild geht (Schneiden durch die Frucht), also die MouseMotionListener
, die verwendet werden muss. Wenn die Maus über die Frucht geht, muss ich sie verschwinden lassen.
Wie also finde ich die Koordinaten von MouseMotionListener
, überprüfen, ob es innerhalb von 40 Pixel von meiner Frucht ist und wenn es ist, diese Frucht des Rahmens zu bewegen? Wenn möglich, nicht nur das zu tun, sondern auch einen Ton zu spielen, wenn das erledigt ist.
Ich habe einen anderen Benutzer, um mir mit diesem Problem zu helfen, aber ich kann es immer noch nicht richtig herausfinden.
import javax.swing.*;//imports JPanel class
import java.awt.*;//imports the Graphics class
import java.awt.event.*;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseEvent;
import java.awt.event.ActionListener;
//imports packages needed for the hovering
public class FruitNinja extends JPanel{
private Image dojo;
private Image apple;
private Image orange;
private Image pear;
private Image strawberry;
private Image banana;
private Image bomb;
//declares the import image variables
private javax.swing.Timer timer;
private int dx, dy;
private int vx =40;
//velocity of the object moving in the x direction
private int x=-10;
private int vy=40;
//velocity of the object moving in the y direction
private int y=770;
private int divide=(int)(2*Math.random())+1;//sets random number
//determines when the fruit will bounce off
public FruitNinja() { // a constructor to set up graphics windo
super();
setBackground(Color.WHITE);
loadImage();
dx = 25;
dy = 25;
timer = new javax.swing.Timer(30, new TimerListener());
//interval of 10 milliseconds
timer.start();
//timer is a facility for threads to schedule tasks for future execution in a background thread.
}
private void loadImage() {
ImageIcon ii = new ImageIcon("Dojo.jpg");
dojo = ii.getImage();
ImageIcon oo = new ImageIcon("Orange.ico");
orange = oo.getImage();
ImageIcon ss = new ImageIcon("Strawberry.png");
strawberry = ss.getImage();
ImageIcon bb = new ImageIcon("Banana.png");
banana = bb.getImage();
ImageIcon pp = new ImageIcon("Pear.png");
pear = pp.getImage();
ImageIcon aa = new ImageIcon("Apple.png");
apple = aa.getImage();
ImageIcon bo=new ImageIcon("Bomb.png");
bomb=bo.getImage();
//loads neccaseary images for this game
}@Override
public void paintComponent(Graphics g){ // draw graphics in the panel
super.paintComponent(g);// to make panel display correctly
g.drawImage(dojo, 0,0, this);
//draws out dojo
g.drawImage(apple, x,y, this);
g.drawImage(orange, -300,-300, this);
g.drawImage(pear, -300,-300, this);
g.drawImage(banana, -300,-300, this);
g.drawImage(strawberry, -300,-300, this);
//draws out the fruits somewhere
g.drawImage(bomb,-300,-300,this);
//draws out the bomb that will make the player lose
}
private class TimerListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
//implements the ActionListenter
x+=vx; //adds velocity to the x, which makes it travel in x direction
if (x<0){
vx=(-1*vx);
//tells the velocity to change direction
}
y+=vy; //adds velocity to the y, which makes it travel in y direction
if (y>=getHeight()||y<=getHeight()/4){
vy=(-1*vy);
//tells the velocity to change direction
}
repaint(); // causes paintComponent to be called by the JVM
}
}
public static void main(String[] args) {
FruitNinja panel = new FruitNinja(); // window for drawing
JFrame f = new JFrame(); // the program itself
f.setTitle("Fruit Ninja");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//when the X button is clicked, the program quits
f.setSize(1280,800);//size of the frame
Container pane = f.getContentPane();//pane refers to the interior of the JFrame
FruitNinja p1 = new FruitNinja();
pane.add(p1);//add the FacePanel object to the interior of the frame
f.setVisible(true);
}
}
Bitte lassen Sie mich wissen, wenn ich etwas tue falsch mit dem, was ich habe hier oder/und wie kann ich diese MouseMotionListner
innen verwenden. Ich bin noch ziemlich neu, also weiß ich nicht, wie ich die Koordinaten abrufen oder den 'MouseMotionListener' einrichten soll. Wenn meine Frage unklar ist, können Sie sich gerne in die Kommentare eintragen und mich wissen lassen, ob das der Fall ist. Ich bin bereit, das Thema genauer zu erklären.
Dank
Edit:
Ist das die Methode?
private class HandleMouse extends MouseAdapter {
//extends MouseAdapter rather than implement Mouse Adapter
public void mousePressed(MouseEvent e){
Rectangle hitBox = new Rectangle(e.getX() - 20, e.getY() - 20, 40, 40);
Rectangle appleHitBox=new Rectangle(ax-128,ay-128,256,256);
Area area = new Area(hitBox);
area.intersect(new Area(appleHitBox));
if(!area.isEmpty()){
ax=-500;
ay=-500;
avx=0;
avy=0;
}
else{
numOfMisses++;
}
}
}
"MouseMotionListener übergibt ein MouseEvent an die Methode, die die verschiedenen Eigenschaften des Ereignisses enthält, einschließlich der Koordinaten des Ereignisses im Komponentenkoordinatenkontext." Nur wundernd, was ist der Code, um das zu tun? Ich habe gestern nur von MouseMotionListner gehört und immer noch mit der Oracle Doc-Demo verwechselt. – Martin
Sorry für den fortgesetzten Kommentar-Spam, ich würde gerne mit dir chatten, wenn möglich, aber ich habe bisher nicht die Reputationspunkte benötigt. Wie könnte ich ein Rechteck für das Bild erstellen? Ich nehme an, sobald beide Hitboxen gemacht sind, dann können wir ein if-else verwenden, um zu überprüfen, ob der Treffer registriert wurde, und ihn dann aus dem Frame entfernen? Ich bin mir immer noch nicht sicher, was ich überhaupt machen soll. Wäre toll wenn ein Chat möglich wäre, aber leider finde ich das nicht. – Martin
Ich würde es wirklich wirklich schätzen, wenn du mich in einen Chatroom einladen könntest, wo wir das diskutieren können, ohne Kommentare zu verschicken? Ich würde dafür töten und du würdest meine ewige Dankbarkeit erhalten. Bitte? – Martin