java - Java 相机实现
问题描述
我正在尝试为游戏实现相机功能,以便基本上扩展玩家的比赛场地,目前是水平的。我以前只做过一次相机类,但我经常遇到的一个问题是相机的位置工作但 Graphics 中的 translate() 没有做任何事情或者玩家无法移动。我尝试了几种不同的解决方案和建议,但无法弄清楚问题所在。这是最基本的代码:
public class GamePanel extends JPanel implements ActionListener
{
public GamePanel()
{
setBackground(Color.WHITE);
setLayout(null);
setOpaque(false);
cell = new WBCell();
addKeyListener(cell);
camera = new Camera(cell);
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
grabFocus();
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
g.setColor(Color.black);
g.fillRect(0, 0, getWidth(), getHeight());
g.translate(camera.getX(), camera.getY());
g2.drawImage(cell.getImage(), cell.getX(), cell.getY(), null);
g.translate(-camera.getX(), -camera.getY());
}
public void actionPerformed(ActionEvent e) {
Game.getCards().show(Game.getCardP(), "Start");
}
相机保持玩家在屏幕中央的基本代码:
public class Camera
{
private WBCell player;
private int x = 0, y = 0;
public Camera(WBCell wCell)
{
player = wCell;
}
public void cameraMove()
{
System.out.println("Cam: " + x + ", " + y + "\t\t" + (-player.getX() + Game.WIDTH/2) + ", " + (-player.getY() + Game.HEIGHT/2));
x = -player.getX() + Game.WIDTH/2;
y = -player.getY() + Game.HEIGHT/2;
}
public int getX()
{
return x;
}
public int getY()
{
return y;
}
}
作为参考,单元格对象或 WBCell 类只需加载一个 BufferedImage 并在调用 drawImage() 后将其拍打在面板上。任何建议将不胜感激!
解决方案
这是我的相机的样子:
x = (player.getX()+(player.getWidth()/2)) - game.getWidth()/2;
y = (player.getY()+(player.getHeight()/2)) - game.getHeight()/2;
g2d.translate(-camX, -camY);
//render everything(including player)
g2d.translate(camX, camY);
推荐阅读
- android - Android LiveData 和实时更新
- primeng - 如何在 PrimeNg 的 p 日历中仅显示相关周?
- java - Spring HttpRequest 获取父 URL
- php - 为什么 return new static() 会导致内存泄漏?(php)
- angular - firebase onCall 函数响应返回 null
- javascript - 使用 React 使用 chrome 扩展更改已经存在的页面上的内容
- javascript - 碰撞检测的问题是JS画布游戏
- bigdata - 使用 OpenStack 管理大数据虚拟机
- angularjs - Django Rest 框架和 Angularjs 身份验证
- javascript - 如何在正文末尾的 ELEMENTOR 脚本之后加载我的脚本