Hello again, got another Java question.
I am trying to draw an oval from the Alien class to the Canvas in the Game class.
Here is the code
import javax.swing.*;
import java.awt.*;
/**
* The Evil Ovals!
*
* @author Eric Foertsch
* @version Nov 2009(1.0.0a)
*/
public class Alien extends Canvas{
// X pos
private int x;
// Y pos
private int y;
// Width
private int w;
// Height
private int h;
// Ship Color
private Color color;
// Missle Color
private Color missleColor;
// Background Color
private Color background;
// Probability of missle firing
private double missleLaunchProb;
// Wall location
private int wall;
// Missle
private Missle pewPew;
// Velocity
private int velocity;
/**
* Constructor for objects of class Alien
*/
public Alien(int pX, int pY, int pW, int pH, Color pColor, Color pMissleColor, Color pBackGround,
double pMissleLaunchProb, int pWall){
x = pX;
y = pY;
w = pW;
h = pH;
color = pColor;
missleColor = pMissleColor;
background = pBackGround;
missleLaunchProb = pMissleLaunchProb;
wall = pWall;
pewPew = new Missle(x, y, w, h, 10, Color.red, 500);
velocity = 10;
}
/**
* Returns a Missle
*/
public Missle getMissle(){
return pewPew;
}
/**
* Draws a Alien
*/
public void draw(Graphics g, Color pColor){
// Draws an Alien
g.setColor(pColor);
g.drawOval(x, y, w, h);
}
/**
* Moves the alien and missle
*/
public void move(Graphics g){
// Moves the Alien Ship
draw(g, background);
if(x > 600){
velocity = -10;
}
if(x < 0){
velocity = 10;
}
x = x + velocity;
draw(g, color);
// Missle
if(pewPew == null){
if(Math.random() >= missleLaunchProb){
pewPew.move(g, background);
}
}
}
/**
* Returns if the missle has hit
*/
public boolean isHit(Graphics g, Missle enemyMissle){
if(enemyMissle.getNose() == new Point(x + w, y + h)){
return true;
}
return false;
}
/**
* Erases the ship if destroyed.
*/
public void remove(Graphics g){
pewPew.draw(g, background);
draw(g, background);
pewPew = null;
}
} import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
/**
* Holds the rules for the game.
*
* @author Eric Foertsch
* @version Nov 2009(1.0.0a)
*/
public class Game implements ActionListener, Runnable, MouseMotionListener, MouseListener
{
// Frame of the Board
private JFrame f;
// Sets a Quit item
private JMenuItem Quit;
// Start Button
private JButton start;
// Canvas
private Canvas c;
// Graphics
private Graphics2D graphic;
// Alien Array
private Alien[] a;
// Ship X
private int x;
// Ship Y
private int y;
// Ship H
private int h;
// Ship W
private int w;
// Missle
private Missle moarPewPew;
// Text Field
private JTextField txt;
// Graphics
private Graphics g;
/**
* Constructor for objects of class GUI
*/
public Game(){
// Start Button
start = new JButton("Start");
start.addActionListener(this);
// Canvas
c = new Canvas();
c.setSize(500, 400);
c.setBackground(Color.black);
c.setVisible(true);
//Text Box
txt = new JTextField();
// Frame
f = new JFrame("Attack of the Ovals!");
f.setSize(600, 500);
f.setVisible(true);
f.setLayout(new BorderLayout());
f.add(txt, BorderLayout.NORTH);
f.add(c, BorderLayout.CENTER);
f.add(start, BorderLayout.SOUTH);
setupMenus(f);
f.validate();
x = 500;
y = 400;
w = 20;
h = 20;
}
/**
* This is a method that sets up the menus for the game.
*/
public void setupMenus(JFrame frame){
// Sets up the Menu Bar
JMenuBar menubar = new JMenuBar();
frame.setJMenuBar(menubar);
//Sets up the Game Menu
JMenu gamemenu = new JMenu("Game");
menubar.add(gamemenu);
//Adds the Quit option to the Game Menu
JMenuItem quitItem = new JMenuItem("Quit");
quitItem.addActionListener(this);
gamemenu.add(quitItem);
}
/**
* This is a method for actions.
*/
public void actionPerformed(ActionEvent e){
// Quit Action
if(e.getActionCommand() == "Quit"){
int n = JOptionPane.showConfirmDialog(null,
"Are you sure you want to quit?", "The Ovals will kill us all!!",
JOptionPane.YES_NO_OPTION);
if(n == JOptionPane.YES_OPTION){
System.exit(1);
}
if(n == JOptionPane.NO_OPTION){
JOptionPane.showMessageDialog(null,
"We still have a chance", "Fight on!",
JOptionPane.INFORMATION_MESSAGE);
}
}
if(e.getActionCommand() == "Start"){
playRound(g);
}
}
/**
* This method will play a round of the Game.
*/
public void playRound(Graphics g){
c.getGraphics();
c.setVisible(true);
boolean gameOver = false;
// Sets up the Array of Aliens
a = new Alien[3];
Alien Bob = new Alien(40, 40, 10, 10, Color.yellow, Color.red, Color.black, .3, 500);
Alien Betty = new Alien(100, 100, 10, 10, Color.yellow, Color.red, Color.black, .5, 500);
Alien Daisuke = new Alien(150, 150, 10, 20, Color.yellow, Color.red, Color.black, .8, 500);
a[0] = Bob;
a[1] = Betty;
a[2] = Daisuke;
// Starts up the game
if(gameOver == false){
// Draws the Aliens
Bob.draw(g, Color.yellow);
Betty.draw(g, Color.yellow);
Daisuke.draw(g, Color.yellow);
// Moves the Aliens
Bob.move(g);
Betty.move(g);
Daisuke.move(g);
}
// Removes an alien if destroyed
for(int i = 0; i < a.length; i++){
if(a[i].isHit(g, moarPewPew) == true){
a[i].remove(g);
}
}
}
/**
* Checks to see if my ship is hit.
*/
private boolean isHit(Missle enemyMissle){
if(enemyMissle.getNose() == new Point(x + w, y + h)){
return true;
}
return false;
}
/**
* Draws my ship
*/
private void draw(Color pColor){
c.getGraphics();
g.setColor(pColor);
g.fillRect(x, y, w, h);
}
/**
* Mouse Movement Methods
*/
public void mouseMoved(MouseEvent e){
if((x > 500 || x < 0) && (y > 400 || y < 0)){
draw(Color.black);
x = e.getX();
y = e.getY();
draw(Color.blue);
}
}
public void mouseClicked(MouseEvent e){
if(moarPewPew == null){
moarPewPew = new Missle(x, y, 10, 20, 10, Color.green, 0);
moarPewPew.move(g, Color.black);
}
}
public void run(){
playRound(g);
}
/**
* Slows down the game so it is playable.
*/
private void pause(int msecs){
try{
Thread.sleep(msecs);
}
catch(InterruptedException e){}
}
/**
* Resets the game
*/
private void reset(){
moarPewPew.draw(g, Color.black);
moarPewPew = null;
a[0].draw(g, Color.black);
a[1].draw(g, Color.black);
a[2].draw(g, Color.black);
a[0].remove(g);
a[1].remove(g);
a[2].remove(g);
}
/**
* Methods to make program run.
*/
public void mouseDragged(MouseEvent e){
}
public void mousePressed(MouseEvent e){
}
public void mouseReleased(MouseEvent e){
}
public void mouseEntered(MouseEvent e){
}
public void mouseExited(MouseEvent e){
}
}
When I hit the start button, it throws this error at me
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at Alien.draw(Alien.java:64)
at Game.playRound(Game.java:154)
at Game.actionPerformed(Game.java:128)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6263)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
at java.awt.Component.processEvent(Component.java:6028)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4630)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2475)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Via this error, I know its something wrong with the draw() method in the alien class, but I am at a loss as to what is wrong.
Any help appreciated.
Rolfninja
hi,
in my applet i have a paint components method. not sure if there are any other paint choices,
public void paintComponent(Graphics g)
{
Color mycolor, mycolor2, mycolor3;
mycolor = new Color(5,0,0);
setBackground(mycolor);
super.paintComponent(g);
// now i can draw shapes with the g2 methods
Graphics2D g2 = (Graphics2D) g;
when i want to update the drawing i call repaint() or repaint(x,y, width, hight);
notice paintComponents expects to pass in Graphics g;
one thing i couldnt figure out from your draw was where your g in draw was getting its knowledge from or even defined. paintcomponents passes in the graphics object.
Mike
this is the code i coudlnt see where g was defined
private void draw(Color pColor){ c.getGraphics(); g.setColor(pColor); g.fillRect(x, y, w, h); }
Mike
Which method would I define the G in?
I couldn't instantiate a g object, and I am unsure as to how to pass it the correct g object.
Oh and I have no experience with paintComp, If possible I'd like to stay within graphics class...
Oh and I have no experience with paintComp, If possible I'd like to stay within graphics class...
i'm not sure how i found paint components, its a standard method not defined by me.
the beauty of it is when java calls it, which is whenever anything needs to be drawn, it passes in g.
All your methods that use g could be called from paint components. just assume paint components is called whenever anything needs to be drawn or painted and you can invoke an update of the drawing with repaint() or you can define the area to repaint if you just channge an area with repaint( x, y, width , hight);
Mike
oh i just added paintComponents to my panel , just insert below and i believe it will work. its called by teh system when something needs to be drawn. you draw the whole screen. if repaint(x , y , width, height) is used you don't know that in paint but that is the area of the screen refreshed. if your class is in the scope to be used by the panel, it can invoke your draw methods passing g i would assume.
public void paintComponent(Graphics g)
{
super.paintComponent(g);
// now i can draw shapes with the g2 methods
Graphics2D g2 = (Graphics2D) g;
// do any drawing here
} // end
mike
I got out my java book and here is what it says:
"In particular, to draw on a panel, you
Define a class that extends Jpanel
Override the paintCommponent method in that class
The paintComponent method is actually in JComponent, the superclass for all non window Swing Components. "
below it says 'here is how to make a panel onto which you can draw:
class MyPanel extends JPanel
{
public void paintComponent(Graphics g)
{
// code for drawing will go here
}
}
Mike