java - Component.setBounds invoking Component.repaint? -


so i'm making game , have enemyai player , both extend jpanel. world has null layout, i'm using setbounds(); "move" (i move world image) entities (player , ai) around , position them properly. when add (what seems like, tested smallest number possible) 5, invokes repaint() on it's own. causes player visually walking in place. more entities add, faster interval gets (i.e. 5 entities invokes repaint() lot slower 500 does).

note: window in below class jframe.

main class:

public class game(){ public static boolean fighting = false; public static void startgame(){     worldpanel game = new worldpanel();     game.setpreferredsize(new dimension(window.getwidth(), window.getheight()));     playerpane player = new playerpane(32,32, "player 1");     game.addkeylistener(new keylistener(){          public void keypressed(keyevent arg0) {             if(fighting == false){                 move(player, game, arg0.isshiftdown(), arg0.getkeycode());             } else {                 system.out.println("fighting = " + fighting);             }         }         @override         public void keyreleased(keyevent arg0) {                 gametimer.stop();             player.setindex(0);             game.repaint();         }         @override         public void keytyped(keyevent arg0) {         }     });     window.add(game);     game.setlayout(null);     game.requestfocus();     setimages(player, player_down);     player.setdrawy(349);     player.setdrawx(493);     player.updatebounds();     game.add(player);     entities.add(player);     addentities(game);     redowindow(); } public static void updateentitybounds(){     playerpane player = null;     enemyai enemy = null;     for(int = 0; < entities.size(); i++){         if(i == 0){             player = (playerpane) entities.get(i);         } else {             enemy = (enemyai) entities.get(i);             if(enemy.getbounds().intersects(player.getbounds())){                 startfight(i);             }         }         if(player != null){             player.updatebounds();         }         if(enemy != null){             enemy.updatebounds();         }     } } public static void addentities(worldpanel game){     enemyai enemies[] = new enemyai[5];     for(int = 0; < enemies.length; i++){         if(i%6 == 0){             try{                 enemies[i] = new enemyai(32,32, imageio.read(new file("h:\\java\\game\\src\\res\\slimelv3still.png")));                 enemies[i].start();             }catch(ioexception e){                 e.printstacktrace();             }         }else if (i % 2 == 0){             try{                 enemies[i] = new enemyai(32,32, imageio.read(new file("h:\\java\\game\\src\\res\\slimelv2still.png")));                 enemies[i].setenx(enemies[i].getrandomx());                 enemies[i].seteny(enemies[i].getrandomy());                 enemies[i].start();             }catch(ioexception e){                 e.printstacktrace();             }         } else {             try{                 enemies[i] = new enemyai(32,32, imageio.read(new file("h:\\java\\game\\src\\res\\slimelv1still.png")));                 enemies[i].setenx(enemies[i].getrandomx());                 enemies[i].seteny(enemies[i].getrandomy());                 enemies[i].start();             }catch(ioexception e){                 e.printstacktrace();             }         }         game.add(enemies[i]);         entities.add(enemies[i]);     } }     public static void move(playerpane player, worldpanel game, boolean shiftdown, int keypressed){      gametimer = new timer(50, new actionlistener(){         public void actionperformed(actionevent e){             updateentitybounds();             redowindow();             gametimer.stop();         }     });     if(gametimer.isrepeats()){         gametimer.setrepeats(false);     }         if(shiftdown){             if(keypressed == keyevent.vk_w && ((game.getimagey() == 0 && player.getdrawy() > 10) || player.getdrawy() >= 349)){                 player.setdrawy(player.getdrawy() - 2);                 setimages(player, player_up);                 gametimer.start();             } else             if(keypressed == keyevent.vk_s && ((game.getimagey() == -3868 && player.getdrawy() < 681) || player.getdrawy() <= 349)){                 player.setdrawy(player.getdrawy() + 2);                 setimages(player, player_down);                 gametimer.start();             } else             if(keypressed == keyevent.vk_a && ((game.getimagex() == 0 && player.getdrawx() > 10) || player.getdrawx() > 493 )){                 player.setdrawx(player.getdrawx() - 2);                 setimages(player, player_left);                 gametimer.start();             } else             if(keypressed == keyevent.vk_d && ((game.getimagex() == -5126 && player.getdrawx() < player.getheight() - 10) || player.getdrawx() < 493 )){                 player.setdrawx(player.getdrawx() + 2);                 setimages(player, player_right);                 gametimer.start();             } else             if(keypressed == keyevent.vk_w && game.getimagey() < 0){                 if(game.getimagey() == -1){                     game.setimagey(game.getimagey() + 1);                 } else {                     game.setimagey(game.getimagey() + 2);                 }                 for(int = 1; < entities.size(); i++){                     enemyai enemy = (enemyai)entities.get(i);                     enemy.seteny(enemy.geteny() + 2);                 }                 setimages(player, player_up);                 gametimer.start();             } else             if(keypressed == keyevent.vk_a && game.getimagex() < 0){                 if(game.getimagex() == -1){                     game.setimagex(game.getimagex() + 1);                 } else {                     game.setimagex(game.getimagex() + 2);                 }                 for(int = 1; < entities.size(); i++){                     enemyai enemy = (enemyai)entities.get(i);                     enemy.setenx(enemy.getenx() + 2);                 }                 setimages(player, player_left);                 gametimer.start();             } else             if(keypressed == keyevent.vk_s && game.getimagey() > -3868){                 if(game.getimagey() == -3867){                     game.setimagey(game.getimagey() - 1);                 } else {                     game.setimagey(game.getimagey() - 2);                 }                 for(int = 1; < entities.size(); i++){                     enemyai enemy = (enemyai)entities.get(i);                     enemy.seteny(enemy.geteny() - 2);                 }                 setimages(player, player_down);                 gametimer.start();             } else             if(keypressed == keyevent.vk_d && game.getimagex() > -5126){                 if(game.getimagex() == -5125){                     game.setimagex(game.getimagex() - 1);                 } else {                     game.setimagex(game.getimagex() - 2);                 }                 for(int = 1; < entities.size(); i++){                     enemyai enemy = (enemyai)entities.get(i);                     enemy.setenx(enemy.getenx() - 2);                 }                 setimages(player, player_right);                 gametimer.start();              }         } else {             if(keypressed == keyevent.vk_w && ((game.getimagey() == 0 && player.getdrawy() > 10) || player.getdrawy() > 349)){                 player.setdrawy(player.getdrawy() - 1);                 setimages(player, player_up);                 gametimer.start();             } else             if(keypressed == keyevent.vk_s && ((game.getimagey() == -3868 && player.getdrawy() < 681) || player.getdrawy() < 349)){                 player.setdrawy(player.getdrawy() + 1);                 setimages(player, player_down);                 gametimer.start();             } else             if(keypressed == keyevent.vk_a && ((game.getimagex() == 0 && player.getdrawx() > 10) || player.getdrawx() > 493 )){                 player.setdrawx(player.getdrawx() - 1);                 setimages(player, player_left);                 gametimer.start();             } else             if(keypressed == keyevent.vk_d && ((game.getimagex() == -5126 && player.getdrawx() < player.getheight() - 10) || player.getdrawx() < 493 )){                 player.setdrawx(player.getdrawx() + 1);                 setimages(player, player_right);                 gametimer.start();             } else                 if(keypressed == keyevent.vk_w && game.getimagey() < 0){                 game.setimagey(game.getimagey() + 1);                 setimages(player, player_up);                 for(int = 1; < entities.size(); i++){                     enemyai enemy = (enemyai)entities.get(i);                     enemy.seteny(enemy.geteny() + 1);                 }                 gametimer.start();             } else             if(keypressed == keyevent.vk_a && game.getimagex() < 0){                 game.setimagex(game.getimagex() + 1);                 setimages(player, player_left);                 for(int = 1; < entities.size(); i++){                     enemyai enemy = (enemyai)entities.get(i);                     enemy.setenx(enemy.getenx() + 1);                 }                 gametimer.start();              } else             if(keypressed == keyevent.vk_s && game.getimagey() > -3868){                 game.setimagey(game.getimagey() - 1);                 setimages(player, player_down);                 for(int = 1; < entities.size(); i++){                     enemyai enemy = (enemyai)entities.get(i);                     enemy.seteny(enemy.geteny() - 1);                 }                 gametimer.start();                                           } else             if(keypressed == keyevent.vk_d && game.getimagex() > -5126){                 game.setimagex(game.getimagex() - 1);                 setimages(player, player_right);                 for(int = 1; < entities.size(); i++){                     enemyai enemy = (enemyai)entities.get(i);                     enemy.setenx(enemy.getenx() - 1);                 }                 gametimer.start();             }         }     } } 

