2010-11-30 92 views
0

我正在为我的CS类制作Java程序。我的老师几乎没有使用Java编写图形程序的经验,所以我转向了你。我目前使用我主面板的paintComponent方法绘制两个东西,一个是矩形(我的大炮,稍后可能用图像替换),另外两个是炮弹的.png文件。我使用Graphics g(我将其转换为Graphics2D)将大炮和Ball画在屏幕上。然后我旋转,但是,大炮和球旋转,而不仅仅是大炮。任何提示,建议,或有用的教程,不胜感激。如何在Java中使用paintComponent来绘制多个东西,但旋转一个?

这里是我的代码(注释掉环节都在那里我得到了一定的代码,忽略它们):

package Cannon; 

import java.awt.geom.Point2D; 
import java.awt.BorderLayout; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Image; 
import java.awt.Rectangle; 
import java.awt.RenderingHints; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.event.MouseMotionListener; 
import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.Timer; 

public class NewMain{ 

public static void main(String[] args) { 
FraMainWindow frame = new FraMainWindow(); 
} 
} 

class FraMainWindow extends JFrame { 
DrawCannon pnlCannon = new DrawCannon(); 
ButtonPannel pnlButtons = new ButtonPannel(); 
public FraMainWindow() { 
this.setDefaultCloseOperation(JFrame.EXI… 
this.setTitle("Super Mario Cannon Bro's"); 
this.setSize(900, 550); 
this.setLayout(new BorderLayout()); 
this.add(pnlCannon, BorderLayout.CENTER); 
this.add(pnlButtons, BorderLayout.SOUTH); 
MouseMovement mouseMove = new MouseMovement(); 
MouseAction mouseClick = new MouseAction(); 
pnlCannon.addMouseMotionListener(mouseMo… 
pnlCannon.addMouseListener(mouseClick); 
FireButton actnFire = new FireButton(); 
pnlButtons.btnFire.addActionListener(act… 
this.setVisible(true); 
} 

public class DrawCannon extends JPanel{ 
Rectangle.Float rectCannon = new Rectangle.Float(30, 450, 50, 10); 
Image imgBall=new ImageIcon("ball.png").getImage(); 
double dAngle = 0; 
boolean isFired = false; 
public void addCannonBall(){ 
isFired=true; 
repaint(); 
} 
public void paintComponent(Graphics g) { 
super.paintComponent(g); 
Graphics2D g2d = (Graphics2D) g; 
g2d.setRenderingHint(RenderingHints.KEY_… RenderingHints.VALUE_ANTIALIAS_ON); 
g2d.setRenderingHint(RenderingHints.KEY_… RenderingHints.VALUE_RENDER_QUALITY);//A… Aliasing from http://www.java2s.com/Code/Java/2D-Graph… 
g2d.rotate(0 - dAngle, rectCannon.getX(), rectCannon.getY() + 5); 
g2d.fill(rectCannon); 
if(isFired){ 
g2d.drawImage(imgBall, 0, 0, null); 
} 
//Dimension size = getSize(); 
} 
} 

public class ButtonPannel extends JPanel { 
JButton btnFire = new JButton("Fire!"); 
ButtonPannel() { 
this.add(btnFire); 
} 
} 

public class FireButton implements ActionListener { 
public void actionPerformed(ActionEvent e) { 
pnlCannon.addCannonBall(); 
System.out.println("Fire ZE MISSILES"); 
} 
} 
public class MouseMovement implements MouseMotionListener { 

public void mouseDragged(MouseEvent e) { 
double dBase, dHeight, dAngle; 
dBase = e.getX() - pnlCannon.rectCannon.getX(); 
dHeight = pnlCannon.rectCannon.getY() - 5 - e.getY() + 10; 
dAngle = Math.atan2(dHeight, dBase); 
pnlCannon.dAngle = dAngle; 
pnlCannon.repaint(); 
}//http://download.oracle.com/javase/tutori… 

public void mouseMoved(MouseEvent e) { 
} 
} 

public class MouseAction implements MouseListener { 

public void mousePressed(MouseEvent e) { 
double dBase, dHeight, dAngle; 
dBase = e.getX() - pnlCannon.rectCannon.getX(); 
dHeight = pnlCannon.rectCannon.getY() - 5 - e.getY() + 10; 
dAngle = Math.atan2(dHeight, dBase); 
pnlCannon.dAngle = dAngle; 
pnlCannon.repaint(); 
} 

public void mouseReleased(MouseEvent e) { 
} 

public void mouseEntered(MouseEvent e) { 
} 

public void mouseExited(MouseEvent e) { 
} 

public void mouseClicked(MouseEvent e) { 
} // From http://www.rgagnon 

回答

0

尝试移动该位:该行之前

if(isFired){ 
g2d.drawImage(imgBall, 0, 0, null); 
} 

g2d.rotate(0 - dAngle, rectCannon.getX(), rectCannon.getY() + 5); 

,您对Graphics2D会造成任何影响的任何转换从那一刻起,所以你必须小心地在需要时应用转换,或者在你不需要它们之前先“解除”它们。

+0

YESSS!谢谢你,先生!我一直在努力解决这个问题好几天,你终于解决了它!谢谢! :) – user525479 2010-11-30 17:16:19

0

你有绘画大炮后拉球:)

之前unrotate您可以在旋转之前尝试保存变换,然后再将其设置回去。这个例子是一个setTransform在Java文档:

// Get the current transform 
AffineTransform saveAT = g2.getTransform(); 
// Perform transformation 
g2d.transform(...); 
// Render 
g2d.draw(...); 
// Restore original transform 
g2d.setTransform(saveAT);