我目前JFrame中有一个JPanel,我需要视图跟随一个对象,我不能移动世界的原因是因为对象正在轨道另一个对象,所以工作如何移动世界将会更加困难。爪哇查看一个移动的对象在秋千
回答
好吧,下面是如何做到这一点的例子。请注意,SSCCE不需要是面向对象的,因此您可能不应复制并粘贴到当前项目中。我不会解释这些步骤,因为几乎所有内容都在我发布的链接中进行了解释。不过,这里是参考文献for the 2D camera和for the object moving in circular path。
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.AffineTransform;
import javax.swing.Timer;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Example {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new Example();
}
});
}
public Example() {
JFrame frame = new JFrame();
frame.setContentPane(new DrawingPanel());
frame.setSize(400, 300);
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.setVisible(true);
}
class DrawingPanel extends JPanel {
int angle = 0;
int rotation = 0;
int radius = 150;
int ovalX = 150;
int ovalY = 150;
int ovalWidth = 100;
int ovalHeight = 100;
int ovalCenterX = ovalX + ovalWidth/2;
int ovalCenterY = ovalY + ovalHeight/2;
int recX;
int recY;
int recWidth = 50;
int recHeight = 50;
int recCenterX;
int recCenterY;
int WORLD_SIZE_X = 6000;
int WORLD_SIZE_Y = 6000;
int camX;
int camY;
public DrawingPanel() {
ActionListener al = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
angle++;
rotation++;
recCenterX = (int) ((int) ovalCenterX + Math.sin(Math.toRadians(angle)) * radius);
recCenterY = (int) ((int) ovalCenterY + Math.cos(Math.toRadians(angle)) * radius);
recX = recCenterX - recWidth/2;
recY = recCenterY - recHeight/2;
repaint();
}
};
Timer timer = new Timer(15, al);
timer.start();
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D gg = (Graphics2D) g;
gg.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
int VIEWPORT_SIZE_X = getWidth();
int VIEWPORT_SIZE_Y = getHeight();
int offsetMaxX = WORLD_SIZE_X - VIEWPORT_SIZE_X;
int offsetMaxY = WORLD_SIZE_Y - VIEWPORT_SIZE_Y;
camX = recCenterX - VIEWPORT_SIZE_X/2;
camY = recCenterY - VIEWPORT_SIZE_Y/2;
if (camX > offsetMaxX) {
camX = offsetMaxX;
}
if (camY > offsetMaxY) {
camY = offsetMaxY;
}
gg.translate(-camX, -camY);
gg.setColor(Color.BLUE);
gg.fillOval(ovalX, ovalY, ovalWidth, ovalHeight);
AffineTransform old = gg.getTransform();
gg.rotate(Math.toRadians(rotation), recCenterX, recCenterY);
gg.setColor(Color.RED);
gg.drawRect(recX, recY, recWidth, recHeight);
gg.setTransform(old);
gg.setColor(Color.GREEN);
gg.drawLine(ovalCenterX, ovalCenterY, recCenterX, recCenterY);
}
}
}
我把你的代码复制到eclipse中,但是视图保持居中在屏幕中间而不是绕着蓝色圆圈。我的参考资料是用来解决问题的吗?如果是这样,谢谢,生病了吧。 –
@TomHaffenden嗯,红色的正方形是旋转的,而不是蓝色的圆圈 - 摄像机跟着红色方块。 –
感谢您的帮助!这真的帮助我推进我的项目。 –
- 1. 爪哇秋千setSize
- 2. 爪哇秋千按钮
- 3. 爪哇秋千树表
- 4. 爪哇秋千和Excel
- 5. 爪哇秋千定时器
- 6. 爪哇秋千表问题
- 7. 爪哇 - 插座和秋千
- 8. 爪哇秋千 - 操纵的GUI
- 9. 爪哇秋千“儿童”窗户
- 10. 爪哇秋千字母数字键盘
- 11. 爪哇,秋千,网格布局问题
- 12. 爪哇秋千:键被按下时做一些事情
- 13. 爪哇 - 秋千显示图像不工作
- 14. 谷歌的AppEngine - 爪哇 - Slim3 - 查看对象在一个新的观点
- 15. 爪哇 - 投一个非空对象动态对象
- 16. 爪哇 - 对象存在DILEM
- 17. 爪哇 - 确定在一个对象从对象的类
- 18. 爪哇 - 对一个BufferedImage
- 19. 秋千 - 搜索一个JTextField
- 20. jprogressbar在秋千
- 21. BoxLayout.Y_AXIS在秋千
- 22. 爪哇 - 维护对象
- 23. 错误:爪哇/郎/ NoClassDefFoundError的:爪哇/郎/对象
- 24. eli5秋千工人和秋千线程
- 25. 爪哇 - 对PMI
- 26. 爪哇:递增地移动在一个二维数组元素
- 27. 爪哇 - 的JDialog不可移动
- 28. 爪哇 - 对于一个给定
- 29. 爪哇/春天:观看豆
- 30. 爪哇 - 对象池相同的参考
[如何滚动摄像机添加到2D Java小游戏?(http://gamedev.stackexchange.com/a/44270) –
做我虽然用什么?我试过JScrollPane和JViewport,但我不太了解它们。 –
您不需要JViewPort,此解决方案仅适用于JPanel和其上的图形。 –