0

私と私の友人は、背景にレイヤー化された画像と、それらの画像の上にそれらをナビゲートするためのボタンを配置したいゲームに取り組んでいます。一方の画像は同じままで、もう一方の画像は絶えず変化しています。これを行うには、render と tick の哲学が素晴らしいと思いました。

日本の安っぽいビジュアル ノベル ゲームを見たことがある人は、基本的にそれが私たちが取り組んでいることです。

更新:だから私は以下のあなたの提案の多くを使用しました. 私の新しい問題は、スクロールする前にJButtonが画像の下に消えることです。提案どおりに super.paintComponent(g) を追加すると、すべてが表示されるとすぐに消えます。

現在、メイン メソッドのコードは次のようになっています。

package Urban.Blade.Package;

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.*;
import Urban.Blade.Package.gfx.*;
import javax.swing.*;

public class MainGame extends JPanel{
    private static final long serialVersionUID = 1L;
    public static final int WIDTH = 300, HEIGHT = 300, SCALE = 2, PICSCALE = 0;
    public BufferedImage background1;
    public BufferedImage testCharacter1;
    static JButton b1 = new JButton();
    static JButton b2 = new JButton();
    static JPanel j1 = new JPanel();
    static JPanel j2 = new JPanel();
    static JFrame frame = new JFrame("Urban Blade");
    static MainGame mGame = new MainGame();
    static JLayeredPane lJ = new JLayeredPane();
    static JLayeredPane lJ2 = new JLayeredPane();


    public static void main(String[] args){ 
        lJ.setPreferredSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE));
        lJ.setMaximumSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE));
        lJ.setMinimumSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE));
        lJ.setBounds(0, 0, WIDTH * SCALE, HEIGHT * SCALE);

        mGame.setPreferredSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE));
        mGame.setMaximumSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE));
        mGame.setMinimumSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE));
        mGame.setBounds(0, 0, WIDTH * SCALE, HEIGHT * SCALE);

        frame.setSize(WIDTH * SCALE, HEIGHT * SCALE);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);
        lJ.setLayout(null);

        frame.add(mGame);
        frame.add(lJ);

        j2.setLayout(new GridLayout());
        j2.setSize(WIDTH * SCALE, HEIGHT * SCALE);
        j2.setLocation(0, 0);

        j1.setLayout(new GridLayout());
        j1.setSize(100, 25);
        j1.setLocation(225*SCALE, 250*SCALE);
        j1.add(b1);
        b1.addMouseListener(new MouseAdapter() {
                public void mouseClicked(MouseEvent me) {
                System.out.println("CLICKED");
            }
        });


        frame.setVisible(true);

        lJ.add(j2);
        lJ.add(j1);
        lJ.setComponentZOrder(j2, 1);
        lJ.setComponentZOrder(j1, 0);
        mGame.init();
        mGame.paintComponent();
    }

    public void init(){
        ImageLoader loader = new ImageLoader();
        background1 = loader.load(new File("res/testBackground.png"));
        testCharacter1 = loader.load(new File("res/testForeground.png"));


    }

    public void paintComponent(){
        Graphics g = j2.getGraphics();

        g.drawImage(background1, 0, 0, WIDTH * SCALE, HEIGHT * SCALE, null);
        g.drawImage(testCharacter1, 0, 0, WIDTH * SCALE, HEIGHT * SCALE, null);

        super.paintComponent(g);

        g.dispose();
    }
}
4

1 に答える 1

0

あなたの問題は、BufferStrategy で通常の GUI 描画とカスタム描画を混在させようとしていることです。BufferStrategy を使用している場合、更新/ペイント操作は機能しません。1 つのオプションは、null レイアウト マネージャーで通常の paint/paintComponent オーバーライドを使用して、ボタンを好きな場所に配置し、その背後に画像を描画できるようにすることです。

引き続き BufferStrategy を使用したい場合は、Graphics オブジェクトを渡してペイントを手動で呼び出すことができます。私は試したことがないので、これが機能するかどうかはわかりません。

最初のオプションを使用する場合、JPanel の背景が不透明ではなく透明であることを確認する必要があります。また、画像を描画した後に super.paint() を呼び出す必要があるため、カスタム描画の後に JDK 描画が行われ、ボタンが一番上に表示されます。

于 2014-08-20T20:43:45.030 に答える