Xlet GAMES - HCompenent + double buffering

Hi all,
I am writing an application that use some HCompenents (Htext,HTextbuttom...) from package org.havi.ui
paint method of Hvisible is not implement double buffering (public boolean isDoubleBuffered() { return false;})
if i want to implement double buffering does the only way to do so is to extends each HCompenent and overwrite the paint function ?
and how do i implement double buffering for part of the screen?
i need to use bufferImage and bufferGraphics or there is some flip method
Thanks

You can either extend each HComponent or you can use HLooks to do implement double buffering. Writing a good HLook is tricky, but it may be slightly easier that extending each HComponent, depending on how many classes you have.
Steve.

Similar Messages

  • Problem with Double Buffering and Swing

    Hi
    I made a game and basically it works pretty well, my only problem is it flickers really badly right now. I read up on a whole lot of forums about double buffering and none of those methods seemed to work. Then I noticed that Swing has double buffering built in so I tried that but then I get compilation errors and I'm really not sure why. My original code was a console application and worked perfectly, then I ported it into a JApplet and it still works but it flickers and thats what I'm tryign to fix now.
    The code below is in my main class under the constructor.
    Heres the double buffering code I'm trying to use, I'm sure you all seen it before lol
    public void update(Graphics g)
              // initialize buffer
              if (dbImage == null)
                   dbImage = createImage(this.getSize().width, this.getSize().height);
                   dbg = dbImage.getGraphics();
              // clear screen in background
              dbg.setColor(getBackground());
              dbg.fillRect(0, 0, this.getSize().width, this.getSize().height);
              // draw elements in background
              dbg.setColor(getForeground());
              paint(dbg);
              // draw image on the screen
              g.drawImage(dbImage, 0, 0, this);
         }My paint is right under neath and heres how it looks
    This snipet of code works but when I change the method to
    public paintComponent(Graphics g){
    super.paintComponent(g)...
    everythign stops working and get a compilation error and says that it can't find paintComponent in javax.swing.JFrame.
    public void paint(Graphics g)
              super.paint(g);
              //if game starting display menue
              if (show_menue)
                   //to restart lives if player dies
                   lives = 3;
                   menue.draw_menue(g);
                   menue_ufo1.draw_shape(g);
                   menue_ufo2.shape_color = Color.DARK_GRAY;
                   menue_ufo2.draw_shape(g);
                   menue_ufo3.shape_color = Color.BLUE;
                   menue_ufo3.draw_shape(g);
                   menue_ufo4.shape_color = new Color(82, 157, 22);
                   menue_ufo4.draw_shape(g);
                   menue_ufo5.draw_shape(g);
                   menue_ufo6.shape_color = new Color(130, 3, 3); ;
                   menue_ufo6.draw_shape(g);
                   menue_turret.draw_ship(g);
                   menue_ammo.draw_ammo(g);
              else
                   //otherwise redraw game objects
                   gunner.draw_ship(g);
                   y_ammo.draw_ammo(g);
                   grass.draw_bar(g);
                   o_ufo.draw_shape(g);
                   b_ufo.draw_shape(g);
                   m_ufo.draw_shape(g);
                   s_ufo.draw_shape(g);
                   z_ufo.draw_shape(g);
                   xx_ufo.draw_shape(g);
                   info.draw_bar(g);
                   live_painter.draw_lives(g, lives);
                   score_painter.draw_score(g, score);
                   level_display.draw_level(g, level);
                   explosion.draw_boom(g);
         }I just want to get rid of the flickering for now so any help will be greatly appreciated. Depending which will be simpler I can either try to double buffer this program or port it all to swing but I'm not sure which elements are effected by AWT and which by Swing. Also I read some of the Java documentation but couldn't really understand how to implement it to fix my program.
    Thanks in advance
    Sebastian

    This is a simple animation example quickly thrown together. I have two classes, an animation panel which is a JPanel subclass that overrides paintComponent and draws the animation, and a JApplet subclass that simply holds the animation panel in the applet's contentpane:
    SimpleAnimationPanel.java
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Point;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.image.BufferedImage;
    import java.io.IOException;
    import java.net.MalformedURLException;
    import java.net.URL;
    import javax.imageio.ImageIO;
    import javax.swing.JPanel;
    import javax.swing.Timer;
    class SimpleAnimationPanel extends JPanel
        private static final int DELAY = 20;
        public static final int X_TRANSLATION = 2;
        public static final int Y_TRANSLATION = 2;
        private Point point = new Point(5, 32);
        private BufferedImage duke = null;
        private Timer timer = new Timer(DELAY, new TimerAction());
        public SimpleAnimationPanel()
            try
                // borrow an image from sun.com
                duke = ImageIO.read(new URL(
                        "http://java.sun.com/products/plugin/images/duke.wave.med.gif"));
            catch (MalformedURLException e)
                e.printStackTrace();
            catch (IOException e)
                e.printStackTrace();
            setPreferredSize(new Dimension(600, 400));
            timer.start();
        // do our drawing here in the paintComponent override
        @Override
        protected void paintComponent(Graphics g)
            super.paintComponent(g);
            if (duke != null)
                g.drawImage(duke, point.x, point.y, this);
        private class TimerAction implements ActionListener
            @Override
            public void actionPerformed(ActionEvent e)
                int x = point.x;
                int y = point.y;
                Dimension size = SimpleAnimationPanel.this.getSize();
                if (x > size.width)
                    x = 0;
                else
                    x += X_TRANSLATION;
                if (y > size.height)
                    y = 0;
                else
                    y += Y_TRANSLATION;
                point.setLocation(new Point(x, y)); // update the point
                SimpleAnimationPanel.this.repaint();
    }AnimationApplet.java
    import java.lang.reflect.InvocationTargetException;
    import javax.swing.JApplet;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
    public class AnimationApplet extends JApplet
        public void init()
            try
                SwingUtilities.invokeAndWait(new Runnable()
                    public void run()
                        // construct the panel
                        JPanel simpleAnimation = new SimpleAnimationPanel();
                        // put it in the contentPane of the JApplet
                        getContentPane().add(simpleAnimation);
                        setSize(simpleAnimation.getPreferredSize());
            catch (InterruptedException e)
                e.printStackTrace();
            catch (InvocationTargetException e)
                e.printStackTrace();
    }Here's a 3rd bonus class that shows how to put the JPanel into a stand-alone program, a JFrame. It's very similar to doing it in the JApplet:
    AnimationFrame.java
    import javax.swing.JFrame;
    public class AnimationFrame
        private static void createAndShowUI()
            JFrame frame = new JFrame("SimpleAnimationPanel");
            frame.getContentPane().add(new SimpleAnimationPanel());
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        public static void main(String[] args)
            java.awt.EventQueue.invokeLater(new Runnable()
                public void run()
                    createAndShowUI();
    }Edited by: Encephalopathic on Mar 15, 2008 11:01 PM

  • Double buffering

    I was searching through posts to find an answer to my problem of getting double buffering working without flickering when I came across this response:
    Upgrade your SDK, early 1.4 implementations had this problem on Windows2k (It's a bug). Pretty much the second buffer will point to an empty portion of video memory always, the solution to this without updating is to fill the entire backbuffer completely, flip it, fill it again, and then flip it again. You should then be able to use it normaly.
    -Jason Thomas.
    Since I am on dialup I can't really download the SDK, so could someone give me some code to do what Jason has suggested?
    Jonathan O'Brien

    No I am not recreating the bufferstrategy every frame. Overriding update didn't work either. Here is my code for main:
              GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
              GraphicsDevice device = env.getDefaultScreenDevice();
              GraphicsConfiguration gc = device.getDefaultConfiguration();
              Frame myFrame = new Frame(gc);
    BufferCapabilities bufferCaps = gc.getBufferCapabilities();
              boolean multiBuffer = bufferCaps.isMultiBufferAvailable();
              boolean fullScreen = device.isFullScreenSupported();
              System.out.println("Full screen supported = " + fullScreen);
              System.out.println("Multi buffer available = " + multiBuffer);
              System.out.println("Page flipping = " + bufferCaps.isPageFlipping());
              myFrame.setUndecorated(true);
              myFrame.setIgnoreRepaint(true);
              if ((fullScreen) && (multiBuffer))
                   device.setFullScreenWindow(myFrame);
                   device.setDisplayMode(new DisplayMode(800, 600, 16, 0));
                   rectBounds = myFrame.getBounds();
                   myFrame.createBufferStrategy(2);
                   bufferStrategy = myFrame.getBufferStrategy();
                   bufferReady = true;
              Game thisGame = new Game(args[0]);
              myFrame.add(thisGame);
    //          myFrame.getContentPane().add(thisGame);
              myFrame.show();
    And here is the relevant code for my run method:
              if (bufferReady)
                   Graphics g = bufferStrategy.getDrawGraphics();
                   if (!bufferStrategy.contentsLost()) {
                        g.fillRect(0,0,getWidth(),getHeight());
                        g.dispose();
                        bufferStrategy.show();

  • Double buffering still gives flickering graphics.

    I copied code from a tutorail which is supposed to illustrate double buffering.
    After I run it, it still flickers though.
    I use applet viewer, which is part of netbeans to run my applet.
    Link to tutorial: http://www.javacooperation.gmxhome.de/TutorialStartEng.html
    My questions are:
    Is the strategy used for double buffering correct?
    Why does it flicker?
    Why does the program change the priority a couple of times?
    Can you make fast games in JApplets or is there a better way to make games? (I think C++ is too hard)
    Here is the code:
    package ballspel;
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Image;
    import javax.swing.JApplet;
    //import java.applet.*;
    * @author Somelauw
    public class BallApplet extends /*Applet*/ JApplet implements Runnable {
    private Image dbImage;
    private Graphics dbg;
    private int radius = 20;
    private int xPos = 10;
    private int yPos = 100;
    * Initialization method that will be called after the applet is loaded
    * into the browser.
    @Override
    public void init() {
    //System.out.println(this.isDoubleBuffered()); //returns false
    // Isn't there a builtin way to force double buffering?
    // TODO start asynchronous download of heavy resources
    @Override
    public void start() {
    Thread th = new Thread(this);
    th.start();
    public void run() {
    Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
    while (true) {
    xPos++;
    repaint();
    try {
    Thread.sleep(20);
    } catch (InterruptedException ex) {
    ex.printStackTrace();
    Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
    @Override
    public void paint(Graphics g) {
    super.paint(g);
    //g.clear();//, yPos, WIDTH, WIDTH)
    g.setColor(Color.red);
    g.fillOval(xPos - radius, yPos - radius, 2 * radius, 2 * radius);
    @Override
    public void update(Graphics g) {
    super.update(g);
    // initialize buffer
    if (dbImage == null) {
    dbImage = createImage(this.getSize().width, this.getSize().height);
    dbg = dbImage.getGraphics();
    // clear screen in background
    dbg.setColor(getBackground());
    dbg.fillRect(0, 0, this.getSize().width, this.getSize().height);
    // draw elements in background
    dbg.setColor(getForeground());
    paint(dbg);
    // draw image on the screen
    g.drawImage(dbImage, 0, 0, this);
    // TODO overwrite start(), stop() and destroy() methods
    }

    Somelauw wrote:
    I copied code from a tutorail which is supposed to illustrate double buffering.
    After I run it, it still flickers though.
    I use applet viewer, which is part of netbeans.. AppletViewer is part of the JDK, not NetBeans.
    ..to run my applet.
    Link to tutorial: http://www.javacooperation.gmxhome.de/TutorialStartEng.html
    Did you specifically mean the code mentioned on this page?
    [http://www.javacooperation.gmxhome.de/BildschirmflackernEng.html]
    Don't expect people to go hunting around the site, looking for the code you happen to be referring to.
    As an aside, please use the code tags when posting code, code snippets, XML/HTML or input/output. The code tags help retain the formatting and indentation of the sample. To use the code tags, select the sample and click the CODE button.
    Here is the code you posted, as it appears in code tags.
    package ballspel;
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Image;
    import javax.swing.JApplet;
    //import java.applet.*;
    * @author Somelauw
    public class BallApplet extends /*Applet*/ JApplet implements Runnable {
        private Image dbImage;
        private Graphics dbg;
        private int radius = 20;
        private int xPos = 10;
        private int yPos = 100;
         * Initialization method that will be called after the applet is loaded
         * into the browser.
        @Override
        public void init() {
            //System.out.println(this.isDoubleBuffered()); //returns false
            // Isn't there a builtin way to force double buffering?
            // TODO start asynchronous download of heavy resources
        @Override
        public void start() {
            Thread th = new Thread(this);
            th.start();
        public void run() {
            Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
            while (true) {
                xPos++;
                repaint();
                try {
                    Thread.sleep(20);
                } catch (InterruptedException ex) {
                    ex.printStackTrace();
                Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
        @Override
        public void paint(Graphics g) {
            super.paint(g);
            //g.clear();//, yPos, WIDTH, WIDTH)
            g.setColor(Color.red);
            g.fillOval(xPos - radius, yPos - radius, 2 * radius, 2 * radius);
        @Override
        public void update(Graphics g) {
            super.update(g);
            // initialize buffer
            if (dbImage == null) {
                dbImage = createImage(this.getSize().width, this.getSize().height);
                dbg = dbImage.getGraphics();
            // clear screen in background
            dbg.setColor(getBackground());
            dbg.fillRect(0, 0, this.getSize().width, this.getSize().height);
            // draw elements in background
            dbg.setColor(getForeground());
            paint(dbg);
            // draw image on the screen
            g.drawImage(dbImage, 0, 0, this);
        // TODO overwrite start(), stop() and destroy() methods
    }Edit 1:
    - For animation code, it would be typical to use a javax.swing.Timer for triggering updates, rather than implementing Runnable (etc.)
    - Attempting to set the thread priority will throw a SecurityException, though oddly it occurs when attempting to set the Thread priority to maximum, whereas the earlier call to set the Thread priority to minimum passed without comment (exception).
    - The paint() method of that applet is not double buffered.
    - It is generally advisable to override paintComponent(Graphics) in a JPanel that is added to the top-level applet (or JFrame, or JWindow, or JDialog..) rather than the paint(Graphics) method of the top-level container itself.
    Edited by: AndrewThompson64 on Jan 22, 2010 12:47 PM

  • Double buffering... +1

    Hi there......
    Ive created a game that uses double buffering...basically the user hits the ball that is moving around the screen... after 5 goes the program needs to display a graph....
    I have got the two components working seperatly... but when i combine that classes into one (the graph + the game) when theg graph is displayed the screen flickers..... and u cant see the graph properly....
    How do you stop the screen from trying to keep refreshing and display the final image? (which is no longer animated)
    Many thanks....

    search this site or google
    there are hundreds of posts about double buffering

  • Which is better, Double Buffering 1, or Double Buffering 2??

    Hi,
    I came across a book that uses a completely different approach to double buffering. I use this method:
    private Graphics dbg;
    private Image dbImage;
    public void update() {
      if (dbImage == null) {
        dbImage = createImage(this.getSize().width, this.getSize().height);
        dbg = dbImage.getGraphics();
      dbg.setColor(this.getBackground());
      dbg.fillRect(0, 0, this.getSize().width, this.getSize().height);
      dbg.setColor(this.getForeground());
      paint(dbg);
      g.drawImage(dbImage, 0, 0, this);
    }that was my method for double buffering, and this is the books method:
    import java.awt.*;
    public class DB extends Canvas {
         private Image[] backing = new Image[2];
         private int imageToDraw = 0;
         private int imageNotDraw = 1;
         public void update(Graphics g) {
              paint(g);
         public synchronized void paint(Graphics g) {
              g.drawImage(backing[imageToDraw], 0, 0, this);
         public void addNotify() {
              super.addNotify();
              backing[0] = createImage(400, 400);
              backing[1] = createImage(400, 400);
              setSize(400, 400);
              new Thread(
                   new Runnable() {
                        private int direction = 1;
                        private int position = 0;
                        public void run() {
                             while (true) {
                                  try {
                                       Thread.sleep(10);
                                  }catch (InterruptedException ex) {
                                  Graphics g = backing[imageNotDraw].getGraphics();
                                  g.clearRect(0, 0, 400, 400);
                                                    g.setColor(Color.black);
                                  g.drawOval(position, 200 - position, 400 - (2 * position), 72 * position);
                                  synchronized (DB.this) {
                                       int temp = imageNotDraw;
                                       imageNotDraw = imageToDraw;
                                       imageToDraw = temp;
                                  position += direction;
                                  if (position > 199) {
                                       direction = -1;
                                  }else if (position < 1) {
                                       direction = 1;
                                  repaint();
              ).start();
         public static void main(String args[]) {
              Frame f = new Frame("Double Buffering");
              f.add(new DB(), BorderLayout.CENTER);
              f.pack();
              f.show();
    }which is better? I noticed smoother animation with the later method.
    Is there no difference? Or is it just a figment of my imagination??

    To be fair if you download an applet all the class files are stored in your .jpi_cache, and depending on how that game requests its graphics sometimes they are stored there to, so really if you have to download an applet game twice, blame the programmer (I've probably got that dead wrong :B ).
    But, what's wrong with Jars. They offer so much more.
    No offence meant by this Malohkan but if you can't organize your downloaded files the internet must really be a landmine for you :)
    Personally I'd be happy if I never seen another applet again, it seems java is tied to this legacy, and to the average computer user it seems that is all java is capable of.
    Admitidly there are some very funky applets out here using lots of way over my head funky pixel tricks, but they would look so much better running full screen and offline.

  • Double Buffering a large image - is it a good idea to do so ?

    I'm developing a small maze like game. I'm using double buffering. So I double buffer the enter screen area (1024x768) and copy them all back to the on screen buffer...
    I need my code to run atleast at 18 - 24 fps.
    Is there a better/efficient way to do this...
    Note : I'm manually double buffer. I don't use any Buffer manager.
    like this
    public void update(Graphics g)
          Image i = createImage(...)      ;
          paint(i.getGraphics() );
          g.drawImage(i..)
    }

    Hi chaos,
    I am developing a game too and I achieve very high frame rate (up to 60 fps) using the hardware accelerated pipelines and the double buffering/page flipping strategy.
    here is the method I call to update my the entire screen of my game:
    private void screenUpdate()
        try
          Graphics gScr = bufferStrategy.getDrawGraphics();
          gameRender(gScr); //this is where I paint the game screen
          gScr.dispose();
          if (!bufferStrategy.contentsLost())
            bufferStrategy.show();
        } catch (Exception e)
          e.printStackTrace();
          running = false;
      }Here is how I create the buffer strategy in the main JFrame:
    try
          EventQueue.invokeAndWait(new Runnable()
            public void run()
              createBufferStrategy(NUM_BUFFERS);
        } catch (Exception e)
          System.out.println("Error while creating buffer strategy");
          System.exit(0);
        bufferStrategy = getBufferStrategy();In my gameRender method, I use only draming method that works without breaking the hardware acceleration (by default enabled with java 6.0). I just make sure to use BufferedImage without rotation or manually written filters and the game runs at 60 fps without any issue.
    The CPU is even still sleeping more than 70% of the time which gives a lot room for all other processing such as path finders, A.I., ...
    Cheers.
    Vince.

  • Properly (?) Double Buffered Applet is really Choppy

    Hi all. I looked around here for the proper way to double buffer an applet, and I think I've got it, but it's realllly choppy when it runs. (It's a little 2d jump 'n run game with not much in it yet). If you have any idea why, please tell =) Thanks!
    public class Game extends JApplet implements KeyListener, Runnable
         //doublebuffer stuff
         Graphics bufferGraphics;
         Image offscreenImage;
         Dimension dim;
         //constants
         int SCREEN_WIDTH = 800;
         int SCREEN_HEIGHT = 600;
         int SPRITE_SIZE = 64;
         Color BGColor = Color.white;
         int PLAYER_SPEED_X = 10;
         int PLAYER_JUMP_SPEED = 20;
         int GRAVITY_ACCEL = 1;
         //directional constants
         int LEFT = -1;
         int RIGHT = 1;
         int STOPPED = 0;
         int UP = -1;
         int DOWN = 1;
         //images
         Image playerImage;
         //movement
         boolean freeFall = true;
         int playerDirX = STOPPED;
         int playerVelY = 0;
         int playerPosX = 0;
         int playerPosY = 0;
         //game control variables
         boolean gameIsRunning = false;
         Thread t;
         int i = 0;
         public void init()
              addKeyListener(this);
              gameIsRunning = true;
              //prepare offscreen image for double buffering
              setSize(800,600);
              dim = getSize();
              offscreenImage = createImage(dim.width,dim.height);
              bufferGraphics = offscreenImage.getGraphics();
              playerImage = getImage(getDocumentBase(),"images/playerRight.gif");
              t = new Thread(this);
              t.start();
         public void run()
              while(gameIsRunning)
                   try
                        t.sleep(33);
                   catch (InterruptedException e) {}
                   playerPosX += playerDirX*PLAYER_SPEED_X;
                   playerPosY -= playerVelY;
                   if(freeFall)
                        playerVelY -= GRAVITY_ACCEL;
                   //wraparound
                   if(playerPosX < 0)
                        playerPosX = 0;
                   if(playerPosX > SCREEN_WIDTH - SPRITE_SIZE)
                        playerPosX = SCREEN_WIDTH - SPRITE_SIZE;
                   //stop at the floor
                   if(playerPosY > SCREEN_HEIGHT - SPRITE_SIZE)
                        freeFall = false;
                        playerVelY = 0;
                        playerPosY = SCREEN_HEIGHT - SPRITE_SIZE;
                   repaint();
         public void keyPressed(KeyEvent e)
              //move right
              if(e.getKeyCode() == KeyEvent.VK_RIGHT ||
                        e.getKeyCode() == KeyEvent.VK_D)
                   playerImage = getImage(getDocumentBase(),"images/playerRight.gif");
                   playerDirX = RIGHT;
              //move left
              if(e.getKeyCode() == KeyEvent.VK_LEFT ||
                        e.getKeyCode() == KeyEvent.VK_A)
                   playerImage = getImage(getDocumentBase(),"images/playerLeft.gif");
                   playerDirX = LEFT;
              //jump
              if(e.getKeyCode() == KeyEvent.VK_SPACE ||
                        e.getKeyCode() == KeyEvent.VK_W ||
                        e.getKeyCode() == KeyEvent.VK_UP)
                   //allow jumping if we're standing on a surface
                   if(playerPosY == SCREEN_HEIGHT - SPRITE_SIZE ||
                             playerPosX == 0 ||
                             playerPosX == SCREEN_WIDTH - SPRITE_SIZE)
                        if(playerPosX == 0)
                             playerDirX = RIGHT;
                             playerImage =
                                  getImage(getDocumentBase(),"images/playerRight.gif");
                        if(playerPosX == SCREEN_WIDTH - SPRITE_SIZE)
                             playerDirX = LEFT;
                             playerImage =
                                  getImage(getDocumentBase(),"images/playerLeft.gif");
                        freeFall = true;
                        playerVelY = PLAYER_JUMP_SPEED;
         public void keyReleased(KeyEvent e)
              //stop moving right
              if(e.getKeyCode() == KeyEvent.VK_RIGHT ||
                        e.getKeyCode() == KeyEvent.VK_D)
                   if(playerDirX == RIGHT)
                        playerDirX = STOPPED;
              //stop moving left
              if(e.getKeyCode() == KeyEvent.VK_LEFT ||
                        e.getKeyCode() == KeyEvent.VK_A)
                   if(playerDirX == LEFT)
                        playerDirX = STOPPED;
         public void keyTyped(KeyEvent e)
         public void paint(Graphics g)
              //clear screen
              bufferGraphics.setColor(Color.white);
              bufferGraphics.fillRect(0,0,SCREEN_WIDTH,SCREEN_HEIGHT);
              //draw the player
              bufferGraphics.drawImage(playerImage,playerPosX,playerPosY,this);
              g.drawImage(offscreenImage,0,0,this);
         public void stop()
              t.stop();
        public void update(Graphics g)
             paint(g);
    }

    It looks fine to me, but don't reload the player images every time. If you need a different image you should read up on AffineTransform and do some rotations etc, or at least have the 4 images in an array or something.
    P.S. stop is deprecated for threads. If you are done with the thread null it. That being said, if you are making this as an applet, make sure you can restart or reload it properly by testing it with the appletvier.
    Good luck in your work.

  • Sprite animation with double buffering

    Hello, I am writing a game. I am not using swing. Just awt.
    I have several books I am looking at right now. One uses the
    BufferedImage class to create a buffered sprite. The other book instead uses the Image class to impliment double buffering. So, I am really confused now. I do not know if I should use the BufferedImage class or the Image class. Note that
    Please help. Which method is the best to use?
    Val

    These links may assist you in full-screen animation with double-buffering:
    http://www.sys-con.com/java/article.cfm?id=1893
    http://www.meatfighter.com/meat.pdf
    - Mike

  • Code for Double Buffering

    Hi.
    I did go through the JAVA tutorial here, but I still am not very clear about how to do double buffering. Can someone just give me a sample code? It would make my understanding clearer.
    Also, for making games like mario or contra, should I use .gif images or .jpg?
    Thanking You all

    private Image offScreenImage;
    private Graphics offScreen;
    public void update(Graphics g){
    offScreenImage=createImage(this.getSize().width, this.getSize().height);
    offScreen=offScreenImage.getGraphics();
    paint(offScreen);
    g.drawImage(offScreenImage,0,0,this);
    there you go... enjoy =)
    Michael

  • Double Buffering Problem in html

    My double buffering works in my IDE, but not when embedded in html.
    import javax.swing.*;
    import java.applet.*;
    import java.awt.event.*;
    import java.awt.*;
    import java.awt.image.*;
    import java.util.*;
    class Brick
        public int x,y;   
        public Brick(int x,int y) {this.x = x;this.y = y;}
    class Ball
        public int x,y,a,b;
        public Ball(int x, int y) {this.x = x;this.y = y;}
    public class Pong2 extends JApplet implements MouseListener, MouseMotionListener, Runnable, KeyListener
        long tm = System.currentTimeMillis();
        int delay;
        int a1=0,b1=0,c1=0,d1=0;
        int dead;
        int ranB1,ranB2;
        boolean pauseB = false;
        boolean starttext = true;
        int ani = 0;
        String stringWin;
        Graphics offscreen;Image image;
        private final int INIT_ACTIVE = 0;
        private final int INTRO_ACTIVE = 1;
        private final int GAME1_ACTIVE = 2;
        private final int GAME2_ACTIVE = 3;
        private final int GAME3_ACTIVE = 4;
        private int r1,r2,r3,r4,r5,starter=0,win=0,own=0;
        private int gameflag;
        private boolean player = true,moveB = true,thisB = true,timerB = true;
        private boolean drawB = true;
        private int counte=0;
        private int time = -2;
        private int movecheck1; int movecheck2;int movecheck3;int movecheck4;
        private int c;
        private int god = 0;
        private int tempx1, tempy1,tempx2,tempy2;
        private int pause = 2, resume = 0;
        private int ran, ran2,ran3,ran4;
        private int yCheck1,yCheck2,yCheck3,yCheck4,xCheck1,xCheck2,xCheck3,xCheck4;
        private int begin = 0;
        private int counter = 0, colorChange =0;
        private Brick brick[] = new Brick[4];
        private Ball ball[] = new Ball[2];
        private Ball ball2[] = new Ball[8];
        private int cons1 = 0,cons2 = 0,cons3=0,cons4=0;
        private int score1=10, score2=10,score3=10,score4=10;
        private Thread t;
        private Font font;
        private AudioClip match,teleport,headshot, ballbounce, dkill,humiliation,one,two,three,fight,prepare;   
        public Image paddle3,paddle4,rarrow,dbuffer,paddle,paddle2,bricks,blood,title,edge,m_imgOffScr;
        private Graphics dbuffer_gfx,m_gOffScr,dbg;
        private Color Color1 = new Color(255,255,255);
        private Color sColor3 = new Color(139,80,14);
        private Color sColor2 = new Color(0,255,0);
        private Color sColor4 = new Color(255,255,0);
        private Polygon poly1 = new Polygon();Polygon poly2 = new Polygon(); 
        private Polygon poly3 = new Polygon();Polygon poly4 = new Polygon();
        private boolean p1Dead=false, p2Dead=false, p3Dead=false, p4Dead=false;
        private int ranLoc, winner;
        public void initgame()
            poly1.addPoint(0,0);poly1.addPoint(0,125);poly1.addPoint(125,0);
            poly2.addPoint(0,650);poly2.addPoint(125,650);poly2.addPoint(0,525);
            poly3.addPoint(650,0);poly3.addPoint(650,125);poly3.addPoint(525,0);
            poly4.addPoint(650,650);poly4.addPoint(650,525);poly4.addPoint(525,650);
            for (int j = 0; j < ball.length; j++){ball[j] = new Ball(325,325);}
            brick[0] = new Brick(25,285);
            brick[1] = new Brick(615,285);
            brick[2] = new Brick(285,25);
            brick[3] = new Brick(285,615);
            yCheck1 = brick[0].y; yCheck2 = brick[1].y; yCheck3 = brick[2].y; yCheck4 = brick[3].y;
            xCheck1 = brick[0].x; xCheck2 = brick[1].x; xCheck3 = brick[2].x; xCheck4 = brick[3].x;
            if(player)
            for (int n = 0; n<8; n++)
                r1 = (int)(Math.random() * 600)+10;r2 = (int)(Math.random() * 600)+10;
                ball2[n] = new Ball(r1,r2);
                if (n == 0||n==4) {ball2[n].a = 3; ball2[n].b = 3;}if (n == 1||n==5) {ball2[n].a = -3; ball2[n].b = 3;}
                if (n == 2||n==6) {ball2[n].a = 3; ball2[n].b = -3;}if (n == 3||n==7) {ball2[n].a = -3; ball2[n].b = -3;}           
            player = false;
        public void init()
            gameflag = INIT_ACTIVE;
            setSize(650,725);
            requestFocus();      
            Font font = new Font ("Arial", Font.BOLD,50);
            paddle = getImage(getCodeBase(), "paddle.jpg");
            paddle2 = getImage(getCodeBase(), "paddle2.jpg");
            paddle3 = getImage(getCodeBase(), "paddle3.jpg");
            paddle4 = getImage(getCodeBase(), "paddle4.jpg");
            bricks = getImage(getCodeBase(), "bricks.jpg");
            blood = getImage(getCodeBase(), "blood.jpg");
            title = getImage(getCodeBase(), "title.jpg"); 
            headshot = getAudioClip(getCodeBase(), "headshot2.wav");
            ballbounce = getAudioClip(getCodeBase(), "ir_begin.wav");
            humiliation = getAudioClip(getCodeBase(), "humiliation.wav");
            prepare = getAudioClip(getCodeBase(), "prepare.wav");
            teleport = getAudioClip(getCodeBase(), "teleport.wav");
            match = getAudioClip(getCodeBase(), "matchwin.wav");
            dbuffer=createImage(getSize().width,getSize().height);
            dbuffer_gfx=dbuffer.getGraphics();
            initgame();
            addMouseListener(this);
            addMouseMotionListener(this);
            addKeyListener(this);
        public void start()
            Thread t = new Thread(this);
            t.start();
            new Thread(pMovement).start();                       
        public void stop()
            t.yield();
            t = null;
        public void update (Graphics g)
            paint(dbuffer_gfx);
            g.drawImage(dbuffer,0,0,this);
        public void PaintIntro(Graphics g)
            g.setColor(Color.white);
            g.fillRect(0,0,650,725);
            g.setColor(Color.black);
            for(int wa = 0;wa<8;wa++)
            g.fillOval(ball2[wa].x,ball2[wa].y,10,10);
            g.drawImage(title,100,100,this);
            g.setFont(new Font("Arial", Font.BOLD,20));
            g.drawString("Written By Alec Parenzan",200,200);
            g.setFont(new Font("Arial", Font.BOLD,14));
            if (colorChange==0)g.setColor(Color.blue);
            g.drawString("4 Player Game",275,430);
            g.setColor(Color.black);
            if (colorChange==1)g.setColor(Color.blue);
            g.drawString("2 Player Game",275,450);
            g.setColor(Color.black);
            if (colorChange==2)g.setColor(Color.blue);
            g.drawString("1 Player Game",275,470);
        public void PaintGame1 (Graphics g)
            g.setColor(Color.black);
            g.drawImage(blood,0,0,650,650,this);
            if(p1Dead==false && own>0 )g.drawImage(paddle3,brick[0].x,brick[0].y,10,80,this);
            if(p2Dead==false&& own>0)g.drawImage(paddle,brick[1].x,brick[1].y,10,80,this);
            if(p3Dead==false&& own>0)g.drawImage(paddle2,brick[2].x,brick[2].y,80,10,this);
            if(p4Dead==false&& own>0)g.drawImage(paddle4,brick[3].x,brick[3].y,80,10,this);
            g.fillPolygon(poly1);g.fillPolygon(poly2);g.fillPolygon(poly3);g.fillPolygon(poly4);
            g.setColor(Color.white);
            g.drawPolygon(poly1);g.drawPolygon(poly2);g.drawPolygon(poly3);g.drawPolygon(poly4);
            g.setColor(Color.black);
            if(begin==1 && drawB)
            {g.fillOval(ball[0].x,ball[0].y,10,10);g.fillOval(ball[1].x,ball[1].y,10,10);}
            g.drawImage(bricks,1,650,650,75,this);
            //score
            g.setFont(new Font("Comic Sans MS", Font.ITALIC,50));
            if(own>0){
                g.setColor(sColor2);g.drawString(Integer.toString(score1),50,705);
                g.setColor(Color.orange);g.drawString(Integer.toString(score2),150,705);
                g.setColor(Color.blue);g.drawString(Integer.toString(score3),440,705);
                g.setColor(sColor3);g.drawString(Integer.toString(score4),540,705);}
            //painting gui
            if (starttext) {g.setColor(Color.black);
                g.setFont(new Font("Arial", Font.ITALIC,30));g.drawString("Click START to Begin",175,325);}
            g.setColor(Color1);
            g.setFont(new Font("Arial", Font.BOLD,30));
            if(pause ==1 && begin>0)g.drawString("RESUME",270,700);
            else if(begin==0)g.drawString("START",270,700);
            else if(begin>=1 && begin<=2 && pause==0){g.drawString("PAUSE",270,700);}    
            //start
            g.setFont(font);g.setColor(Color.black);
            if(win ==1){if(winner==1)g.setColor(Color.green);else if(winner==2)g.setColor(Color.orange);
                else if(winner==3)g.setColor(Color.blue);else if(winner==4)g.setColor(sColor3);           
                g.drawString(stringWin,245,325);}
            g.setColor(Color.black);
            if (time == 1)g.drawString("3",300,325);
            else if (time==2)g.drawString("2",300,325);
            else if (time==3)g.drawString("1",300,325);          
        public void PaintGame2(Graphics g)
            g.setColor(Color.black);
            g.drawImage(blood,0,0,650,650,this);
            if(p1Dead==false && own>0 )g.drawImage(paddle3,brick[0].x,brick[0].y,10,80,this);
            if(p2Dead==false&& own>0)g.drawImage(paddle,brick[1].x,brick[1].y,10,80,this);
            g.fillPolygon(poly1);g.fillPolygon(poly2);g.fillPolygon(poly3);g.fillPolygon(poly4);
            g.setColor(Color.white);
            g.drawPolygon(poly1);g.drawPolygon(poly2);g.drawPolygon(poly3);g.drawPolygon(poly4);
            g.setColor(Color.black);
            if(begin==1 && drawB)
            {g.fillOval(ball[0].x,ball[0].y,10,10);g.fillOval(ball[1].x,ball[1].y,10,10);}
            g.drawImage(bricks,1,650,650,75,this);
            //score
            g.setFont(new Font("Comic Sans MS", Font.ITALIC,50));
            if(own>0){
                g.setColor(sColor2);g.drawString(Integer.toString(score1),50,705);
                g.setColor(Color.orange);g.drawString(Integer.toString(score2),540,705);}
            //painting gui
            if (starttext) {g.setColor(Color.black);
                g.setFont(new Font("Arial", Font.ITALIC,30));g.drawString("Click START to Begin",175,325);}
            g.setColor(Color1);
            g.setFont(new Font("Arial", Font.BOLD,30));
            if(pause ==1 && begin>0)g.drawString("RESUME",270,700);
            else if(begin==0)g.drawString("START",270,700);
            else if(begin>=1 && begin<=2 && pause==0){g.drawString("PAUSE",270,700);}    
            //start
            g.setFont(font);g.setColor(Color.black);
            if(win ==1){if(winner==1)g.setColor(Color.green);else if(winner==2)g.setColor(Color.orange);}
            g.setColor(Color.black);
            if (time == 1)g.drawString("3",300,325);
            else if (time==2)g.drawString("2",300,325);
            else if (time==3)g.drawString("1",300,325);     
        //paint graphics
        public void paint(Graphics g)
                g.setColor(Color.WHITE);
                g.fillRect(0,0,500,500);
                g.setColor(Color.BLACK);
            if (gameflag == INIT_ACTIVE)
                g.setColor(Color.black);
                g.fillRect(0,0,getSize().width,getSize().height);
                g.setColor(Color.white);
                g.drawString("Loading...",getSize().width/2, getSize().height/2);
            if (gameflag == INTRO_ACTIVE){PaintIntro(g);}
            if (gameflag == GAME1_ACTIVE){PaintGame1(g);} 
            if (gameflag == GAME2_ACTIVE || gameflag == GAME3_ACTIVE){PaintGame2(g);}
        public void paddlephys()
            for(int j =0; j < 2;j++)
                //P1
                if(p1Dead==false&&ball[j].x-4<=xCheck1 && ball[j].x<=xCheck2 && begin==1)
                    if (ball[j].y>=yCheck1&&ball[j].y<=yCheck1+12) {ball[j].a=2;ball[j].b=-4;ballbounce.play();}
                    else if (ball[j].y>=yCheck1+13&&ball[j].y<=yCheck1+25) {ball[j].a=3;ball[j].b=-3;ballbounce.play();}
                    else if (ball[j].y>=yCheck1+26&&ball[j].y<=yCheck1+39) {ball[j].a=4;ball[j].b=-2;ballbounce.play();}
                    else if (ball[j].y>=yCheck1+40&&ball[j].y<=yCheck1+53) {ball[j].a=4;ball[j].b=2;ballbounce.play();}
                    else if (ball[j].y>=yCheck1+54&&ball[j].y<=yCheck1+66) {ball[j].a=3;ball[j].b=3;ballbounce.play();}
                    else if (ball[j].y>=yCheck1+67&&ball[j].y<=yCheck1+79) {ball[j].a=2;ball[j].b=4;ballbounce.play();}
                //P2
                if(p2Dead==false&&ball[j].x>=xCheck2 && ball[j].x<=xCheck2+5 && begin==1)
                    if (ball[j].y>=yCheck2&&ball[j].y<=yCheck2+12) {ball[j].a=-2;ball[j].b=-4;ballbounce.play();}
                    else if (ball[j].y>=yCheck2+13&&ball[j].y<=yCheck2+25) {ball[j].a=-3;ball[j].b=-3;ballbounce.play();}
                    else if (ball[j].y>=yCheck2+26&&ball[j].y<=yCheck2+39) {ball[j].a=-4;ball[j].b=-2;ballbounce.play();}
                    else if (ball[j].y>=yCheck2+40&&ball[j].y<=yCheck2+53) {ball[j].a=-4;ball[j].b=2;ballbounce.play();}
                    else if (ball[j].y>=yCheck2+54&&ball[j].y<=yCheck2+66) {ball[j].a=-3;ball[j].b=3;ballbounce.play();}
                    else if (ball[j].y>=yCheck2+67&&ball[j].y<=yCheck2+79) {ball[j].a=-2;ball[j].b=4;ballbounce.play();}
                //P3
                if(p3Dead==false&&ball[j].y>=yCheck3-5 && ball[j].y<=yCheck3 && begin==1)
                    if (ball[j].x>=xCheck3&&ball[j].x<=xCheck3+12) {ball[j].a=-4;ball[j].b=2;ballbounce.play();}
                    else if (ball[j].x>=xCheck3+13&&ball[j].x<=xCheck3+25) {ball[j].a=-3;ball[j].b=3;ballbounce.play();}
                    else if (ball[j].x>=xCheck3+26&&ball[j].x<=xCheck3+39) {ball[j].a=-2;ball[j].b=4;ballbounce.play();}
                    else if (ball[j].x>=xCheck3+40&&ball[j].x<=xCheck3+53) {ball[j].a=2;ball[j].b=4;ballbounce.play();}
                    else if (ball[j].x>=xCheck3+54&&ball[j].x<=xCheck3+66) {ball[j].a=3;ball[j].b=3;ballbounce.play();}
                    else if (ball[j].x>=xCheck3+67&&ball[j].x<=xCheck3+79) {ball[j].a=4;ball[j].b=2;ballbounce.play();}
                //P4
                if(p4Dead==false&&ball[j].y>=yCheck4 && ball[j].y<=yCheck4+5 && begin==1)
                    if (ball[j].x>=xCheck4&&ball[j].x<=xCheck4+12) {ball[j].a=-4;ball[j].b=-2;ballbounce.play();}
                    else if (ball[j].x>=xCheck4+13&&ball[j].x<=xCheck4+25) {ball[j].a=-3;ball[j].b=-3;ballbounce.play();}
                    else if (ball[j].x>=xCheck4+26&&ball[j].x<=xCheck4+39) {ball[j].a=-2;ball[j].b=-4;ballbounce.play();}
                    else if (ball[j].x>=xCheck4+40&&ball[j].x<=xCheck4+53) {ball[j].a=2;ball[j].b=-4;ballbounce.play();}
                    else if (ball[j].x>=xCheck4+54&&ball[j].x<=xCheck4+66) {ball[j].a=3;ball[j].b=-3;ballbounce.play();}
                    else if (ball[j].x>=xCheck4+67&&ball[j].x<=xCheck4+79) {ball[j].a=4;ball[j].b=-2;ballbounce.play();}
         Runnable pMovement = new Runnable()
             public void run()
                 while(moveB)
                     if(pauseB==false){
                     if (brick[0].y == 445) brick[0].y-=2; if (brick[0].y == 125) brick[0].y+=2;
                     if (brick[0].y<445&&brick[0].y>125){if (movecheck1==1){brick[0].y-=1;yCheck1 = brick[0].y;} 
                     else if (movecheck1==-1){brick[0].y+=1;yCheck1 = brick[0].y;} }
                     if (brick[1].y == 445) brick[1].y-=2; if (brick[1].y == 125) brick[1].y+=2;   
                     if (brick[1].y<445&&brick[1].y>125){if (movecheck2==1){brick[1].y-=1;yCheck2 = brick[1].y;}
                     else if (movecheck2==-1){brick[1].y+=1;yCheck2 = brick[1].y;}  }
                     if (brick[2].x == 445) brick[2].x-=2; if (brick[2].x == 125) brick[2].x+=2;   
                     if (brick[2].x<570&&brick[2].x>125){if (movecheck3==1){brick[2].x-=1;xCheck3 = brick[2].x;}
                     else if (movecheck3==-1){brick[2].x+=1;xCheck3 = brick[2].x;}  }
                     if (brick[3].x == 445) brick[3].x-=2; if (brick[3].x == 125) brick[3].x+=2;   
                     if (brick[3].x<570&&brick[3].x>0){if (movecheck4==1){brick[3].x-=1;xCheck4 = brick[3].x;}
                     else if (movecheck4==-1){brick[3].x+=1;xCheck4 = brick[3].x;}  }
                     starter();
                     try{Thread.sleep(2,500);}catch(InterruptedException e){}              
                if(pauseB){try{Thread.sleep(2,500);}catch(InterruptedException e){}}
        public void starter()
            if(starter==1)
                if(gameflag==2){p1Dead=false; p2Dead=false; p3Dead=false; p4Dead=false;}
                if(gameflag==3 || gameflag==4){p3Dead=true;p4Dead=true;}
                a1=0;b1=0;c1=0;d1=0;drawB=true;
                starttext = false;
                win=0;
                score1=10;score2=10;score3=10;score4=10;
                if(gameflag==3 || gameflag==4){score3=0;score4=0;}       
                own=1;
                prepare.play();
                try{Thread.sleep(5000);}catch(InterruptedException e){}
                time=1;
                try{Thread.sleep(1000);}catch(InterruptedException e){}
                time=2;
                try{Thread.sleep(1000);}catch(InterruptedException e){}
                time=3;
                try{Thread.sleep(1000);}catch(InterruptedException e){}
                if(gameflag==2)
                    ball[0].a=2;ball[0].b=0;
                    ball[1].a=0;ball[1].b=-2;
                if(gameflag==3 || gameflag==4)
                    ball[0].a=2;ball[0].b=0;
                    ball[1].a=-2;ball[1].b=0;
                ball[0].x = 325; ball[0].y = 325;ball[1].x = 325; ball[1].y = 325;
                pause=0;time=-5;starter=0;begin=1;
        public void run()
            while(thisB)
                if(pauseB==false)
                switch(gameflag)
                    case INIT_ACTIVE:
                        repaint();
                        gameflag = INTRO_ACTIVE;
                        try{Thread.sleep(10);}
                        catch(InterruptedException ex){break;}
                        break;
                    case INTRO_ACTIVE:             
                        physicsintro();
                        try{Thread.sleep(10);}
                        catch(InterruptedException ex){break;}
                        for(int w = 0;w<8;w++){ball2[w].x+=ball2[w].a;ball2[w].y+=ball2[w].b;}
                        repaint();
                        break;
                    case GAME1_ACTIVE:
                        if(countDead())resetter();
                        boundaries();
                        paddlephys();
                        for(int w = 0;w<2;w++){ball[w].x+=ball[w].a;ball[w].y+=ball[w].b;}                  
                        try{Thread.sleep(7,500);}catch(InterruptedException e){break;}     
                        repaint();  
                    case GAME2_ACTIVE:
                        if(countDead())resetter();
                        boundaries();
                        paddlephys();
                        for(int w = 0;w<2;w++){ball[w].x+=ball[w].a;ball[w].y+=ball[w].b;}                  
                        try{Thread.sleep(7,500);}catch(InterruptedException e){break;}     
                        repaint();  
                    case GAME3_ACTIVE:
                        if(countDead())resetter();
                        boundaries();
                        paddlephys();
                        for(int w = 0;w<2;w++){ball[w].x+=ball[w].a;ball[w].y+=ball[w].b;}                  
                        try{Thread.sleep(7,500);}catch(InterruptedException e){break;}     
                        repaint();  
                if(pauseB==true){repaint();try{Thread.sleep(7,500);}catch(InterruptedException e){}}
        public void boundaries()
            for(int z = 0; z<2;z++)
                ranB1 = (int)(Math.random() * 4);
                //P1 scores
                if(p1Dead==false && ball[z].y<525 && ball[z].y>125 && ball[z].x<2)
                    if(score1==1)humiliation.play();
                    else headshot.play();               
                    score1--;cons1++;              
                    ball[z].y=325;ball[z].x=325;
                    if(ranB1==0){ball[z].a=1;ball[z].b=1;}else if(ranB1==1){ball[z].a=-1;ball[z].b=1;}
                    else if(ranB1==2){ball[z].a=1;ball[z].b=-1;}else if(ranB1==3){ball[z].a=-1;ball[z].b=-1;}               
                    if(score1 == 0)p1Dead=true;                                                        
                //P2 scores
                else if(p2Dead==false&& ball[z].y<525 && ball[z].y>125 && ball[z].x>648)
                    if(score2==1)humiliation.play();
                    else headshot.play();
                    score2--;cons2++;     
                    ball[z].y = 325;ball[z].x=325;
                    if(ranB1==0){ball[z].a=1;ball[z].b=1;}else if(ranB1==1){ball[z].a=-1;ball[z].b=1;}
                    else if(ranB1==2){ball[z].a=1;ball[z].b=-1;}else if(ranB1==3){ball[z].a=-1;ball[z].b=-1;}
                    if(score2 == 0)p2Dead=true;
                //P3 scores
                else if(p3Dead==false&&ball[z].x<525 && ball[z].x>125 && ball[z].y<2)
                    if(score3==1)humiliation.play();
                    else headshot.play();               
                    score3--;cons3++;          
                    ball[z].y = 325; ball[z].x = 325;
                    if(ranB1==0){ball[z].a=1;ball[z].b=1;}else if(ranB1==1){ball[z].a=-1;ball[z].b=1;}
                    else if(ranB1==2){ball[z].a=1;ball[z].b=-1;}else if(ranB1==3){ball[z].a=-1;ball[z].b=-1;}
                    if(score3 == 0)p3Dead=true;
                //P4 Scores
                else if(p4Dead==false&&ball[z].x<525 && ball[z].x>125 && ball[z].y>648)
                    if(score4==1)humiliation.play();
                    else headshot.play();
                    score4--;cons4++;            
                    ball[z].y = 325; ball[z].x = 325;
                    if(ranB1==0){ball[z].a=1;ball[z].b=1;}else if(ranB1==1){ball[z].a=-1;ball[z].b=1;}
                    else if(ranB1==2){ball[z].a=1;ball[z].b=-1;}else if(ranB1==3){ball[z].a=-1;ball[z].b=-1;}
                    if(score4 == 0)p4Dead=true;
                if((p1Dead==true && ball[z].y<525 && ball[z].y>125 && ball[z].x<2) || (gameflag==3 || gameflag == 4))
                    ballbounce.play();ball[z].a*=-1;
                else if((p2Dead==true && ball[z].y<525 && ball[z].y>125 && ball[z].x>648) || (gameflag==3 || gameflag == 4))
                    ballbounce.play();ball[z].a*=-1;
                else if((p3Dead==true &&ball[z].x<525 && ball[z].x>125 && ball[z].y<2) || (gameflag==3 || gameflag == 4))
                    ballbounce.play();ball[z].b*=-1;
                else if((p4Dead==true &&ball[z].x<525 && ball[z].x>125 && ball[z].y>648) || (gameflag==3 || gameflag == 4))
                    ballbounce.play();ball[z].b*=-1;
                if(poly1.contains(ball[z].x,ball[z].y))
                    ballbounce.play();
                    if(ranB1 == 0){ball[z].a=1;ball[z].b=5;}else if(ranB1 == 1){ball[z].a=2;ball[z].b=4;}
                    else if(ranB1 == 2){ball[z].a=5;ball[z].b=1;}else if(ranB1 == 3){ball[z].a=4;ball[z].b=2;}
                else if(poly2.contains(ball[z].x,ball[z].y))
                    ballbounce.play();
                    if(ranB1 == 0){ball[z].a=1;ball[z].b=-5;}else if(ranB1 == 1){ball[z].a=2;ball[z].b=-4;}
                    else if(ranB1 == 2){ball[z].a=5;ball[z].b=-1;}else if(ranB1 == 3){ball[z].a=4;ball[z].b=-2;}
                else if(poly3.contains(ball[z].x,ball[z].y))
                    ballbounce.play();
                    if(ranB1 == 0){ball[z].a=-1;ball[z].b=5;}else if(ranB1 == 1){ball[z].a=-2;ball[z].b=4;}
                    else if(ranB1 == 2){ball[z].a=-5;ball[z].b=1;}else if(ranB1 == 3){ball[z].a=-4;ball[z].b=2;}
                else if(poly4.contains(ball[z].x,ball[z].y))
                    ballbounce.play();
                    if(ranB1 == 0){ball[z].a=-1;ball[z].b=-5;}else if(ranB1 == 1){ball[z].a=-2;ball[z].b=-4;}
                    else if(ranB1 == 2){ball[z].a=-5;ball[z].b=-1;}else if(ranB1 == 3){ball[z].a=-4;ball[z].b=-2;}
        public void resetter()
            brick[0].x=25;brick[0].y=285;brick[1].x=615;brick[1].y=285;brick[2].x=285;brick[2].y=25;brick[3].x=285;brick[3].y=615;
            if(p4Dead==true && p3Dead==true && p2Dead==true && p1Dead==false){ball[0].x = 325;ball[0].y = 325;ball[1].x = 325;ball[1].y = 325;
                ball[0].a=0;ball[0].b=0;ball[1].a=0;ball[1].b=0;drawB=false;match.play();pause=5;p1Dead=true;begin=0;win=1;winner=1;stringWin="Player 1 Wins";}
            else if(p4Dead==true && p3Dead==true && p2Dead==false && p1Dead==true){ball[0].x = 325;ball[0].y = 325;ball[1].x = 325;ball[1].y = 325;
                ball[0].a=0;ball[0].b=0;ball[1].a=0;ball[1].b=0;drawB=false;match.play();pause=5;p2Dead=true;begin=0;win=1;winner=2;stringWin="Player 2 Wins";}
            else if(p4Dead==true && p3Dead==false && p2Dead==true && p1Dead==true){ball[0].x = 325;ball[0].y = 325;ball[1].x = 325;ball[1].y = 325;
                ball[0].a=0;ball[0].b=0;ball[1].a=0;ball[1].b=0;drawB=false;match.play();pause=5;p3Dead=true;begin=0;win=1;winner=3;stringWin="Player 3 Wins";}
            else if(p4Dead==false && p3Dead==true && p2Dead==true && p1Dead==true){ball[0].x = 325;ball[0].y = 325;ball[1].x = 325;ball[1].y = 325;
                ball[0].a=0;ball[0].b=0;ball[1].a=0;ball[1].b=0;drawB=false;match.play();pause=5;p4Dead=true;begin=0;win=1;winner=4;stringWin="Player 4 Wins";}       
        public boolean countDead()
            if(gameflag==2)
                if(p4Dead==true)a1=1;if(p3Dead==true)b1=1;if(p2Dead==true)c1=1;if(p1Dead==true)d1=1;
                dead = a1 + b1 + c1 + d1;
                if(dead>2)return true;
                else return false;
            if(gameflag==3 || gameflag==4)
                if(p2Dead==true)c1=1;if(p1Dead==true)d1=1;
                dead = c1 + d1;
                if(dead==1) return true;
                else return false;
            return false;
        public void physicsintro()
            for(int aw = 0;aw<8;aw++)
                if(ball2[aw].x >645 || ball2[aw].x < 5)ball2[aw].a *= -1;
                if(ball2[aw].y > 720 || ball2[aw].y <5)ball2[aw].b *= -1;
        public void mouseExited(MouseEvent e){}
        public void mouseEntered(MouseEvent e){}
        public void mouseReleased(MouseEvent e){}
        public void mousePressed(MouseEvent e){}
        public void mouseClicked(MouseEvent e) 
                // resume
                if(pause==1 && e.getX()>=270 && e.getX()<= 360 && e.getY()>=650)
                    pauseB=false;pause=0;
                // pause
                else if(pause==0 && e.getX()>=270 && e.getX()<= 360 && e.getY()>=650)
                   pauseB=true;pause=1;             
                //start
                else if(begin == 0 && e.getX()>=270 && e.getX()<= 360 && e.getY()>=650)
                    starter = 1;              
        public void mouseMoved(MouseEvent e)
            //gui light up
            if(e.getX()>=270 && e.getX()<= 360 && e.getY()>=650){Color1 = new Color(255,255,255);}
            else{Color1 = new Color(0,0,0);}         
            repaint();
        public void mouseDragged(MouseEvent e){}
        public void keyTyped(KeyEvent e){}
        public void keyPressed(KeyEvent e)
            c = e.getKeyCode();
            if(gameflag==2 || gameflag==3)
            switch(c)
                case KeyEvent.VK_1:
                movecheck1 = 1;break;
                case KeyEvent.VK_2:
                movecheck1 = -1;break;           
                case KeyEvent.VK_V:
                movecheck2 = 1;break;
                case KeyEvent.VK_B:
                movecheck2 = -1;break;
                case KeyEvent.VK_K:
                movecheck3 = 1;break;
                case KeyEvent.VK_L:
                movecheck3 = -1;break;
                case KeyEvent.VK_LEFT:
                movecheck4 = 1;break;
                case KeyEvent.VK_DOWN:
                movecheck4 = -1;break;
            if(gameflag==1)
            switch(c)
                case KeyEvent.VK_UP:
                if(colorChange==0)colorChange=2;
                else if(colorChange==1)colorChange=0;
                else if(colorChange==2)colorChange=1;break;
                case KeyEvent.VK_DOWN:
                if(colorChange==0)colorChange=1;
                else if(colorChange==1)colorChange=2;
                else if(colorChange==2)colorChange=0;break;
                case KeyEvent.VK_ENTER:
                if(colorChange==0)gameflag=2;
                if(colorChange==1)gameflag=3;
                if(colorChange==2)gameflag=4;
                 break;
        public void keyReleased(KeyEvent e)
            c = e.getKeyCode();
            if (gameflag==2 || gameflag==3)
            switch(c)
                case KeyEvent.VK_1:
                movecheck1 = 0;break;
                case KeyEvent.VK_2:
                movecheck1 = 0;break;
                case KeyEvent.VK_V:
                movecheck2 = 0;break;
                case KeyEvent.VK_B:
                movecheck2 = 0;break;
                case KeyEvent.VK_K:
                movecheck3 = 0;break;
                case KeyEvent.VK_L:
                movecheck3 = 0;break;
                case KeyEvent.VK_LEFT:
                movecheck4 = 0;break;
                case KeyEvent.VK_DOWN:
                movecheck4 = 0;break;
    {co                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  

    Japplet is Swing. Your double buffering code is unneccessary. And you are painting wrong. You should be using paintComponent and not paint. And throw away the
    buffered image and update while you are at it.

  • How to draw a point without double buffering?

    Hello all,
    I am drawing points as small red circles, but they are a bit ugly without double buffering. Am I able to draw the points to be nice? I mean not to draw them as just circles, but some special circle with light border that will looks much more nicer?
    Or what radius and position of the circle must be to be a nice small circle containing only 5 pixels? (upper, lower, right, left, middle)
    ps - they are ugly in the way of having a strange dot on the left side

    I use this method:
        private static final float POINT_RADIUS = 2f;
        private static final float POINT_DIAMETER = POINT_RADIUS * 2;
    private void drawPoint(float x, float y, Color c) {
            Ellipse2D point = new Ellipse2D.Float(x - POINT_RADIUS, -y
                    - POINT_RADIUS, POINT_DIAMETER, POINT_DIAMETER);
            graphics.setStroke(new BasicStroke(0.2f));
            graphics.fill(point);
    // and points looks like this:
       ***

  • Alternative to Double-Buffered Canvas

    I am working on a program in which I use a double-buffered Canvas inside a JScrollPane. The problem is that the Canvas draws over the scrollbars. I have tried extending JComponent, JPanel, JApplet, and Component instead of Canvas, and none of them are double buffered. Here is the code I used to debug this problem:
    import java.awt.*;
    import java.awt.geom.*;
    import java.awt.image.*;
    import javax.swing.*;
    public class Test implements  Runnable
         JFrame f;
         JScrollPane scroller;
         JPanel panel;
         TestCanvas canvas;
         Thread runner;
         BufferStrategy strategy;
         public static void main (String[] args) {
              Test app = new Test();
              app.init();
         public void init() {
              f = new JFrame();
              f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              panel = new JPanel();
              canvas = new TestCanvas();
              panel.add(canvas);
              scroller = new JScrollPane(panel);
              scroller.setWheelScrollingEnabled(true);
              f.getContentPane().add(scroller);
              f.pack();
              f.setSize(300,300);
              f.setVisible(true);
              canvas.createBufferStrategy(2);
              strategy = canvas.getBufferStrategy();
              runner = new Thread(this);
              runner.run();
         public void run() {
              int x = 0;
              while(x != 65536) {
                   Graphics2D g = (Graphics2D)strategy.getDrawGraphics().create();
                   g.setColor(new Color(x%256,0,0));
                   g.fill(new Ellipse2D.Double(0,0,600,600));
                   strategy.show();
                   x++;
    }Any suggestions?

    The main culprit is that you are mixing AWT components with Swing ones.
    In addition, your are doing so many of useless things and wrong things in your code.
    Swing components are defaulted for using double-buffering.
    See: http://java.sun.com/products/jfc/tsc/articles/painting/index.html
    Try and study this code.
    import java.awt.*;
    import java.awt.event.*;
    import java.awt.geom.*;
    import java.awt.image.*;
    import javax.swing.*;
    public class Fox1229{
      JFrame f;
      JScrollPane scroller;
      TestCanvas canvas;
      int x;
      Timer t;
      public static void main (String[] args) {
        Fox1229 app = new Fox1229();
        app.init();
      public void init() {
        x = 0;
        f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        canvas = new TestCanvas();
        scroller = new JScrollPane(canvas);
        scroller.setWheelScrollingEnabled(true);
        f.getContentPane().add(scroller, BorderLayout.CENTER);
        f.setSize(300, 300);
        f.setVisible(true);
        t = new Timer(50, new ActionListener(){
          public void actionPerformed(ActionEvent e){
            canvas.setOc(new Color(x % 256, 0, 0));
            canvas.repaint();
            if (++x == 1024){
              t.stop();
        t.start();
    class TestCanvas extends JPanel{
      Color oc;
      public TestCanvas (){
        oc = new Color(0, 0, 0);
      public void setOc(Color c){
        oc = c;
      public Dimension getPreferredSize(){
        return new Dimension(600, 600);
      public void paintComponent(Graphics g){
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D)g;
        g2d.setColor(Color.blue);
        g2d.fill(new Rectangle(0, 0, 600, 600));
        g2d.setColor(oc);
        g2d.fill(new Ellipse2D.Double(0, 0, 600, 600));
    }

  • Using 6533 DIO32HS, is it possible to use double buffered output with varying pauses?

    I'm using Level-Ack handshaking to transmit data. Currently, I'm hooked up to a loop-back on the DIO32HS card.
    If I don't use double-buffering, I end up with pauses in data transmission, so I need to use double buffering. Unfortunately, I can't seem to set up a delay in the middle of a double buffered scheme.
    What I need to do is this:
    Transmit 64 packets of data (16 bits each) on group 2 / Receive 64 packets of data (16 bits each) on group 1
    Delay for .2 ms
    Transmit the same packets again / receive
    The delay in the middle will need to be varied, from .2 to 20 ms.
    I'm programming in Visual C++ 6.0 under Windows 2000, with (as suggested above) group1 c
    onfigured as input (DIOA and DIOB) and group2 set up as output (DIOC and DIOD). Due to the speed of transmission (256kHz) and the small size of the data set, the program I wrote, no matter how tight I try to make it, cannot insert the proper delay and start the next send on time.
    Does anyone have any idea if such a pause is possible? Anyone know how to do it, or any suggestions on what to try?
    Thanks!

    .2 ms is a very small time delay to use in software. Windows usually isn't more accurate than about 10 or 20 ms. If you need to have small, precise delays you could either use a real time OS, like pharlap and LabVIEW RT, or use extra hardware to generate the delays correctly.
    I would recommend using a separate MIO or counter/timer board (like a 660x) to generate timing pulses for the DIO32HS. This gives you precise timing control at high speed. If the 32HS is in Level ACK Mode, it will respond to external ACK and REQ signals. This is covered in more detail on page 5-10 of the PCI-DIO32HS User Manual.

  • Double buffering && repaint

    Hi there,
    I have a frame F that contains two panels P1 and P2.
    P1 uses double buffering for drawing circles and lines.
    P2 has buttons and a JList.
    When i click on a JList to have popup menu
    or when i move the frame F on the screen
    the panel P2 lost some of JList drawing.
    Actually i iconify the frame in order to oblige
    JVM to do repaint.
    How can i resolve this problem please.

    Do not ever mix heavyweight and lightweight, or else
    you won't be able to set up the correct zorder.But when i iconfiy and desiconify my frame Java
    repaint correctly.
    I need a nice tip article of how to simulate
    desiconify repainting process.
    Thabk u

Maybe you are looking for

  • Is it possible to view attachments in calendar?

    Is it possible to view attachments on an iphone when using the calendar?

  • How does one assign a user to several groups?

    I am a student learning Databases, Oracle to be exact, and am trying to install a developer's copy on my MAC G4 running OS X 10.4.11. To do this I need to assign user oracle to several user groups. Trouble is, although I know UNIX fairly well I don't

  • Query for Tables used in a Schema

    I need to know that how many tables in the schema has been used by Proceudres/Functions, Packages Triggers etc. Please give me the query if someone has it. Thanks and Regards, Kapil Uppal

  • Extending RAID file system with larger disk

    Hi, I have a Mac pro running 10.7.5.    I used to have two 1TB disks in the internal bays configured as a raid 1 set with a single 1TB file system.  One of the disks failed and I replaced it with a 2TB disk which seems to be working ok.   However, I'

  • Win 7 Crashes with Beta Drivers and Sound pack 2.0

    ? Hello Folks! Just updated to Win 7 Ultimate x86, build 7600. Unfortunately I have no sound at all. I installed the Beta Driver released by Creative on July and it freezes my computer during the driver install.. and freezes the boot up process when