player:

public class playerpane extends jpanel{     private static final long serialversionuid = 8946273935579723365l;     private imageicon images[] = new imageicon[9];     public static final int player_frames = 9;     private string name;     private int index;     private int imagex, imagey;     private int hp = 100;        public playerpane(int width, int height, string playername) {             setpreferredsize(new dimension(width, height));             imagex = imagey = 0;             name = playername;         //      border border = borderfactory.createbevelborder(bevelborder.raised);         //      playerpane.this.setborder(border);         }         public string getname(){             return name;         }         public void paintcomponent(graphics g){             try {                 g.drawimage(imageio.read(new file("h:\\java\\game\\src\\res\\transparentimg.png")),0,0,getwidth(),getheight(), null);             } catch (ioexception e) {                 e.printstacktrace();             }                 g.drawimage(images[index].getimage(), 0,0, null);              if(index == images.length-1){                 index = 0;             } else {                 index++;             }         }         public void setindex(int index){             this.index = index;         }         public void stop(){             index = 0;         }         public void addimage(imageicon image, int x){             images[x] = image;         }         public void setdrawx(int x){             imagex = x;         }         public void setdrawy(int y){             imagey = y;         }         public int getdrawy(){             return imagey;         }         public int getdrawx(){             return imagex;         }         public void updatebounds(){             setbounds(imagex, imagey, 32,32);         }         public int gethp(){                 return hp;             }             public void sethp(int hp){                 hp = hp;             }         } 

enemyai class:

public class enemyai extends ai{     private static final long serialversionuid = -2417438750134536982l;      private rectangle rect;     private bufferedimage backgroundimg;     private int hp = 1;     private int damage = 15;      public enemyai(int width, int height, bufferedimage backgroundimg){         super();         rect = new rectangle(width, height);         this.backgroundimg = backgroundimg;     }     @override     public void paintcomponent(graphics g) {         try{             g.drawimage(imageio.read(new file("h:\\java\\game\\src\\res\\transparentimg.png")), 0,0,null);         }catch(ioexception e){             e.printstacktrace();         }          g.drawimage(backgroundimg, 0, 0, null);     }     public boolean intersects(rectangle r){         return rect.intersects(r);     }     public int getrandomx(){         random ran = new random();         int rand = ran.nextint(6144);         return rand;     }     public int getrandomy(){         random ran = new random();         int rand = ran.nextint(4608);         return rand;     }     public int gethp(){         return hp;     }     public void sethp(int hp){         hp = hp;     }     public int getdamage(){         return damage;     } } 

ai class above class extends:

public abstract class ai extends jpanel implements runnable{     private static final long serialversionuid = 283692586329054555l;      private boolean running = false;     private thread movethread;     private int x = 0, y = 0;      public ai(){         movethread = new thread(this);     }     public void start(){         running = true;         movethread.start();     }     public void stop(){         running = false;     }     public boolean isrunning(){         return running;     }      public void run(){         while(running){             if(game.fighting == false){                 random direction = new random();                 int dir = direction.nextint(4);                 switch(dir){                 case 1:                      if(this.getx() < game.getwindowwidth()){                     this.setenx(this.getx() + 1);                     }                     break;                 case 2:                     if(this.getx() > 0){                         this.setenx(this.getx() - 1);                     }                     break;                 case 3:                     if(this.getx() < game.getwindowheight()){                         this.seteny(this.gety() + 1);                     }                     break;                 case 4:                     if(this.getx() < 0){                         this.seteny(this.gety() - 1);                     }                     break;                 }                 updatebounds();                 try{                     thread.sleep(200);                 }catch(interruptedexception e){                     e.printstacktrace();                 }             }         }     }     public void setenx(int x){         this.x = x;     }     public void seteny(int y){         this.y = y;     }     public int getenx(){         return x;     }     public int geteny(){         return y;     }     public void updatebounds(){         setbounds(x, y, 32,32);     }     public abstract void paintcomponent(graphics g); } 

i understand threw lot of code @ guys. tried not to, looking @ i'm trying provide example runs. if missed code, tell me , i'll add it.

anyways, need know how make setbounds() stop invoking repaint() (other using less 5 entities). also, i've removed enemyai.start() when adding entities , did stop it. have reason believe problem within ai class run() method. pretty calls setbounds().

this normal behavior , it's why can't modify state inside paintcomponent. don't have control on when repaints happen: system them on own sometimes.

here's example of mean, shouldn't doing:

public class playerpane extends jpanel{     ...      public void paintcomponent(graphics g){         ...          // modifying index         if(index == images.length-1){             index = 0;         } else {             index++;         }     } } 

you need go through of code looking every place you've modified variable inside paintcomponent, , move out somewhere else.

as side note, should move imageio.read calls not inside paintcomponent. load images once when program starts, in static variables or that.

and general tip, should in animation painting instead of trying animate components. huge favors in long run game.


so in summary:

  • keep paintcomponent stateless.
  • wrap images game/animation state in non-ui objects.
  • paint these images in paintcomponent.

here's minimal example demonstrates animating shapes falling down window:

falling shapes

import java.net.*; import javax.swing.*; import javax.imageio.*; import java.awt.image.*; import java.awt.event.*; import java.awt.dimension; import java.awt.color; import java.awt.graphics; import java.util.list; import java.util.arraylist; import java.util.random;  class fallingshapes implements runnable {     public static void main(string[] args) {         swingutilities.invokelater(new fallingshapes());     }      @override     public void run() {         list<entity> entities = new arraylist<entity>();          int w = 0;         int h = 0;          (bufferedimage img : resources.images) {             entities.add(new entity(img));              w += img.getwidth();             h += img.getheight();         }          paintpanel p = new paintpanel(entities);         p.setpreferredsize(new dimension(w, (2 * h)));          jframe f = new jframe();          f.setcontentpane(p);         f.pack();         f.setlocationrelativeto(null);         f.setresizable(false);         f.setdefaultcloseoperation(jframe.exit_on_close);         f.setvisible(true);          new animator((1000 / 60), p, entities).start();     }      static class animator implements actionlistener {         int period;         jpanel context;         int height;         list<entity> entities;          animator(int period, jpanel context, list<entity> entities) {             this.context  = context;             this.height   = context.getheight();             this.period   = period;             this.entities = entities;         }          @override         public void actionperformed(actionevent a) {             (entity e : entities) {                 double dist =                     (period / 1000.0) * (height * e.rate);                  e.y += dist;                 e.y %= height;             }              context.repaint();         }          void start() {             random r = new random();             int    x = 0;             (entity e : entities) {                 e.x    = x;                 e.y    = r.nextint(height);                 e.rate = (0.25 + (0.75 * r.nextdouble()));                  x += e.width;             }              new timer(period, this).start();         }     }      static class entity {         bufferedimage img;          double x, y, rate;         int width, height;          entity(bufferedimage img) {             this.img    = img;             this.width  = img.getwidth();             this.height = img.getheight();         }          void paint(graphics g, jpanel context) {             int x = (int) math.round(this.x);             int y = (int) math.round(this.y);             g.drawimage(img, x, y, null);              int cheight = context.getheight();             if ((y + height) > cheight) {                 g.drawimage(img, x, y - cheight, null);             }         }     }      static class paintpanel extends jpanel {         list<entity> entities;          paintpanel(list<entity> entities) {             this.entities = entities;              setbackground(color.white);         }          @override         protected void paintcomponent(graphics g) {             super.paintcomponent(g);              (entity e : entities) {                 e.paint(g, this);             }         }     }      static class resources {         static final string[] paths = {             "http://i.stack.imgur.com/wcf8s.png",             "http://i.stack.imgur.com/5v2tx.png",             "http://i.stack.imgur.com/f0jhk.png",             "http://i.stack.imgur.com/4evv1.png",             "http://i.stack.imgur.com/xj49g.png",         };          static final list<bufferedimage> images =             new arraylist<bufferedimage>();         static {             (string path : paths) {                 try {                     images.add(imageio.read(new url(path)));                 } catch (exception e) {                     throw new assertionerror(e);                 }             }         }     } } 

(images here.)

other useful examples of animation , painting:


Comments

Popular posts from this blog

android - MPAndroidChart - How to add Annotations or images to the chart -

javascript - Add class to another page attribute using URL id - Jquery -

firefox - Where is 'webgl.osmesalib' parameter? -