2016-02-17 27 views
1

我試圖做一個遊戲,當你遇到物體搖滾時你會死,但我無法使用MouseEntered方法。有人能告訴我如何?我也想問關於加載所有精靈圖像。我成功加載它們,但卻無法讓岩石從圖像變成圖像。使用mouseEntered

Tester類

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(); 
    } 
} 

岩石類

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); 
    } 

} 
+0

「SpriteSheet」類是如何工作的? – MadProgrammer

+0

1)爲了更好地提供幫助,請發佈[MCVE]或[簡短,獨立,正確的示例](http://www.sscce.org/)。 2)獲取圖像的一種方法是通過[本問答](http://stackoverflow.com/q/19209650/418556)中的圖像進行熱鏈接。 –

回答

1

基本回答您的mouseEntered問題是...

mouseEntered會當你鼠標進入組件,它會被稱爲當鼠標包含在組件內時不會被調用。

相反,也許可以考慮使用MouseMotionListener#mouseMoved,它會告訴鼠標何時移動到組件上。

你的第二個問題需要更多的代碼,特別是SpriteSheet類,但我懷疑你需要知道你正在繪製的當前幀,並簡單地使用SpriteSheet#grabSprite來獲取幀的合適圖像。

這需要你知道:

  1. 幀每秒你正在努力實現
  2. 已經從週期的開始所經過的時間量的數量(一個週期過一次第二在這種情況下)

這將允許你以計算幀,並從該計算你應該顯示

作爲粗略的例中,圖像,你可以看看How to Draw an BufferedImage to a JPanel