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

Popular posts from this blog

c# - Validate object ID from GET to POST -

node.js - Custom Model Validator SailsJS -

php - Find a regex to take part of Email -