0

私は Eclipse Indigo を数か月間実行していますが、答えが見つからないように見えるバグに遭遇しました。マリオや古いゼルダなどに似た小さな 2D 横スクロール ゲームを作成しています。

私は自分のプログラムに追加した新機能を父に見せるつもりでした。私のコンピューターで私のプログラムを見るために二階に来る代わりに、私の父は、私が確信が持てない sudo 画面表示機能を使用してそれに入ることができると判断しました。以前にこれを使用したことがありますが、基本的には、自宅の別のコンピューターの画面 (同じ IP インターフェイス上) を表示するだけで、そのコンピューターも使用できます。

私はこのまま父に自分のプログラムを見せたくなかったので、二階に来るように言いました。彼はそれを行い、それ以来、Eclipse はプログラム内の JFrame 内にグラフィックを表示しません。単語 (画面に書かれたもの) などは表示されますが、グラフィックは表示されません。背景画像、キャラクター、その他何でも。父が画面を表示する前に、ゲームをかなりの回数テストしてプレイしたため、コーディングに問題がないことは確かです(私たちは両方ともLinux Mint 12、BTWを使用しています)。

このバグは、画面表示に関連していると思います。

少しでもお役に立てれば幸いです。どれでもいいです。ありがとう。

-これは解決しました*

ボード

package External;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.*;

public class Board extends JPanel implements ActionListener, Runnable { 
    Dude p; 
    Image img;    
    Timer time;
    int v = 172;
    Thread animator;

    boolean a = false;
    boolean done2 = false;

    public Board() {
        p = new Dude();
        addKeyListener(new AL());
        setFocusable(true);
        ImageIcon i = new ImageIcon ("/home/clark/Desktop/Swindle_test_background.png");
        img = i.getImage(); 
        time = new Timer (3, this);
        time.start();
    }

    public void actionPerformed(ActionEvent e) {
        p.move();
        repaint(); 
    }
    public void paint(Graphics g) {
        if (p.dy == 1 && done2 == false)
        {
            done2 = true;
            animator = new Thread(this);
            animator.start();
        }
        super.paint(g);
            Graphics2D g2d = (Graphics2D) g;
    if ((p.getX() - 590) % 2400 == 0)
        p.nx = 0;    
    if ((p.getX() - 1790) % 2400 == 0)
        p.nx2 = 0;
            g2d.drawImage(img, 985-p.nx2, 0, null);
            if (p.getX() >= 921)
            g2d.drawImage(img, 985-p.nx, 0, null);
            g2d.drawImage(p.getImage(), 75, v, null);


    }

    private class AL extends KeyAdapter {
        public void keyReleased(KeyEvent e) {
            p.keyReleased(e);
        }
        public void keyPressed(KeyEvent e) {
            p.keyPressed(e);
        }

    }
    boolean h = false;
    boolean done = false;

    public void cycle() {
        if (h == false)
                v--;
        if (v == 125)
                h = true;
        if (h == true && v <= 172 ) {
                v++;
        if (v == 172) {
                    done = true;

        }
    }
}




    public void run() {

        long beforeTime, timeDiff, sleep;

        beforeTime = System.currentTimeMillis();

        while (done == false) {

                cycle();

                timeDiff = System.currentTimeMillis() - beforeTime;
                sleep = 10 - timeDiff;

                if (sleep < 0)
                        sleep = 2;
                try {
                        Thread.sleep(sleep);
                } catch (InterruptedException e) {
                        System.out.println("interrupted");
                }

                beforeTime = System.currentTimeMillis();
        }
        done = false;
        h = false;
        done2 = false;
}

}

お前

package External;

import java.awt.Image;
import java.awt.event.KeyEvent;

import javax.swing.ImageIcon;

public class Dude {
    int x, dx, y, nx2, nx, dy;
    Image Swindle_Man_Right;
    ImageIcon r = new ImageIcon("/home/clark/Desktop/Swindle_Man_Right.png");
    ImageIcon l = new ImageIcon("/home/clark/Desktop/Swindle_Man_Left.png");
    ImageIcon j = new ImageIcon("/home/clark/Desktop/Swindle_Man_Jump.png");

    public Dude() {
        Swindle_Man_Right = l.getImage();
        x = 75;
        nx2 = 685;
        nx = 0;
        y = 172;

}


public void move() {
    x = x + dx;
    nx2 = nx2 + dx;
    nx = nx + dx;
}
public int getX() {
    return x;
}
public int getY() {
    return y;
}

public Image getImage() {
    return Swindle_Man_Right;
}

public void keyPressed(KeyEvent e) {
    int key = e.getKeyCode();
    if (key == KeyEvent.VK_LEFT)
    {               dx = -1;
    Swindle_Man_Right = l.getImage();
            }
    if (key == KeyEvent.VK_RIGHT)
            {dx = 1;
    Swindle_Man_Right = r.getImage();  
            }

    if (key == KeyEvent.VK_UP)
            {dy = 1;
            Swindle_Man_Right= j.getImage();
            }                       }

public void keyReleased(KeyEvent e) {
    int key = e.getKeyCode();

    if (key == KeyEvent.VK_LEFT)
            dx = 0;

    if (key == KeyEvent.VK_RIGHT)
            dx = 0;

    if (key == KeyEvent.VK_UP)
            {dy = 0;
            Swindle_Man_Right= r.getImage();}
            }
}

フレーム

package External;

import javax.swing.*;

public class Frame {

    public Frame() {
        JFrame frame = new JFrame("Swindle [version 0.1.9]");  
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(700,390); 
        frame.setResizable(false);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
    public static void main(String[] args) {
        new Frame();
}

}
4

1 に答える 1

1

私が知る限り、あなたはフレームに何も追加していません。

グラフィックを自分のものに置き換えた後、実行することができました...

ここに画像の説明を入力

public class Frame {

    public static void main(String[] args) {
        new Frame();
    }

    public Frame() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Swindle [version 0.1.9]");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                // This is kind of important...
                frame.add(new Board());

                frame.setSize(700, 390);
                frame.setResizable(false);
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }
}

コードをざっと見ただけですが、 を使用ImageIconして画像を読み込むのではなく、ImageIOAPIを使用することをお勧めします。より多くの画像形式をサポートするだけでなく、画像を読み込めない場合により多くのエラーがスローされます。

また、キーバインディングKeyListenerを優先して使用することも避けます。彼らは同じ焦点の問題に悩まされていませんKeyListener

于 2013-04-20T02:27:24.047 に答える