loops - Continuously moving an image in Java -
i'm trying recreate digdug game in java computer science class.
as i'm beginner, i'm going have monsters move , down, instead of chasing player. i'm having difficulties making monsters continuously move though. go up, not go down, , doesn't repeat.
previously fly off screen if player reached point, or wouldn't move @ all. have tried for-loop, while-loop , do-while loop. tried delay stopped entire program. goal make of monsters move , down when player reaches point (340, 270).
import java.applet.*; import java.awt.*; import java.awt.event.*; import java.io.*; import java.net.*; import java.awt.font; import java.awt.event.*; import javax.swing.timer; import java.util.arraylist; import java.awt.event.keyadapter; public class digdug extends applet implements mousemotionlistener, mouselistener, keylistener { private final color c_background = new color(32, 73, 150); private final color c_first = new color(230, 185, 9); private final color c_second = new color(224, 128, 18); private final color c_third = new color(232, 61, 14); private final color c_last = new color(184, 0, 0); private final color c_score = new color(232, 42, 96); public boolean ifentered = false; public boolean ismoving1 = false; private int count = 0; private int othercount = 0; private image flower; private image diggy; private image enemies1; private image enemies2; private image enemies3; private image arrowup; private image arrowdown; private image arrowleft; private image arrowright; //private arraylist<point> enemies = new arraylist<point>(); font myfont = new font("sansserif",font.bold, 16); private timer timer; private point up; private int digx = 685; private int digy = 45; private int e1x = 76; private int e1y = 210; //i created variable hold enemies's values private int e2x = 465; private int e2y = 342; private int e3x = 546; private int e3y = 127; private boolean ifw = false; private boolean ifa = false; private boolean ifs = false; private boolean ifd = false; private boolean yaas = false; private int arrowx = digx+5; private int arrowy = digy+5; private arraylist<integer> xpts = new arraylist<integer>(); private arraylist<integer> ypts = new arraylist<integer>(); public void init() { diggy = getimage(getdocumentbase(), "dig_dug.png"); flower = getimage(getdocumentbase(), "flower.gif"); enemies1 = getimage(getdocumentbase(), "pooka.png"); enemies2 = getimage(getdocumentbase(), "fygar.gif"); enemies3 = getimage(getdocumentbase(), "pooka.png"); arrowup = getimage(getdocumentbase(), "arrowup.png"); arrowdown = getimage(getdocumentbase(), "arrowdown.png"); arrowright = getimage(getdocumentbase(), "arrow-point-right.png"); arrowleft = getimage(getdocumentbase(), "arrowleft copy.png"); setbackground(c_background); setsize(700,500); addmousemotionlistener(this); addmouselistener(this); setfont(myfont); addkeylistener(this); = new point(digx, digy); } public void paint(graphics g) { score(g); background(g); g.setcolor(color.white); //g.fillrect(player.x, player.y, 10, 10); if(ifentered) { if(digx > 330) digx--; else if(digy < 247) digy++; repaint(); } if(digx == 330 && digy == 247) { yaas = true; //checks if player has reached spot //(random variable created } if(yaas == true) //this if statement having problem { //int count = 0; //int count = 0; boolean isup = false; for(int = 0; < count; i++) { if(e1y == 210) { while(e1y != 120) { e1y--; } isup = true; } if(e1y == 120 && isup == true) { while(e1y != 210) { e1y++; } isup = false; } count++; } } g.drawimage(diggy, digx, digy, 20, 20, null); g.drawimage(flower, 680, 41, 20, 20, null); g.drawimage(enemies1, e1x, e1y, 20, 20, null); g.drawimage(enemies2, e2x, e2y, 20, 20, null); g.drawimage(enemies3, e3x, e3y, 20, 20, null); if(digy > e1y && digy < (e1y+20) && digx > e1x && digx < (e1x+20) ||e1y == digy || e1x == digx ) { background(g); g.setcolor(color.white); g.drawstring("game over", 294, 260); // repaint(); } if(digy > e2y && digy < (e2y+20) && digx > e2x && digx < (e2x+20)||e2y == digy || e2x == digx ) { background(g); g.setcolor(color.white); g.drawstring("game over", 294, 260); // repaint(); } if(digy > e3y && digy < (e3y+20) && digx > e3x && digx < (e3x+20) || e3y == digy && e3x == digx) { background(g); g.setcolor(color.white); g.drawstring("game over", 294, 260); // repaint(); } } public void score(graphics g) { g.setcolor(c_score); g.drawstring("1up", 101, 21); g.drawstring("high score", 271, 21); g.setcolor(color.white); g.drawstring(" " + count, 118, 35); g.drawstring(" " + count, 317, 35); } public void background(graphics g) { g.setcolor(c_first); g.drawrect(0,65, 700, 120); g.fillrect(0, 65, 700, 120); g.setcolor(c_second); g.drawrect(0,166, 700, 120); g.fillrect(0,166, 700, 120); g.setcolor(c_third); g.drawrect(0, 267, 700, 120); g.fillrect(0, 267, 700, 120); g.setcolor(c_last); g.drawrect(0, 388, 700, 120); g.fillrect(0, 388, 700, 120); }
first, need understanding of painting in awt , swing , concurrency in java. discourage use of applet
, applets have there own bunch of issues don't need deal right now.
the paint
method not place update state of ui, paint
method should paint current state. should not change state of ui within paint
method, cause no end of issues
to start with, need kind of "game loop", loop responsible updating state of game , scheduling updates ui
in main loop, maintain movement "delta", describes amount of change particular object has , in direction, in example, i'm dealing enemies1
, can imagine moves need it's own well.
on each cycle of game loop, apply delta objects current position, bounds check , invert delta required...
e1y += movedelta; if (e1y >= 210) { e1y = 209; movedelta *= -1; } else if (e1y <= 120) { e1y = 121; movedelta *= -1; }
the mainloop
below should go in init
or start
method, depending on if can work out how "pause" thread
thread mainloop = new thread(new runnable() { @override public void run() { int movedelta = -1; gameover = false; while (!gameover) { if (ifentered) { if (digx > 330) { digx--; } else if (digy < 247) { digy++; } repaint(); } // removed code here testing e1y += movedelta; if (e1y >= 210) { e1y = 209; movedelta *= -1; } else if (e1y <= 120) { e1y = 121; movedelta *= -1; } if (digy > e1y && digy < (e1y + 20) && digx > e1x && digx < (e1x + 20) || e1y == digy || e1x == digx) { gameover = true; } else if (digy > e2y && digy < (e2y + 20) && digx > e2x && digx < (e2x + 20) || e2y == digy || e2x == digx) { gameover = true; } else if (digy > e3y && digy < (e3y + 20) && digx > e3x && digx < (e3x + 20) || e3y == digy && e3x == digx) { gameover = true; } try { thread.sleep(40); } catch (interruptedexception ex) { } repaint(); } } }); mainloop.start();
you need replace paint
method code paints current state of game
@override public void paint(graphics g) { super.paint(g); score(g); background(g); g.setcolor(color.white); //g.fillrect(player.x, player.y, 10, 10); if (gameover) { g.setcolor(color.white); g.drawstring("game over", 294, 260); } else { g.drawimage(diggy, digx, digy, 20, 20, null); g.drawimage(flower, 680, 41, 20, 20, null); g.drawimage(enemies1, e1x, e1y, 20, 20, null); g.drawimage(enemies2, e2x, e2y, 20, 20, null); g.drawimage(enemies3, e3x, e3y, 20, 20, null); } }
now, i'd recommend dump applet
in favour of jpanel
(for core logic) , jframe
(for displaying) , swing timer
instead of thread
. double buffering free start with
Comments
Post a Comment