java界面设计滚动窗口怎么弄_Java Applet游戏2D窗口滚动

这是滚动可视区域的基本示例,其中虚拟世界大于视图区域.

这基本上保留了许多参数.它保持了世界上视图的顶部/左侧和玩家在世界中的位置.

这些值将转换回真实世界坐标(其中0x0是可视区域的左上角).

这些示例还使用BufferedImage#getSubImage来使渲染更容易.您也可以计算地图到视图的偏移位置,但这归结为需求……

import java.awt.BorderLayout;

import java.awt.Dimension;

import java.awt.EventQueue;

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.awt.Point;

import java.awt.event.ActionEvent;

import java.awt.event.KeyEvent;

import java.awt.image.BufferedImage;

import java.io.IOException;

import javax.imageio.ImageIO;

import javax.swing.AbstractAction;

import javax.swing.ActionMap;

import javax.swing.InputMap;

import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.KeyStroke;

import javax.swing.UIManager;

import javax.swing.UnsupportedLookAndFeelException;

public class MiddleEarth {

public static void main(String[] args) {

new MiddleEarth();

}

public MiddleEarth() {

EventQueue.invokeLater(new Runnable() {

@Override

public void run() {

try {

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {

}

JFrame frame = new JFrame("Testing");

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setLayout(new BorderLayout());

frame.add(new WorldPane());

frame.pack();

frame.setLocationRelativeTo(null);

frame.setVisible(true);

}

});

}

public class WorldPane extends JPanel {

private BufferedImage map;

private BufferedImage party;

private Point viewPort;

private Point partyPoint;

private BufferedImage view;

public WorldPane() {

try {

map = ImageIO.read(getClass().getResource("/MiddleEarth.jpg"));

party = ImageIO.read(getClass().getResource("/8BitFrodo.png"));

viewPort = new Point(0, (map.getHeight() / 2) - 100);

partyPoint = new Point(party.getWidth() / 2, (map.getHeight() / 2)); // Virtual Point...

} catch (IOException exp) {

exp.printStackTrace();

}

InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW);

ActionMap am = getActionMap();

im.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), "goRight");

im.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), "goLeft");

im.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), "goUp");

im.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), "goDown");

am.put("goRight", new AbstractAction() {

@Override

public void actionPerformed(ActionEvent e) {

moveParty(10, 0);

}

});

am.put("goLeft", new AbstractAction() {

@Override

public void actionPerformed(ActionEvent e) {

moveParty(-10, 0);

}

});

am.put("goUp", new AbstractAction() {

@Override

public void actionPerformed(ActionEvent e) {

moveParty(0, -10);

}

});

am.put("goDown", new AbstractAction() {

@Override

public void actionPerformed(ActionEvent e) {

moveParty(0, 10);

}

});

}

protected void moveParty(int xDelta, int yDelta) {

partyPoint.x += xDelta;

partyPoint.y += yDelta;

Point view = fromWorld(partyPoint);

if (view.x > getWidth() - (party.getWidth() / 2)) {

viewPort.x += xDelta;

if (viewPort.x + getWidth() > map.getWidth()) {

viewPort.x = map.getWidth() - getWidth();

partyPoint.x = map.getWidth() - (party.getWidth() / 2) - 1;

}

invalidate();

} else if (view.x < party.getWidth() / 2) {

viewPort.x += xDelta;

if (viewPort.x < 0) {

viewPort.x = 0;

partyPoint.x = (party.getWidth() / 2);

}

invalidate();

}

System.out.println(view + "; " + getHeight());

if (view.y > getHeight() - (party.getHeight() / 2)) {

viewPort.y += yDelta;

if (viewPort.y + getHeight() > map.getHeight()) {

viewPort.y = map.getHeight() - getHeight();

partyPoint.y = map.getHeight() - (party.getHeight() / 2) - 1;

}

invalidate();

} else if (view.y < party.getHeight() / 2) {

viewPort.y += yDelta;

if (viewPort.y < 0) {

viewPort.y = 0;

partyPoint.y = (party.getHeight() / 2);

}

invalidate();

}

repaint();

}

@Override

public void invalidate() {

view = null;

super.invalidate();

}

public BufferedImage getView() {

if (view == null && getWidth() > 0 && getHeight() > 0) {

view = map.getSubimage(viewPort.x, viewPort.y, getWidth(), getHeight());

}

return view;

}

@Override

public Dimension getPreferredSize() {

return new Dimension(400, 400);

}

@Override

protected void paintComponent(Graphics g) {

super.paintComponent(g);

Graphics2D g2d = (Graphics2D) g.create();

if (map != null) {

g2d.drawImage(getView(), 0, 0, this);

Point real = fromWorld(partyPoint);

int x = real.x - (party.getWidth() / 2);

int y = real.y - (party.getHeight()/ 2);

g2d.drawImage(party, x, y, this);

}

g2d.dispose();

}

protected Point fromWorld(Point wp) {

Point p = new Point();

p.x = wp.x - viewPort.x;

p.y = wp.y - viewPort.y;

return p;

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值