swing - How to move Polygon Object with KeyListener in Java -
i working on 2d game learning project , have hit bump. cannot figure out how move polygon object using keylistener within jpanel (which added jframe). i've tried frog.translate(int x, int y) method, not update location. i've tried changing array coordinates manually. sample of code below:
import javax.swing.*; import java.awt.*; import java.awt.event.actionevent; import java.awt.event.actionlistener; import java.awt.event.keyevent; import java.awt.event.keylistener; public class board extends jpanel implements keylistener { private frog frog; public board() { setbackground(color.green); addkeylistener(this); setfocusable(true); setfocustraversalkeysenabled(false); } @override public void paintcomponent(graphics g) { super.paintcomponent(g); graphics2d g2 = (graphics2d)g; frog = new frog(); // frog graphics g2.setcolor(color.black); g2.drawpolygon(frog); g2.setcolor(new color(0,150,15)); g2.fillpolygon(frog); } @override public void keytyped(keyevent ke) { } @override public void keypressed(keyevent ke) { int c = ke.getkeycode(); if(c == keyevent.vk_left){ frog.movefrogleft(25); //frog.translate(-25,0); } if(c == keyevent.vk_right){ frog.movefrogright(25); //frog.translate(25,0); } if(c == keyevent.vk_up){ frog.movefrogup(25); //frog.translate(0,-25); } if(c == keyevent.vk_down){ frog.movefrogdown(25); //frog.translate(0,25); } repaint(); } @override public void keyreleased(keyevent ke) { } }
///////////////////////
import java.awt.polygon; import java.awt.event.keyevent; import java.awt.event.keylistener; public class frog extends polygon { private integer[] xcoord; private integer[] ycoord; public frog(){ xcoord = new integer[] {5,10,10,15,15,20, 20,30,30,35,35,40,40, 45,45,40,40,30,30,40, 40,45,45,40,40,35,35, 30,30,20,20,15,15,10, 10,5,5,10,10,20,20, 10,10,5,5}; ycoord = new integer[] {10,10,5,5,20,20, 10,10,20,20,5,5,10,10, 15,15,25,25,30,30,35,35, 40,40,45,45,35,35,40,40, 35,35,45,45,40,40,35,35, 30,30,25,25,15,15,10}; for(int = 0; < xcoord.length; i++){ this.addpoint(xcoord[i],ycoord[i]); } } public void movefrogleft(int x) { if(xcoord[0] - x < 0){ //do nothing } else { for(int = 0; < xcoord.length; i++){ xcoord[i] = xcoord[i] - x; } } } public void movefrogright(int x){ if(xcoord[0] + x > 600){ //do nothing } else { for(int = 0; < xcoord.length; i++){ xcoord[i] = xcoord[i] + x; } } } public void movefrogup(int y){ if(ycoord[0] - y < 0){ //do nothing } else { for(int = 0; < ycoord.length; i++){ ycoord[i] = ycoord[i] - y; } } } public void movefrogdown(int y){ if(ycoord[0] + y > 600){ //do nothing } else { for(int = 0; < ycoord.length; i++){ ycoord[i] = ycoord[i] + y; } } } }
this code has simple issue:
@override public void paintcomponent(graphics g) { super.paintcomponent(g); graphics2d g2 = (graphics2d)g; frog = new frog();// <-- !!!!! // frog graphics g2.setcolor(color.black); g2.drawpolygon(frog); g2.setcolor(new color(0,150,15)); g2.fillpolygon(frog); }
the marked line overwrites frog new instance, every time frog painted, reseting original point. apart obvious issue reason unexpected behaviour, never unnecessary calculations in paintcomponent(...)
-method. precomputation, object-generation, etc. should done outside of paintcomponent
!!!
Comments
Post a Comment