java - JFrame, leaves trail of rectangle -


i'm trying create game. , everytime move, it's leaving trail

code:

package lt.mchackers.gametest.main; import java.awt.color; import java.awt.graphics; import java.awt.insets; import java.awt.event.keyevent; import java.awt.image.bufferedimage; import java.io.bufferedreader; import java.io.file; import java.io.filenotfoundexception; import java.io.filereader; import java.io.ioexception;  import javax.imageio.imageio; import javax.swing.jframe;  import lt.mchackers.gametest.handlers.inputhandler;  /**   * main class game   */  public class main extends jframe  {         private static final long serialversionuid = -828018325337767157l;         boolean isrunning = true;          int fps = 30;          int windowwidth = 320;          int windowheight = 320;         int speed;          bufferedimage backbuffer;          insets insets;          inputhandler input;           int x = 0;         int y = 0;         int xa = 0;         int ya = 0;         coordinates coords = new coordinates(0, 0);          public static void main(string[] args)          {       main game = new main();                  game.run();                  system.exit(0);          }           /**           * method starts game , runs in loop           */          public void run()          {                  initialize();                   while(isrunning)                  {                           long time = system.currenttimemillis();                           update();                          draw();                           //  delay each frame  -   time took 1 frame                          time = (1000 / fps) - (system.currenttimemillis() - time);                           if (time > 0)                          {                                  try                                  {                                          thread.sleep(time);                                  }                                  catch(exception e){}                          }                  }                   setvisible(false);          }           /**           * method set need game run           */          void initialize()          {                  settitle("game tutorial");                  setsize(windowwidth, windowheight);                  setresizable(false);                  setdefaultcloseoperation(exit_on_close);                  setvisible(true);                   insets = getinsets();                  setsize(insets.left + windowwidth + insets.right,                                  insets.top + windowheight + insets.bottom);                   backbuffer = new bufferedimage(windowwidth, windowheight, bufferedimage.type_int_rgb);                  input = new inputhandler(this);                  graphics bbg = backbuffer.getgraphics();                  bufferedreader reader = null;                 try {                     reader = new bufferedreader(new filereader("map"));                 } catch (filenotfoundexception e1) {                     e1.printstacktrace();                 }                 string line = null;                 try {                     bufferedimage gray = imageio.read(new file("gray.png"));                     bufferedimage black = imageio.read(new file("black.png"));                     while ((line = reader.readline()) != null) {                         for(string s : line.split(""))                         {                             if (s.contains("*"))                             {                                 bbg.drawimage(gray, xa-32, ya, null);                             }                             else if (s.contains("#"))                             {                                 bbg.drawimage(black, xa-32, ya, null);                             }                             if (xa < 320)                             {                                 xa += 32;                             }                             else                             {                                 ya += 32;                                 xa = 0;                             }                             system.out.println(xa);                             system.out.println(ya);                         }                     }                 } catch (ioexception e) {                     e.printstacktrace();                 }          }           /**           * method check input, move things           * around , check win conditions, etc           */          void update()          {              if (input.iskeydown(keyevent.vk_numpad0))             {                 speed -= 1;             }             if (input.iskeydown(keyevent.vk_numpad1))             {                 speed += 1;             }             if (input.iskeydown(keyevent.vk_right))              {                  coords.setcoords(coords.getx() + 32, coords.gety());              }              if (input.iskeydown(keyevent.vk_left))              {                  coords.setcoords(coords.getx() - 32, coords.gety());              }              if (input.iskeydown(keyevent.vk_up))             {                 coords.setcoords(coords.getx(), coords.gety() - 32);              }             if (input.iskeydown(keyevent.vk_down))             {                 coords.setcoords(coords.getx(), coords.gety() + 32);              }             //system.out.println(x);             //system.out.println(y);             //system.out.println(speed);             if (coords.gety() < 0)             {                 coords.setcoords(coords.getx(), 0);             }             if (coords.getx() < 0)             {                 coords.setcoords(0, coords.gety());             }             if (coords.getx() > windowwidth - 32)             {                    coords.setcoords(windowwidth - 32, coords.gety());             }             if (coords.gety() > windowheight - 32)             {                 coords.setcoords(coords.getx(), windowheight - 32);              //  y = windowheight - 32;             }          }           /**           * method draw           */          void draw()          {                                graphics g = getgraphics();                  //this.setbackground(color.black);                 //super.paintcomponents(g);                 backbuffer.setrgb(x, y, color.black.getrgb());                  graphics bbg = backbuffer.getgraphics();                   bufferedreader reader = null;                 try {                     reader = new bufferedreader(new filereader("map"));                 } catch (filenotfoundexception e1) {                     e1.printstacktrace();                 }                 string line = null;                 try {                     bufferedimage gray = imageio.read(new file("gray.png"));                     bufferedimage black = imageio.read(new file("black.png"));                     while ((line = reader.readline()) != null) {                         for(string s : line.split(""))                         {                             if (s.contains("*") && xa + 32!= coords.getx() && ya - 32 != coords.gety())                             {                                 bbg.drawimage(gray, xa-32, ya, null);                             }                             else if (s.contains("#") && xa + 32 != coords.getx() && ya - 32 != coords.gety())                             {                                 bbg.drawimage(black, xa-32, ya, null);                             }                             if (xa < 320)                             {                                 xa += 32;                             }                             else                             {                                 ya += 32;                                 xa = 0;                             }                             //system.out.println(xa);                             //system.out.println(ya);                         }                     }                 } catch (ioexception e) {                     e.printstacktrace();                 }                 bbg.setcolor(color.white);                   xa = 0;                 ya = 0;                 system.out.println(coords.getx());                 bbg.setcolor(color.white);                 bbg.fillrect(coords.getx(),coords.gety(), 32,32);                   system.out.println(coords.gety());                 //bbg.setcolor(color.black);                  //bbg.drawoval(x, y, 20, 20);                    g.drawimage(backbuffer, insets.left, insets.top, this);          }  } 

thanks help.

check out code here, hint how paint stuff in game loop properly.

basically need take care of double buffering prevent flickering , repainting background don't leave out trail of rectangles.

you can check out killer game programming in java online book, can learn game programming concepts , implementation.

the concept of double buffering simple. since painting on screen takes more time updating states of objects in gameplay, use 2 canvas prevent flickering issues arise when objects painted directly on screen.

when object states updated in game loop, rendered in background canvas. background canvas copied screen takes less time compared painting directly on screen. , while copying happening, object states updated again , rendered on background canvas again, copied screen. repeat on , over, , double buffering.
keep buffer of screen painted , game renders objects in buffer copied screen.

here's code think might understand concept:

import java.awt.color; import java.awt.dimension; import java.awt.font; import java.awt.graphics; import java.awt.image; import java.awt.toolkit; import java.awt.event.keyadapter; import java.awt.event.keyevent;  public class gamepanel extends jpanel implements runnable {   private static final long serialversionuid = 6892533030374996243l;   public static final int width = 800;   public static final int height = 600;    private thread animator;    private volatile boolean running = false;   private volatile boolean isgameover = false;   private volatile boolean isuserpaused = false;   private volatile boolean iswindowpaused = false;    private graphics dbg;   private image dbimage = null;    private static final int no_delays_per_yield = 16;   private static final int max_frame_skips = 5;    private static final color backgroundcolor = new color(245, 245, 245);    private static long fps = 30;   private static long period = 1000000l * (long) 1000.0 / fps;    private static volatile boolean ispainted = false;    public gamepanel()   {     setbackground(backgroundcolor);     setpreferredsize(new dimension(width, height));      setfocusable(true);     requestfocus();     readyforpause();      // add key listeners here...   }    public void addnotify()   {     super.addnotify();     startgame();   }    void startgame()   {     if (animator == null || !running)     {       animator = new thread(this);       animator.start();     }   }    void stopgame()   {     running = false;   }    private void readyforpause()   {     addkeylistener(new keyadapter()     {       public void keypressed(keyevent e)       {         int keycode = e.getkeycode();         if ((keycode == keyevent.vk_escape) || (keycode == keyevent.vk_q)             || (keycode == keyevent.vk_end) || (keycode == keyevent.vk_p)             || ((keycode == keyevent.vk_c) && e.iscontroldown()))         {           if (!isuserpaused)             setuserpaused(true);           else             setuserpaused(false);         }       }     });   }    // game loop. can copy-paste in own code if want to.   public void run()   {     long beforetime, aftertime, timediff, sleeptime;     long oversleeptime = 0l;     int nodelays = 0;     long excess = 0l;      beforetime = system.nanotime();      running = true;      while (running)     {       requestfocus();       gameupdate();       gamerender();       paintscreen();        aftertime = system.nanotime();        timediff = aftertime - beforetime;       sleeptime = (period - timediff) - oversleeptime;        if (sleeptime > 0)       {         try         {           thread.sleep(sleeptime / 1000000l);         }         catch (interruptedexception e)         {         }          oversleeptime = (system.nanotime() - aftertime - sleeptime);       }       else       {         excess -= sleeptime;         oversleeptime = 0l;          if (++nodelays >= no_delays_per_yield)         {           thread.yield();           nodelays = 0;         }       }        beforetime = system.nanotime();        int skips = 0;        while ((excess > period) && (skips < max_frame_skips))       {         excess -= period;         gameupdate();         skips++;       }        ispainted = true;     }     system.exit(0);   }    private void gameupdate()   {     if (!isuserpaused && !iswindowpaused && !isgameover)     {       // update state of game objects here...     }   }    private void gamerender()   {     if (dbimage == null)     {       dbimage = createimage(width, height);       if (dbimage == null)       {         system.out.println("image null.");         return;       }       else         dbg = dbimage.getgraphics();     }      dbg.setcolor(backgroundcolor);     dbg.fillrect(0, 0, width, height);      // render game objects here....     // like: xyzobject.draw(dbg);     // or dbg.drawoval(...);      if (isgameover)       gameovermessage(dbg);   }    private void gameovermessage(graphics g)   {     // paint game on message here..   }    private void paintscreen()   {     graphics g;      try     {       g = this.getgraphics();       if ((g != null) && (dbimage != null))         g.drawimage(dbimage, 0, 0, null);       toolkit.getdefaulttoolkit().sync();       g.dispose();     }     catch (exception e)     {       system.out.println("graphics context error : " + e);     }   }    public void setwindowpaused(boolean ispaused)   {     iswindowpaused = ispaused;   }    public void setuserpaused(boolean ispaused)   {     isuserpaused = ispaused;   } } 

then can add game panel jframe following:

import java.awt.gridbaglayout; import java.awt.event.windowadapter; import java.awt.event.windowevent;  import javax.swing.jframe;  public class gameframe extends jframe {   private static final long serialversionuid = -1624735497099558420l;   private gameframe gamepanel = new gamepanel();    public gameframe()   {     setdefaultcloseoperation(jframe.exit_on_close);     settitle("game");      addwindowlistener(new framelistener());      getcontentpane().setlayout(new gridbaglayout());     getcontentpane().add(gamepanel);      pack();     setlocationrelativeto(null);     setresizable(false);     setvisible(true);   }    public class framelistener extends windowadapter   {     public void windowactivated(windowevent we)     {       gamepanel.setwindowpaused(false);     }      public void windowdeactivated(windowevent we)     {       gamepanel.setwindowpaused(true);     }      public void windowdeiconified(windowevent we)     {       gamepanel.setwindowpaused(false);     }      public void windowiconified(windowevent we)     {       gamepanel.setwindowpaused(true);     }      public void windowclosing(windowevent we)     {       gamepanel.stopgame();     }   }    public static void main(string args[])   {     new gameframe();   } } 

Comments

Popular posts from this blog

android - Get AccessToken using signpost OAuth without opening a browser (Two legged Oauth) -

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: mockito -

google shop client API returns 400 bad request error while adding an item -