2017-05-29 5 views
0

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++; 
 

 
     } 
 
} 
 
}

Antwort

1

Wie rufe ich die Koordinaten von Mouse,

MouseMotionListener gibt ein MouseEvent das Verfahren, das die verschiedenen Eigenschaften des Ereignisses enthält, dazu gehört die Koordinaten des Ereignisses im Komponentenkoordinatenkontext

überprüfen, ob es innerhalb von 40 Pixeln meiner Frucht ist und wenn es

ist Also, das ist Grundkollisionserkennung, gibt es eine Reihe möglicher Wege, dies nähern könnte, sondern weil ich m lazy, könnte ich unter Verwendung Rectangle betrachten dem Benutzer Trefferfeld um den Mittelpunkt des MouseEvent

Rectangle hitBox = new Rectangle(e.getX() - 20, e.getY() - 20, 40, 40); 

Dies erzeugt ein Feld 20 Pixel darzustellen.

"Aber warum?" du fragst?Da Rectangle hat eine Reihe hilfreicher Methoden, die zur Kollisionserkennung verwendet werden können, einschließlich

  • intersection
  • intersects
  • union

ein paar zu nennen

So angesichts der x/y Position und Größe der Frucht, können Sie einfach ein erstellen wenn der zweite Rectangle und bestimmen die erste, die zweite

trifft und wenn es ist, um diese Frucht aus dem Rahmen zu bewegen?

Nun, wäre dies ein Verfahren zur Herstellung einer Flagge Einrichtung sein, die die „Hauptschleife“ (dh Ihr TimerListener), dass es, dass die Frucht erzählt getroffen wurde, ist es jetzt an der „Hauptschleife“ bis zu entfernen sie sie aus der „Farbe“ -Liste und Setup das nächste Objekt

Wenn möglich, nicht nur das zu tun, aber wenn sie auch einen Ton zu spielen, dass

Als allgemeine Antwort erfolgt, ist. Sobald Sie in der Lage waren zu erkennen, dass eine Kollision aufgetreten ist, ist das Abspielen eines Tons relativ einfach. Ich würde auch wieder versucht sein, die "Hauptschleife" zu verwenden, wenn ein Treffer entdeckt wurde

+0

"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

+0

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

+0

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