class Motion{ public int x0,y0, // old position x1,y1, // new position fw,fh, // foreground width,height minX,minY, // minimum x,y maxW,maxH; // maximum w,h public boolean hold; int bw,bh, // background width,height roomX,roomY,// x,y maximum clearance vx,vy, // x,y velocity ax,ay, // x,y absolute velocity dx,dy, // x,y direction x_,y_; // left-x, bottom-y Motion(int fw, int fh, int bw, int bh){ this.fw = fw; this.fh = fh; this.bw = bw; this.bh = bh; roomX = bw - fw; roomY = bh - fh; dx = rnddir(); dy = rnddir(); rndvel(); x0 = y0 = minX = minY = 0; hold = false; x1 = (int)(Math.random()*(float)roomX); y1 = (int)(Math.random()*(float)roomY); x_ = x1 + fw; y_ = y1 + fh; maxW = bw; maxH = bh; } private int rnddir(){ int ret = (int)(Math.random()*2.0); if(ret==0) ret = -1; return ret; } private void rndvel(){ ax = 3 + (int)(Math.random()*10.0); ay = 3 + (int)(Math.random()*10.0); vx = ax * dx; vy = ay * dy; } void step() { if (!hold) { x1 += vx; y1 += vy; if( (x1<0) || (roomX<=x1) ) { if(x1<0) { x1 = -x1; } else { x1 = 2*roomX - x1 - 1;} dx = -dx; rndvel(); } if ( (y1<0) || (roomY<=y1) ) { if (y1<0) { y1 = -y1; } else { y1 = 2*roomY - y1 - 1;} dy = -dy; rndvel(); } x_ = x1 + fw; y_ = y1 + fh; } minX = Math.min(x0,x1); minY = Math.min(y0,y1); maxW = fw + Math.max(x0,x1) - minX; maxH = fh + Math.max(y0,y1) - minY; } void catchup() { x0 = x1; y0 = y1; } boolean checkHit(int x, int y) { return (x1 < x) && (x < x_) && (y1 < y) && (y < y_); } void setxy(int x, int y, boolean sethold) { x1 = x - fw/2; y1 = y - fh/2; if (x1 < 0) x1 = 0; if (y1 < 0) y1 = 0; if (x1 > roomX) x1 = roomX; if (y1 > roomY) y1 = roomY; x_ = x1 + fw; y_ = y1 + fh; if (sethold) hold = true; } }