我正在写一个类似于河川Raid的游戏,所有的图像都是用g.drawImage(.)绘制的.我的问题是:当有人要调整JFrame的大小时,如何保持内容的纵横比,并缩放内容以适应新的窗口大小?
有没有这样的选择?我可以在不使用JLabels和布局的情况下这样做吗?如果没有,那怎么做呢?
我在JPanel上画东西的代码
private void doDrawing(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
drawStrings(g2);
mapa.drawMap(g2);
ArrayList ms = craft.getMissiles();
for (Object m1 : ms) {
Missile m = (Missile) m1;
g2.drawImage(m.getImage(), m.getX(), m.getY(), this);
}
g2.drawImage(craft.getImage(), craft.getX(), craft.getY(), this);
for (EnemyJet enemy : enemies) {
g2.drawImage(enemy.getImage(), enemy.getX(), enemy.getY(), this);
}
for (Fuel fuel : fuels) {
g2.drawImage(fuel.getImage(), fuel.getX(), fuel.getY(), fuel.getHeight(), fuel.getHeight(), this);
}
for (Obstacle o : obst) {
g2.drawImage(o.getImage(), o.getX(), o.getY(), this);
}
drawStrings(g2);
}也是Jpanel构造函数:
private void initBoard() {
addKeyListener(new TAdapter());
setFocusable(true);
setBackground(Color.WHITE);
setLayout(new GridBagLayout());
craft = new Craft(ICRAFT_X, ICRAFT_Y);
mapa = new Mapa();
setMinimumSize(new Dimension(WIDTH, HEIGHT));
initEnemiesAndAddThem();
czas = new Timer(delay, this);
czas.start();
}JFrame构造函数:
private void initGame()
{
add(new Plansza());
setTitle("Reeevah Raaid");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(WIDTH, HEIGHT);
setPreferredSize(new Dimension(WIDTH, HEIGHT));
setLocationRelativeTo(null);
pack();
setVisible(true);
//setExtendedState(JFrame.MAXIMIZED_BOTH);
//setResizable(false);
}发布于 2016-05-24 20:08:34
你可以把整件事都放大:
private void doDrawing(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
AffineTransform originalTransform = g2.getTransform();
g2.scale(getWidth() / (double) WIDTH, getHeight() / (double) HEIGHT);
// Do all drawing here
g2.setTransform(originalTransform);
}一些注意事项:
g2.setTransform(originalTransform)是很重要的。Graphics对象不属于您--它可能用于绘制其他组件,因此您需要将它保持在给予您时的状态。3 / (double) 2是1.5,但3 / 2正好是1)。发布于 2016-05-24 18:47:59
任何图像都需要按以下方式绘制:
double fct=1.0*image.getWidth()/getWidth();
double fct2=1.0*image.getHeight()/getHeight();
if(fct2>fct) fct=fct2;
g2.drawImage(image, x, y, (int)(1.0*image.getWidth()/fct), (int)(1.0*image.getHeight()/fct), this);这会留下很多空白处--但如果你想保持高宽比的话。
--
若要对图像进行居中,请执行以下操作:
int newWidth=(int)(1.0*image.getWidth()/fct);
int newHeight=(int)(1.0*image.getHeight()/fct);
g2.drawImage(image, getWidth()/2-newWidth()/2, getHeight()/2-newHeight()/2, newWidth, newHeight, this);https://stackoverflow.com/questions/37420738
复制相似问题