为了账号安全,请及时绑定邮箱和手机立即绑定

Java Applet Game 2D窗口滚动

Java Applet Game 2D窗口滚动

慕容3067478 2019-10-21 15:34:48
我正在尝试用Java Applet开发2D RPG游戏。现在,我有一个简单的椭圆形,玩家可以使用向左,向右,向上和向下移动,并且与小程序边界的碰撞会阻止它们。问题是,我想创建一个玩家可以移动的巨大世界(2000像素乘2000x)。但是,我希望他们一次只能看到600px x 400x的屏幕。如果它们继续向右移动,我希望屏幕跟随它们,上下左右都一样。谁能告诉我该怎么做?到目前为止,这是我的代码:import java.awt.*;import java.awt.event.KeyEvent;import java.applet.Applet;import java.awt.event.KeyListener;import javax.swing.*;public class Main extends Applet implements Runnable, KeyListener{    private Image dbImage;    private Graphics dbg;    Thread t1;    int x = 0;    int y = 0;    int prevX = x;    int prevY = y;    int radius = 40;    boolean keyReleased = false;    public void init()    {        setSize(600, 400);    }    public void start()    {        addKeyListener(this);        t1 = new Thread(this);        t1.start();    }    public void destroy()    {    }    public void stop()    {    }    public void paint(Graphics g)    {        //player        g.setColor(Color.RED);        g.fillOval(x, y, radius, radius);    }    public void update(Graphics g)    {        dbImage = createImage (this.getSize().width, this.getSize().height);        dbg = dbImage.getGraphics();        // initialize buffer        if (dbImage == null)        {        }        // clear screen in background        dbg.setColor(getBackground());        dbg.fillRect(0, 0, this.getSize().width, this.getSize().height);        // draw elements in background        dbg.setColor(getForeground());        paint(dbg);        // draw image on the screen        g.drawImage(dbImage, 0, 0, this);    }    @Override    public void run()    {        while (true)        {            //x++;            repaint();            try            {                t1.sleep(17);            }            catch (Exception e)            {            }        }    }    public boolean CheckCollision(String dir)    {        if (x <= 0 && dir.equals("L"))        {            x = prevX;            return true;        }        else if (y <= 0 && dir.equals("U"))        {            y = prevY;            return true;        } 
查看完整描述

3 回答

?
12345678_0001

TA贡献1802条经验 获得超5个赞

这就是我在引擎中所做的事情。


我将保留两个变量OffSetX,OffSetY


并计算它们的每一步,以使玩家居中。


OffSetX = 0;

OffSetY = 0;

if (MAP_WIDTH > WINDOW_WIDTH) {

    OffSetX = Math.round(WINDOW_WIDTH / 2 - obj.getX() - TILE_SIZE);

    OffSetX = Math.min(OffSetX, 0);

    OffSetX = Math.max(OffSetX, WINDOW_WIDTH - MAP_WIDTH);

}

if (MAP_HEIGHT > WINDOW_HEIGHT) {

    OffSetY = Math.round(WINDOW_HEIGHT / 2 - obj.getY() - TILE_SIZE);

    OffSetY = Math.min(OffSetY, 0);

    OffSetY = Math.max(OffSetY, WINDOW_HEIGHT - MAP_HEIGHT);

}

然后在该位置绘制地图,(OffSetX, OffSetY)即仅将这些添加到要绘制的对象的原始位置。


您可能要跳过不可见的渲染对象。


查看完整回答
反对 回复 2019-10-21
  • 3 回答
  • 0 关注
  • 427 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信