Hi all, I have my Java game the code below. I want to have my Java game images to appear opaque onscreen and need some advice on how to do this. The images are in the snake classthese ones:
food = ImageIO.read(new File("snakeimages/food.jpg
"));
body = ImageIO.read(new File("snakeimages/snakebit
s.jpg"));
I have created the images in Photoshop with a transparent background!!!
Thank you all in anticipation
pjcrooks2000
JaySnake:::
import java.awt.*;
import java.awt.event.*;
import java.awt.* ;
import java.awt.event.* ;
import java.awt.image.* ;
import javax.imageio.* ;
import java.io.* ;
import javax.swing.* ;
import java.util.*;
import java.applet.AudioClip;
import java.applet.Applet;
import java.net.URL;
public class JaySnake extends JFrame implements ActionListener
{
class Game extends JPanel implements Runnable
{
private BufferedImage backBuffer ;
private Graphics myBackBuffer ;
/*The HashMap class is roughly equivalent to Hashtable,
*except that it is unsynchronized and permits nulls*/
HashMap imageMap = new HashMap(4);
public int waitTime = 65;
/*Method used to get text from background menu items and set background image from that*/
public void setImage(String fileName) throws Exception
{
if (fileName.equals("backgrou
nds/defaul
t")) //Sets background to default image
{
backgroundImage = ImageIO.read( new File( "backgrounds/default.jpg" ) );
}
else if (fileName.equals("Long grass")) //Sets background to longGrass image
{
backgroundImage = ImageIO.read( new File( "backgrounds/longGrass.jpg
" ) );
}
else if (fileName.equals("Yellow Sand"))//Sets background to sand image
{
backgroundImage = ImageIO.read( new File( "backgrounds/sand.jpg" ) );
}
else if (fileName.equals("Blue Glass")) //Sets background to blueGrass image
{
backgroundImage = ImageIO.read( new File( "backgrounds/blueGlass.jpg
" ) );
}
else //Sets to default if none mathced
{
backgroundImage = ImageIO.read( new File( "backgrounds/default.jpg" ) );
}
}
public Game()
{
/******Try read in default backgroundImage file and catch any exception*/
try //first read in default image
{
backgroundImage = ImageIO.read( new File( "backgrounds/default.jpg" ) );
clip = Applet.newAudioClip(new URL("file:" + System.getProperty("user.d
ir") + "/sounds/music.au"));
appleEaten = Applet.newAudioClip(new URL("file:" + System.getProperty("user.d
ir") + "/sounds/apple.au"));
}
catch( IOException e )
{
System.out.println(e) ;
}
backBuffer = new BufferedImage( DISPLAY_W, DISPLAY_H, BufferedImage.TYPE_INT_RGB
) ;
myBackBuffer = backBuffer.getGraphics() ;
//set up the menubar
menubar = new JMenuBar();
setJMenuBar(menubar);
}
public void paintComponent( Graphics g )
{
g.drawImage( backBuffer, DISPLAY_X, DISPLAY_Y, null ) ;
}
public void paint( Graphics g )
{ super.paint(g);
g.drawImage(backgroundImag
e,0,0,null
);
//Draw green scoreboard and black rects
g.setColor(Color.black);
g.fillRect(1,540,598,20);
g.fillRect(1,34,598,6);
g.setColor(Color.white);
g.drawRoundRect(1,0,598,32
,10,10);
//Calls Snake paint method
if (snake != null)
snake.draw(g);
}
public void run()
{
// 1000/25 Frames Per Second = 40millisecond delay
int delayTime = 1000 / 25 ;
Thread thisThread = Thread.currentThread() ;
while( running )
{
//startTime = System.currentTimeMillis()
;
// render to back buffer now
render( myBackBuffer ) ;
repaint() ;
// handle frame rate
//elapsedTime = System.currentTimeMillis()
- startTime ;
//waitTime = Math.max( delayTime - elapsedTime, 5 ) ;
try
{
Thread.sleep( waitTime ) ;
}
catch( InterruptedException e )
{}
}
System.out.println( "Program Exited" ) ;
}
}
private Thread gamePlay ;
private boolean running = true ;
private Game game ;
private final int DISPLAY_X ; // value assigned in constructor
private final int DISPLAY_Y ; // value assigned in constructor
private static final int DISPLAY_W = 610 ;
private static final int DISPLAY_H = 610 ;
int size, hsize = 0, score1 = 0, score2 = 0, highscore = 0 ;
/****Creates JMenuBar */
private JMenuBar menubar ;
/****Creates JMenu to house items */
private JMenu gameMenu = new JMenu( "Game" ) ;
private JMenuItem gameStart = new JMenuItem( "Start" ) ;
private JMenuItem gameQuit = new JMenuItem( "Quit" ) ;
private JMenu bgMenu = new JMenu( "Backgrounds" ) ;
private ButtonGroup bgGroup = new ButtonGroup() ;
private JRadioButtonMenuItem bg1 = new JRadioButtonMenuItem( "Default" ) ;
private JRadioButtonMenuItem bg2 = new JRadioButtonMenuItem( "Long grass" ) ;
private JRadioButtonMenuItem bg3 = new JRadioButtonMenuItem( "Yellow Sand" ) ;
private JRadioButtonMenuItem bg4 = new JRadioButtonMenuItem( "Blue Glass" ) ;
private JMenu soundMenu = new JMenu( "Enable sounds" ) ;
private JCheckBoxMenuItem soundMusic = new JCheckBoxMenuItem( "Music" ) ;
private JCheckBoxMenuItem soundSound = new JCheckBoxMenuItem( "Sounds" ) ;
private JMenu helpMenu = new JMenu( "Help" ) ;
private JMenuItem userInstruct = new JMenuItem( "User Instructions" ) ;
private JMenuItem helpAbout = new JMenuItem( "About" ) ;
/******JaySnake constructor*/
public JaySnake()
{
setResizable( false ) ;
game = new Game();
getContentPane().add( game, BorderLayout.CENTER ) ;
this.setJMenuBar( menubar );
menubar.add( gameMenu ) ;
gameMenu.add( gameStart ) ;
// ActionListener to quit the game when quit is clicked
gameStart.addActionListene
r( new ActionListener(){
public void actionPerformed( ActionEvent e )
{
String name = new String();
name = JOptionPane.showInputDialo
g( "Please enter your name" );
snake = new Snake(JaySnake.this, name, (soundForApple ? appleEaten : null));
}
});
gameMenu.add( gameQuit ) ;
// ActionListener to quit the game when quit is clicked
gameQuit.addActionListener
( new ActionListener(){ public void actionPerformed( ActionEvent e )
{
System.exit( 0 );
}
}); /*Background selection menubar setup adding actionlisteners*/ menubar.add( bgMenu ) ;
bgMenu.add( bg1 ); bg1.addActionListener(this
);
bgMenu.add( bg2 ); bg2.addActionListener(this
);
bgMenu.add( bg3 ); bg3.addActionListener(this
);
bgMenu.add( bg4 ); bg4.addActionListener(this
);
/* "bgGroup" groups menu items for background together*/
bgGroup.add( bg1 ); bgGroup.add( bg2 );
bgGroup.add( bg3 ); bgGroup.add( bg4 );
/*Sounds menubar selection with actionListeners*/ menubar.add( soundMenu );
soundMusic.setState(true);
soundMenu.add( soundMusic );
soundMenu.add( soundSound ) ;
soundSound.setState(true);
/* Listeners */
soundMusic.addActionListen
er(new ActionListener(){
public void actionPerformed(ActionEven
t e)
{
try
{
JCheckBoxMenuItem source = (JCheckBoxMenuItem)(e.getS
ource());
System.out.println(source.
getText())
;
if (source.getState())
{
clip.loop();
}
else
{
clip.stop();
}
}
catch (Exception ex)
{
System.out.println(ex);
}
}
});
soundSound.addActionListen
er(new ActionListener(){
public void actionPerformed(ActionEven
t e)
{
try
{
JCheckBoxMenuItem source = (JCheckBoxMenuItem)(e.getS
ource());
if (source.getState())
{
soundForApple = true;
snake.setAppleSound(appleE
aten);
}
else
{
soundForApple = false;
snake.setAppleSound(null);
}
}
catch (Exception ex)
{
System.out.println(ex);
}
}
});
/* /Listeners */
menubar.add( helpMenu ) ;
helpMenu.add( userInstruct );
userInstruct.addActionList
ener(new ActionListener() {
public void actionPerformed(ActionEven
t e) {
System.out.println("Instru
ctions button pressed");
//Create new Jframe to view User instructions
JFrame f = new JFrame();
JEditorPane p = new JEditorPane("text/html", "");
f.getContentPane().add(p);
// was missing in the previous code snippet
p.setEditable(false);
URL instructions = getClass().getResource(
"instructions/index.html")
;
try {
p.setPage(instructions);
} catch (Exception ep) {
System.out.println("Not Got index.html");
}
f.setSize(265, 540);
f.setVisible(true);
}
});
helpMenu.add( helpAbout );
helpAbout.addActionListene
r( new ActionListener(){ public void actionPerformed( ActionEvent e )
{
//Create an instance of About class window
About dlg = new About( JaySnake.this );
Dimension dlgSize = dlg.getPreferredSize();
Dimension frmSize = getSize();
Point loc = getLocation();
dlg.setLocation((frmSize.w
idth - dlgSize.width) / 2 + loc.x, (frmSize.height - dlgSize.height) / 2 + loc.y);
dlg.setModal(true);
dlg.pack();
dlg.show();
}
} ) ;
addWindowListener( new WindowAdapter()
{
public void windowClosing( WindowEvent e )
{
dispose();
System.exit( 0 ) ;
}
} ) ;
Insets insets = getInsets() ;
DISPLAY_X = insets.left ;
DISPLAY_Y = insets.top ;
resizeToInternalSize( DISPLAY_W, DISPLAY_H ) ;
}
public void actionPerformed(ActionEven
t e)
{
try
{
JMenuItem source = (JMenuItem)(e.getSource())
;
System.out.println(source.
getText())
;
game.setImage(source.getTe
xt());
}
catch (Exception ex)
{
System.out.println(ex);
}
}
public void resizeToInternalSize( int internalWidth, int internalHeight )
{
Insets insets = getInsets() ;
final int newWidth = internalWidth + insets.left + insets.right ;
final int newHeight = internalHeight + insets.top + insets.bottom ;
Runnable resize = new Runnable()
{
public void run()
{
setSize( newWidth, newHeight ) ;
}
} ;
if( !SwingUtilities.isEventDis
patchThrea
d() )
{
try
{
SwingUtilities.invokeAndWa
it( resize ) ;
}
catch( Exception e )
{}
}
else
resize.run() ;
validate() ;
}
public void playMusic()
{
clip.loop();
}
public void start()
{
Thread gamePlay = new Thread( game ) ;
gamePlay.start() ;
}
//************************
**Main method **************************
**********
*
public static void main(String [] arguments)
{
System.out.println( "Starting JaySnake........" ) ;
final JaySnake app = new JaySnake() ;
app.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent keyevent) {
//System.out.println("Test
key press >>>>>>>>>>>>>>>>>>>>>>>>>>
");
app.snake.keyPressed(keyev
ent);
}
});
app.setSize( DISPLAY_W, DISPLAY_H ) ;
app.setTitle( "JaySnake Game" ) ;
app.setVisible( true ) ;
Splash splash = new Splash(app);
new Thread(new Runnable()
{
public void run()
{
try
{
app.playMusic();
Thread.sleep(200);
}
catch (InterruptedException e)
{
System.out.println(e);
}
} }).start();
}
/*Render method for graphics content*/
public void render( Graphics g )
{
if( backgroundImage != null )
g.drawImage( backgroundImage, 0, 0, this ) ;
/*Draw scoreboard and player details, sets color for score and player
*fills rectangle and text white and draws another rectangle that is used
*to highlight the playing area*/
g.setColor( Color.black ) ; /*sets color to black*/
g.fillRect( 0, 0, 598, 32 ) ; /*fillsRectangle for scoreboard*/
g.setColor( Color.white ) ; /*sets color to white for text*/
/*Draws text and uses score variables*/
g.drawString( "Player 1 score: " + score1, 10, 13 ) ;
//g.drawString( "Player 2 score: " + score2, 10, 27 ) ;
g.drawString( "High score: " + highscore, 510, 15 ) ;
}
/******declared class variables/containers*/
private Image backgroundImage ;
private Snake snake = null;
/* The musicclip to be played.*/
private AudioClip clip = null;
/* The sound of the applet when eaten.*/
private AudioClip appleEaten = null;
// Indicate if we want sound for eating the apple
private boolean soundForApple = true;
}
Snake:::
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.imageio.*;
import java.io.*;
import javax.swing.*;
import java.applet.AudioClip;
/*public class Snake implements ActionListener in
*particular [CODE]KeyPressed[/CODE]*/
public class Snake implements ActionListener
{
// The sound of eating an apple
AudioClip appleEaten = null;
/*Image declarations treat and snake body parts
*/
private Image food, body;
/*class variable sp*/
private JaySnake sp;
/*Used for users name input from dialogue*/
private String player;
/*int variable declarations*/
private int size =3,
dir,
score1 =0,
score2 = 0;
/*boolean state declarations*/
boolean game = false,
ate=false,
gameplay=false,
collide = false;
/*Array of points for location on the screen of snake and apples*/
Point[] location = new Point[600];
Point treat = new Point(12,7);
/*Constructor - passing snake class to app defined in class as sp*/
public Snake(JaySnake app, String player, AudioClip appleEaten)
{
this.appleEaten = appleEaten;
this.player = player;
sp = app;
//initialise all points with 0
for(int i=0; i<600; i++)
location[i] = new Point(0,0);
// Setting all starting points
location[2].move(15,25);
location[1].move(15,24);
location[0].move(15,23);
treat.move(1,6);
//try read in treat and food images
try
{
food = ImageIO.read(new File("snakeimages/food.jpg
"));
body = ImageIO.read(new File("snakeimages/snakebit
s.jpg"));
} catch(IOException e)
{System.out.println(e);
}
try{ Thread.sleep(70); }
catch(InterruptedException
e) { }
}
public void setAppleSound(AudioClip clip)
{
this.appleEaten = clip;
}
/* [code]public void actionPerformed[/code] on KeyPress repaint sp snake panel.*/
public void actionPerformed(ActionEven
t event)
{
sp.repaint();
}
/*Snake class graphics method*/
public void draw( Graphics g )
{
//Draw score board texts
g.setColor(Color.green);
g.drawString(player + "'s score: "+score1,10,13);
g.drawString( "Top score: "+score2,500,15);
//Draws the first treat onscreen
g.drawImage(food,treat.x*2
0-20,treat
.y*20-20,1
9,19,null)
;
//Collison detection for treat
if(gameplay)
{
if(location[0].x==treat.x && location[0].y==treat.y)
{
if (appleEaten != null)
{
appleEaten.play();
}
ate=true;
size++;
score1++;
}
// Drawing new head position, erasing last tale position
if(location[size-1].x == treat.x && location[size-1].y == treat.y)
g.drawImage(food,treat.x*2
0-20,treat
.y*20-20,1
9,19,null)
;
//Move snake body parts based on cases of dir (direction)
if(gameplay)
{
for(int i=size; i>0; i--)
location[i].move(location[
i-1].x, location[i-1].y);
switch(dir)
{
case 0: location[0].x = location[0].x+1; break;
case 1: location[0].x = location[0].x-1; break;
case 2: location[0].y = location[0].y-1; break;
case 3: location[0].y = location[0].y+1; break;
}
}
// Checking if had just eaten an treat, if yes - draw new treat location
if( ate )
{
ate = false;
//Math.randon generate new apple positions using the co-ordiantes
treat.x=(int)(Math.random(
)*30+1);
treat.y=(int)(Math.random(
)*25+3);
//print co-ordinateds if required
//System.out.println("trea
t.x = "+treat.x+" treat.y = " +treat.y);
g.drawImage(food,treat.x*2
0-20,treat
.y*20-20,1
9,19,null)
;
}
}
// Check for collison with walls and snake bits
for(int i=3; i<size; i++)
if(location[0].x == location[i].x && location[0].y == location[i].y)
{
gameplay = false;
restart();
}
//Walls collison
if(((collide ||
(dir==0 && location[0].x==31) || //Right co-ordinates
(dir==1 && location[0].x==0) || //Left co-ordinates
(dir==2 && location[0].y==2) || //Top co-ordinates
(dir==3 && location[0].y==28)))) //Bottom co-ordinates
{
gameplay = false;
restart();
}
//Sets images for body
for(int i=0; i<size; i++)
g.drawImage(body,location[
i].x*20-20
,location[
i].y*20-20
,20,20,nul
l);
}//end snake draw method
/*resets game settings including location of snake and apple. Also updates
*the Top score and resets player score*/
public void restart()
{
System.out.println("restar
t");
// Setting all starting points again
if(score1>score2){
score2 = score1;}
score1 = 0;
game = false;
dir =0;
size=3;
//Move snake back to original position
location[2].move(15,25);
location[1].move(15,24);
location[0].move(15,23);
//Re generate new apple locations
treat.x=(int)(Math.random(
)*30+1);
treat.y=(int)(Math.random(
)*25+3);
}
/*If keys are presees up Arrow, Down Arrow, Left Arrow and Right Arrow
*move snake to new location on grid */
public void keyPressed(KeyEvent evt)
{
int key = evt.getKeyCode();
if(key == KeyEvent.VK_RIGHT && location[1].x!=location[0]
.x+1) { dir=0; gameplay=true; }
else if(key == KeyEvent.VK_LEFT && location[1].x!=location[0]
.x-1) { dir=1; gameplay=true;}
else if(key == KeyEvent.VK_UP && location[1].y!=location[0]
.y-1) { dir=2; gameplay=true;}
else if(key == KeyEvent.VK_DOWN && location[1].y!=location[0]
.y+1) { dir=3; gameplay=true;}
else if(key == 112 || key == 1508)
{
gameplay=false;
}
}
}//end class