猿问

Java Applet Game 2D窗口滚动

我正在尝试用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;

        }

 

慕容3067478
浏览 455回答 3
3回答

12345678_0001

这就是我在引擎中所做的事情。我将保留两个变量OffSetX,OffSetY并计算它们的每一步,以使玩家居中。OffSetX = 0;OffSetY = 0;if (MAP_WIDTH > WINDOW_WIDTH) {&nbsp; &nbsp; OffSetX = Math.round(WINDOW_WIDTH / 2 - obj.getX() - TILE_SIZE);&nbsp; &nbsp; OffSetX = Math.min(OffSetX, 0);&nbsp; &nbsp; OffSetX = Math.max(OffSetX, WINDOW_WIDTH - MAP_WIDTH);}if (MAP_HEIGHT > WINDOW_HEIGHT) {&nbsp; &nbsp; OffSetY = Math.round(WINDOW_HEIGHT / 2 - obj.getY() - TILE_SIZE);&nbsp; &nbsp; OffSetY = Math.min(OffSetY, 0);&nbsp; &nbsp; OffSetY = Math.max(OffSetY, WINDOW_HEIGHT - MAP_HEIGHT);}然后在该位置绘制地图,(OffSetX, OffSetY)即仅将这些添加到要绘制的对象的原始位置。您可能要跳过不可见的渲染对象。
随时随地看视频慕课网APP

相关分类

Java
我要回答