首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java小程序中运行游戏

在Java小程序中运行游戏
EN

Stack Overflow用户
提问于 2011-11-29 19:15:35
回答 1查看 1.7K关注 0票数 1

我已经写了一个小的2d滚轮,在我在网上找到的不同代码片段的帮助下。原始包作为JFrame应用程序运行,但我试图将其转换为applet。当我在Eclipse中运行这个程序时,我不会收到任何调试错误,只是一个空白的applet查看器.我不认为我错过了从不同的applet创建来源,但可能是一些非常简单的东西。

帧类

代码语言:javascript
复制
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中使用的容器去掉了。

哥们儿班

代码语言:javascript
复制
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();}
        }
}

板级

代码语言:javascript
复制
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,从而证明了这一理论是错误的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-11-30 11:20:05

为什么小程序查看器在运行时即使在eclipse中也是空白的。

在任何情况下,都不能向applet容器添加任何内容。要向applet添加一些内容,需要重写applet init()方法并调用add(new Board());。(这也可以在构造函数中完成,但是在init()方法中构建applet更常见。)

其他备注

paint(Graphics)

由于Board是一个不是顶级容器的Swing类,因此应该在paintComponent(Graphics)方法中而不是在paint(Graphics)中进行自定义绘制。

命名法

代码语言:javascript
复制
JPanel frame = new JPanel();

哇!选择不当的属性名。你如何称呼你的JFrame实例,panel

应用资源

代码语言:javascript
复制
ImageIcon s = new ImageIcon("redirect.png");

这将不适用于applet,也不适用于已部署的应用程序。通过URL访问图像是必要的。Applet类有一个特定的方法来加载图像。

剩余的构造函数行

代码语言:javascript
复制
JPanel frame = new JPanel();
frame.add(new Board()); 
frame.setSize(700,365);
frame.setVisible(true);

不需要构造函数的第一行,可以将下一行中创建的Board直接添加到applet中。这还剩下两行没有注释掉。

代码语言:javascript
复制
frame.setSize(700,365);

小程序的大小应该由HTML来设置。

代码语言:javascript
复制
frame.setVisible(true);

添加到可见组件中的任何内容本身都将变为可见的。因此,这也是多余的。

Swing Timer

因为我指出了代码中的许多错误,所以我想我应该添加一下动画似乎是正确的--使用Swing Timer。:)

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8316392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档