1

私は単に大学向けのゲームを作ろうとしています。これは、プレーヤーがキーボードでナビゲートして迷路を通過するボールです。私が立ち往生している唯一のことは、背景が迷路の画像であることです。「ボール」を追加すると、背景が再描画されます(デフォルトの色、画像なし)ペイントとペイントコンポーネントをコメントアウトすると、迷路の背景が戻ってきます、しかしもちろんボールはありません。

私はJavaが初めてで、これを検索しましたが、既に持っているコードの良いソウルリションが見つかりません。setOpaqueですか?isOpaque?.... 正しい方向でも不透明ですか?

これを取得したら...衝突検出を使用して迷路の「壁」との衝突を検出することを完全に理解しています

これを理解しようとすると、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;
            } 
    }
    }
}
4

1 に答える 1

2

さて、ここで何が問題なのか見てみましょう:

「ボール」を追加すると、背景が再描画されます(デフォルトの色、画像なし)

このシナリオでは、カスタムpaintメソッドを使用しているときに を呼び出さないsuper.paint(g)ため、JLabelwithImageが描画されません。

Image作成する空白です。

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

(Graphicsは、幅と高さを指定できるdrawImage の便利なオーバーロード メソッドを提供し、これを回避できるようにします。)

結果: 背景画像がありません。

ペイントとペイント コンポーネントをコメント アウトすると、迷路の背景が元に戻りますが、もちろんボールはありません。

現在、すべての子コンポーネントが描画されることを保証するSwingデフォルトの実装を呼び出していますが、メソッド、最終結果: background 、no ball を呼び出していません。paintfillOvalImage

次の場所:

Swing がカスタム ペイントの作業を実行できるようにするには、直接呼び出すのではなく、オーバーライド する必要があります。paintComponentただし、これは のような最上位のコンテナでは実行できませんJFrame。a をサブクラス化し、その新しいコンポーネントJComponentでオーバーライドpaintComponentすると、Swing はそのメソッドを直接呼び出さなくても呼び出すことができます。を追加すると、コンパイラはメソッドを実際にオーバーライドしている@Overrideことを確認できます。をペイントするつもりなので、ペイントする必要があるときに参照をロードして保存するだけです。ImageImage

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);
}
于 2013-03-13T13:58:29.967 に答える