簡體   English   中英

在Java Applet中運行游戲

[英]Running Game in a Java Applet

我已經在網上找到的不同代碼片段的幫助下編寫了一個小的2d卷軸。 原始包作為JFrame應用程序運行,但我試圖將其轉換為applet。 當我在Eclipse中運行程序時,我沒有收到任何調試錯誤只是一個空白的applet查看器...我不認為我從我從不同的applet創建源讀取的內容中遺漏了任何東西但是它可能非常簡單。

幀類

package OurGame;

import java.awt.*;
import javax.swing.*;

public class Frame extends JApplet {

public Frame() {
    JPanel frame = new JPanel();
    frame.add(new Board()); 
    // frame.setTitle("2D PLATFORMER");
    // frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(700,365);
    frame.setVisible(true);
    //frame.setLocationRelativeTo(null);
    //setContentPane(frame);
}
// public static void main(String[] args){
public void init() {
    new Frame();
}
 }

我已經注釋掉了只能在Jframe中使用的容器。

老兄班

package OurGame;

import java.awt.*;
import java.awt.event.KeyEvent;
import javax.swing.ImageIcon;

public class Dude {
int x, dx, y,nx,nx2,left, dy;
Image still,jump,reverse;

ImageIcon s = new ImageIcon("redirect.png");
ImageIcon j= new ImageIcon("redirect.png");
ImageIcon l = new ImageIcon("redirect.png");

public Dude() {
    x = 75;
    left = 150;
    nx = 0;
    nx2= 685;
    y = 172;
    still = s.getImage();


}

public void move() {
    if (dx != -1){
        if (left + dx <= 150)
            left+=dx;
        else{
    x = x + dx;

    nx2= nx2+dx;
        nx = nx + dx;
}}
    else
{
    if (left+dx >0)
    left = left + dx;
}
    }

public int getX() {
    return x;
}

public int getnX() {
    return nx;
}

public int getnX2() {
    return nx2;
}

public int getdx() {
    return dx;
}

public Image getImage() {
    return still;
}

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

    if (key == KeyEvent.VK_RIGHT)
        {dx = 1;
    still = s.getImage();   
        }

    if (key == KeyEvent.VK_UP)
        {dy = 1;
        still = 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;
        still = s.getImage();}
        }
}

董事會類

package OurGame;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Board extends JPanel implements ActionListener, Runnable {
Dude p;
public 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("redirect.jpg");
    img = i.getImage();
    time = new Timer(5, 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.getX() == 590 || p.getX() == 2990)
        p.nx = 0;
    if ((p.getX() - 1790) % 2400 == 0)// p.getX() == 1790 || p.getX() == 4190)
        p.nx2 = 0;

    g2d.drawImage(img, 685 - p.getnX2(), 0, null);
    if (p.getX() > 590) {
        g2d.drawImage(img, 685 - p.getnX(), 0, null);
    }
    g2d.drawImage(p.getImage(), p.left, v, null);

    if (p.getdx() == -1) {
        g2d.drawImage(img, 685 - p.getnX2(), 0, null);
        g2d.drawImage(p.getImage(), p.left, 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;
}

}

經過大量研究后,我有點磕磕絆絆。 我認為Eclipse可能不會認識到我有多個類文件,但我通過編寫一個html頁面來顯示我的applet運行正常但是完全是空的,從而證明了理論錯誤。

applet查看器為什么在運行它時甚至在eclipse中為空。

在任何時候都沒有任何東西添加到applet容器中。 要向applet添加內容,需要重寫applet init()方法並調用add(new Board()); (這也可以在構造函數中完成,但在init()方法中構建applet GUI更為常見。)


其他說明

paint(Graphics)

由於Board是一個不是頂級容器的Swing類,因此自定義繪制應該在paintComponent(Graphics)方法中完成,而不是paint(Graphics)

命名法

JPanel frame = new JPanel();

哇! 選擇不當的屬性名稱。 你怎么稱呼你的JFrame實例, panel

應用資源

ImageIcon s = new ImageIcon("redirect.png");

這不適用於applet,也不適用於已部署的應用程序。 有必要通過URL訪問圖像。 Applet類具有加載圖像的特定方法。

剩下的構造函數

JPanel frame = new JPanel();
frame.add(new Board()); 
frame.setSize(700,365);
frame.setVisible(true);

不需要構造函數的第一行,可以將下一行中創建的Board直接添加到applet。 這留下了兩條未注釋掉的線條。

frame.setSize(700,365);

applet的大小應該由HTML設置。

frame.setVisible(true);

添加到可見組件的任何內容本身都將變為可見。 因此,這也是多余的。

擺動Timer

因為我在代碼中指出了很多錯誤,我想應該補充說動畫似乎是正確完成的 - 使用Swing Timer :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM