image - Java moving a BufferedImage on JFrame -
i'm new java, studying gui. i'm creating simple maze game. have maze 'layout' using string array converted 2d array , placing image walls , space using 'w' , 's' in in string array.
the problem facing character image moving array keys, have created bufferedimage, painted form , have key listener , cant find im going wrong.
here code;
public class maze extends jframe implements keylistener { private container contain; private jpanel peast, pnorth, psouth, pcenter, pwest; private jbutton btnstart, btnreset, btnexit; private jlabel lbltitle, lblmazewall; private jtextarea txtarea; //private string s; //private fileinputstream in; //private int no; //private char ch; private imageicon mazewall; private bufferedimage player; private int xpos = 100, ypos = 100; private string [] mazelayout; private string [][] mazelayout2d; maze(){ loadimage(); mazelayout = new string[10]; mazelayout2d = new string[10][10]; contain = getcontentpane(); peast = new jpanel(); pnorth = new jpanel(); psouth = new jpanel(); pcenter = new jpanel(); pwest = new jpanel(); //pcenter.setbackground(color.blue); pcenter.setlayout(new flowlayout (flowlayout.center,0,0)); pwest.setlayout(new flowlayout (flowlayout.center, 10, 10)); btnstart = new jbutton("start"); btnstart.setfont(new font("dialog", font.bold, 18)); btnreset = new jbutton("reset"); btnreset.setfont(new font("dialog",font.bold,18)); peast.setlayout(new flowlayout (flowlayout.center,10,10)); peast.add(btnstart); peast.add(btnreset); btnexit = new jbutton("exit"); btnexit.setfont(new font("dialog",font.bold,18)); psouth.setlayout( new flowlayout (flowlayout.center, 20,10)); psouth.add(btnexit); lbltitle = new jlabel("maze game"); lbltitle.setfont( new font("dialog",font.bold,24)); lbltitle.sethorizontalalignment(swingconstants.center); pnorth.setlayout(new flowlayout(flowlayout.center, 20, 10)); pnorth.add(lbltitle); txtarea = new jtextarea(20,70); txtarea.setfont(new font("dialog",font.bold,16)); mazewall = new imageicon("mazewall.png"); // read in text file, needed later // try{ // in = new fileinputstream("maze.txt"); // while((no = in.read()) != -1){ // ch = (char)no; // s+=ch; // } // txtarea.settext(s); // }catch(filenotfoundexception ef){ // joptionpane.showmessagedialog(null, "file not found - maze.txt"); // }catch(ioexception e){ // joptionpane.showmessagedialog(null, "unable read file maze.txt"); // } contain.add(peast, borderlayout.east); contain.add(pnorth, borderlayout.north); contain.add(psouth, borderlayout.south); contain.add(pcenter, borderlayout.center); contain.add(pwest, borderlayout.west); //array maze mazelayout[0] = "wwwwwwwwww"; mazelayout[1] = "wssswwswww"; mazelayout[2] = "wswswwsssw"; mazelayout[3] = "wswswwwwsw"; mazelayout[4] = "wswswwwwsw"; mazelayout[5] = "wswswssssw"; mazelayout[6] = "wswswswwww"; mazelayout[7] = "wswswswwww"; mazelayout[8] = "wswssswwww"; mazelayout[9] = "wwwwwwwwww"; //converting array 2d array for(int y = 0; y < 10; y++){ for(int x = 0; x < 10; x++){ mazelayout2d[y][x] = mazelayout[y].substring(x, x+1); if (mazelayout2d[y][x].equals("w")){ lblmazewall = new jlabel(); mazewall = new imageicon("mazewall.png"); lblmazewall.seticon(mazewall); pcenter.add(lblmazewall); } if (mazelayout2d[y][x].equals("s")){ lblmazewall = new jlabel(); mazewall = new imageicon("mazefloor.png"); lblmazewall.seticon(mazewall); pcenter.add(lblmazewall); } } } } public void loadimage(){ try{ string playerpath = "player.png"; player = imageio.read(new file(playerpath)); }catch(ioexception ex){ ex.printstacktrace(); } addkeylistener(this); } @override public void paint(graphics g){ super.paint(g); g.drawimage(player, xpos, ypos,50,80, this); } public void keypressed(keyevent ke){ switch(ke.getkeycode()){ case keyevent.vk_right:{ xpos+=3; } break; case keyevent.vk_left:{ xpos-=3; } break; case keyevent.vk_down:{ ypos+=3; } break; case keyevent.vk_up:{ ypos-=3; } break; } repaint(); } public void keytyped(keyevent ke){} public void keyreleased(keyevent ke){} }
hopefully can tell me problem is, thankyou.
don't override paint() method of top level container (ie jframe).
custom painting done overriding paintcomponent() method of jpanel (or jcomponent). in case override center panel since create maze.
keyevent generated component has focus. need make center panel focusable.
also, not recommended use keylistener. found 1 of limitations of old approach used awt applications. swing applications should using key bindings. search forum, advice given daily.
also, don't keep creating new imageicons when build maze. need single icon each image, can reuse icon.
Comments
Post a Comment