2013-03-13 21 views
1

我只是試圖製作一個大學的遊戲,這是一個玩家用鍵盤導航以通過迷宮的球。唯一困擾的是我的背景是一個迷宮的圖像,當我添加「球」時,當我註釋掉油漆和油漆組件時,重新繪製背景(虛化顏色,沒有圖像),迷宮背景又回來了,但當然沒有球。作爲背景和繪畫的組成部分

我是一個新來的java,我已經搜索了這個,並且無法看到我已經擁有的代碼的良好靈魂。它是不透明的?是不透明的?......即使是正確的方向也不透明?

一旦我得到這個...我完全瞭解使用碰撞檢測來檢測與迷宮「牆」

試圖弄清楚這一點,是對Java的碰撞,可以使一個成年男子哭泣。

main.java

public class Main{ 

public static void main (String[] args){ 

    //System.out.println("Start of the Game"); 

    GameFrame game1 = new GameFrame(); 
} 

JavaGame.java

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
import javax.imageio.ImageIO; 
import javax.swing.ImageIcon; 
import java.io.File; 
import java.io.IOException; 


public class GameFrame extends JFrame{   

private int frameWidth = 240, frameHeight =315; 
    int x, y; 
    private Image dbImage; 
    private Graphics dbg; 

//Below is the constructor   

public GameFrame(){   

     super("OperationMaze!"); 
     addKeyListener(new AL()); 
     setResizable(false); 
     //setTitle("OperationMaze!2"); 
     //setSize(250, 302); 
     setSize(frameWidth, frameHeight); //Set height and width 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    


      //Because of opening file, there needs to be a try catch just incase there is an error opening. 
      //Plus java won't let you unless you try catch. 
    try{ 

       setContentPane(new JLabel(new ImageIcon(ImageIO.read(new File("C:/Documents and Settings/brando/My Documents/NetBeansProjects/GameFrame/src/maze.jpg"))))); 

    } catch (IOException e) { 
       e.printStackTrace();      
       }  


     //Show the frame 


     setVisible(true); 
     //setOpaque(false);  
     y = 35; 
     x = 15; 
} 

    public void paint(Graphics g) { 

     dbImage = createImage(getWidth(), getHeight()); 
     dbg = dbImage.getGraphics(); 
     paintComponent(dbg); 
     g.drawImage(dbImage, 0, 0, this);   
    } 

    public void paintComponent(Graphics g) {     

     g.fillOval(x, y, 15, 15); 
     //g.setOpaque(false); 

     repaint();   
    } 

    // private void setOpaque(boolean b) { 
    //  throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 

    // } 

    public class AL extends KeyAdapter { 

     public void keyPressed(KeyEvent e) { 
      int keyCode = e.getKeyCode(); 
      if(keyCode == e.VK_LEFT) { 
       if(x <= 5) 
        x = 5; 
       else 
        x += -5; 
      } 
      if(keyCode == e.VK_RIGHT) { 
       if(x >= 230) 
        x = 230; 
       else 
        x += +5; 
      } 
      if(keyCode == e.VK_UP) { 
       if(y <= 23) 
        y=23; 
       else 
        y += -5; 
      } 
      if(keyCode == e.VK_DOWN) { 
       if(y >= 277) 
        y = 277; 
       else 
        y += +5; 
      } 
    } 
    } 
} 

回答

2

好吧,讓我們來看看發生了什麼事情錯在這裏:

當我添加了 「球」,它重新繪製背景(默認顏色,無圖像)

在這種情況下,當您使用自定義paint方法時,不會調用super.paint(g),因此JLabelImage不會被繪製。

Image創建空白:

dbImage = createImage(getWidth(), getHeight()); 

Graphics提供convenient overloaded method of drawImage,允許您指定寬度&高度,讓您避免這樣做。)

結果:沒有背景圖片。

當我註釋掉油漆和油漆組件時,迷宮背景又回來了,但是當然沒有球。

現在Swing被調用默認paint執行,確保所有的子組件被吸引,但現在你不打電話給你fillOval方法,最終的結果:背景Image,沒有球。

未來在哪裏:

爲了讓鞦韆做定製的工作畫你需要覆蓋paintComponent而不是直接調用它。但是,這不能在像JFrame這樣的頂級容器中完成。在新組件中對JComponent進行子分類並重寫paintComponent將允許Swing調用該方法,而無需直接執行。添加@Override將允許編譯器檢查您是否確實覆蓋了該方法,其中。正如你打算粉刷Image,你可以簡單地加載Image和保存使用的參考,當你需要把它漆成:

dbImage = ImageIO.read(new File("MyImage.jpg")); 
在新 JComponent基類

然後:

@Override 
protected void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    g.drawImage(dbImage, 0, 0, getWidth(), getHeight(), this); 
    g.fillOval(x, y, 15, 15); 
}