This is improved code from my previous question. This mini game which we call "Moon Buggy" is available in beta from the google playstore.
The action is that you control a vechicle on the moon and you defend yourself against evil UFO:s.
I have written a separate class for the UFO which is instanciated once for every UFO. I have also created a separate class for the vehicle which we call the "moon rover" (might change the name of the game to "Moon Rover" possibly).
UFO.java
public class UFO extends MoonSprite {
private Bitmap ufoBitmap;
//boolean to avoid multiple hits, switched in the beginning
static boolean recent = true;
private long changeDirections = System.currentTimeMillis();
private long fireTimeout = System.currentTimeMillis();
private int ufoY = 0;
private int ufoX = 0;
private int missileX = 25;
private int deltaUfoY = 7;
private int deltaUfoX = 7;
private int missileOffSetY = 0;
private int missileYstart = 0;
private boolean wasHit = false;
private boolean alienexplode;
private boolean waitForTimer, waitForUfoTimer;
private boolean toggleDeltaY = true;
private boolean runOnce = true;
protected UFO(Context context, String name, int deltaUfoY) {
super(context, name);
this.screenHeight = context.getResources().getDisplayMetrics().heightPixels;
this.screenWidth = context.getResources().getDisplayMetrics().widthPixels;
Log.d("dimensions", "dimensions " + this.screenHeight + " " + this.screenWidth);
this.deltaUfoY = deltaUfoY; // the vertical velocity
int ufoId = context.getResources().getIdentifier(name,
"drawable", context.getPackageName());
ufoBitmap = BitmapFactory.decodeResource(context.getResources(), ufoId);
ufoX = randomize((int) (0.8 * screenWidth), (int) (0.2 * screenWidth));
// missile starts at same coordinates as UFO
missileX = ufoX;
ufoY = 0;
waitForUfoTimer = true;
Handler handler = new Handler(Looper.getMainLooper());
handler.postDelayed(() -> {
missileX = ufoX;
UFO.recent = false;
waitForUfoTimer = false;
}, randomize(20000, 18000));
}
//not yet used. start from beginning if target or UFO is hit
public void reset(Canvas canvas, Paint paint) {
missileX = randomize((int) (0.75 * screenWidth), 20);
ufoX = missileX;
ufoY = 0;
waitForUfoTimer = true;
Handler handler = new Handler(Looper.getMainLooper());
handler.postDelayed(() -> {
missileX = ufoX;
UFO.recent = false;
waitForUfoTimer = false;
}, randomize(20000, 18000));
}
private void changeDirections() {
if (System.currentTimeMillis() - changeDirections >= randomize(500, 100)) {
// Change direction here
toggleDeltaY = !toggleDeltaY;
changeDirections = System.currentTimeMillis();
}
}
public void update(Canvas canvas, Paint paint, boolean toggleDeltaY) {
// don't move outside the top. (0,0) is top left corner
if(ufoY<0) {
ufoY = 0;
deltaUfoY = (int) Math.sqrt(deltaUfoY * deltaUfoY); // use the positive
}
if (ufoX > screenWidth - ufoBitmap.getWidth() || ufoX <= 0) { // UFO change horizontal direction
deltaUfoX = -deltaUfoX;
}
//if missiles goes outside the screen lower part, update to new missile coordinates
if (missileYstart + ufoBitmap.getHeight() + missileOffSetY >= screenHeight) {
missileYstart = ufoY;
missileX = ufoX;
}
//change directions after a while
if (toggleDeltaY) {
deltaUfoY = -deltaUfoY;
}
//make sure UFO does not move too low
//(0,0) is top left corner
if (ufoY >= (int) (0.2 * screenHeight)) { // why 0.2 ?
deltaUfoY = - (int) Math.sqrt(deltaUfoY * deltaUfoY); // use the negative;
}
if (!waitForUfoTimer && MoonBackground.checkpoint >= 'A') {
runOnce = true;
canvas.drawBitmap(ufoBitmap, ufoX + 10, ufoY, paint);
}
ufoX = ufoX + deltaUfoX;
if (waitForTimer) missileX = ufoX;
ufoY = ufoY + deltaUfoY;
changeDirections();
}
public boolean checkBeingHit(int[] missiles, int buggyXDisplacement, double buggyXDistance, Canvas canvas, Bitmap explode2, Paint paint, int score, ParallaxView pview, int i1, int xbuggy2) {
// if UFO is being hit by buggy
if (!waitForTimer && java.lang.Math.abs(ufoX + 10 - 400 - buggyXDistance) * 2 < (ufoBitmap.getWidth()) && java.lang.Math.abs(ufoY - (screenHeight / 100 * 95 - missiles[i1] - xbuggy2)) * 2 < (ufoBitmap.getHeight())) {
missileOffSetY = -9999;
canvas.drawBitmap(explode2, ufoX + 10, ufoY, paint);
if (runOnce) {
ParallaxView.score = ParallaxView.score + 100;
Handler handler = new Handler(Looper.getMainLooper());
handler.postDelayed(() -> {
missileX = randomize((int) (0.75 * screenWidth), 20);
ufoX = missileX;
ufoY = 0;
alienexplode = false;
waitForTimer = false;
waitForUfoTimer = false;
}, 3000);
}
runOnce = false;
waitForUfoTimer = true;
waitForTimer = true;
if (!alienexplode) {
pview.changeText();
}
alienexplode = true;
return true;
} else return false;
}
//return boolean if fire, boolean which is not yet used
private boolean checkFire() {
if (System.currentTimeMillis() - fireTimeout >= randomize(30000, 24000)) { // means how often the ufoBitmap fires
fireTimeout = System.currentTimeMillis();
missileOffSetY = 0;
missileX = ufoX;
missileYstart = ufoY;
return true;
} else return false;
}
// if buggy was hit by a missile then return true
private boolean checkBuggyHitByMissile(Canvas canvas, ParallaxView view, int buggyXDisplacement, double buggyXDistance, Paint paint, Bitmap buggy, int jumpHeight) {
if (!UFO.recent && !view.waitForTimer && java.lang.Math.abs(((buggyXDisplacement + buggyXDistance) + buggy.getWidth() / 2) - (missileX + 10 + ufoBitmap.getWidth() / 2)) < buggy.getWidth() / 2 && java.lang.Math.abs((ufoY + 75 + missileOffSetY) - ((screenHeight * 0.3) - jumpHeight + buggy.getHeight())) < 65) {
UFO.recent = true;
canvas.drawBitmap(view.explode, (float) (buggyXDisplacement + buggyXDistance), (float) (screenHeight * 0.5) - jumpHeight, paint);
ParallaxView.bombed--;
missileOffSetY = 0;
wasHit = true;
view.recent = true;
Handler handler = new Handler(Looper.getMainLooper());
handler.postDelayed(() -> {
UFO.recent = false;
waitForTimer = false;
wasHit = false;
}, 4500);
waitForTimer = true;
} else {
// buggy was not hit so UFO fires more missiles
if (!waitForTimer && !waitForUfoTimer && MoonBackground.checkpoint >= 'A') {
canvas.drawText("●くろまる", missileX + ufoBitmap.getWidth() / 2 + 10, missileYstart + ufoBitmap.getHeight() + missileOffSetY, paint);
missileOffSetY = missileOffSetY + 3;
}
wasHit = false;
}
return wasHit;
}
public boolean drawMissile(ParallaxView view, Canvas canvas, Paint paint, int buggyXDisplacement, double buggyXDistance, Bitmap buggy, int jumpHeight) {
checkFire();
return checkBuggyHitByMissile(canvas, view, buggyXDisplacement, buggyXDistance, paint, buggy, jumpHeight);
}
}
MoonRover.java
public class MoonRover extends MoonSprite {
public Bitmap getBitmapRover() {
return bitmapRover;
}
private Bitmap bitmapRover, explode;
public int getJumpHeight() {
return jumpHeight;
}
public void setJumpHeight(int jumpHeight) {
this.jumpHeight = jumpHeight;
}
private int jumpHeight;
private double retardation = 0.5;
private double buggyXdistance = 0;
public double getBuggyXdistance() {
return buggyXdistance;
}
public void setBuggyXdistance(double buggyXdistance) {
this.buggyXdistance = buggyXdistance;
}
public void increaseBuggyXdistance(double d) {
buggyXdistance = buggyXdistance + d;
}
public void decreaseBuggyXdistance(double d) {
buggyXdistance = buggyXdistance - d;
}
public double getRetardation() {
return retardation;
}
public void increaseRetardation(double d) {
retardation = retardation + d;
}
public void setRetardation(double retardation) {
this.retardation = retardation;
}
public double getDistanceDelta() {
return distanceDelta;
}
public void setDistanceDelta(double distanceDelta) {
this.distanceDelta = distanceDelta;
}
private double distanceDelta;
protected MoonRover(Context context, String name) {
super(context, name);
this.screenHeight = context.getResources().getDisplayMetrics().heightPixels;
this.screenWidth = context.getResources().getDisplayMetrics().widthPixels;
int roverId = context.getResources().getIdentifier(name,
"drawable", context.getPackageName());
bitmapRover = BitmapFactory.decodeResource(context.getResources(), roverId);
int explodeId = context.getResources().getIdentifier("explode",
"drawable", context.getPackageName());
explode = BitmapFactory.decodeResource(context.getResources(), explodeId);
Handler handler = new Handler(Looper.getMainLooper());
handler.postDelayed(new Runnable() {
@Override
public void run() {
}
}, randomize(20000, 18000));
}
//if rover was hit by UFO missile then return true, false otherwise
//not implemented yet
public boolean isHit(UFO ufo) {
boolean isHit = false;
return isHit;
}
//if rover was hit by UFO missile, hits a moon rock or a hole, then explode for some time
//and after a while reset to beginning of section
public void explode(Canvas canvas, Paint paint, float left, float top) {
canvas.drawBitmap(explode, left, top, paint);
}
//if rover fires a missile then draw the missile
//not implemented yet
public void fireMissile(Canvas canvas) {
}
public void draw(Canvas canvas, Paint paint, float left, float top) {
canvas.drawBitmap(bitmapRover, left, top, paint);
}
//if rover jumps then draw the jumping rover
public void jump(Canvas canvas, boolean up) {
if (up && jumpHeight < 500) {
jumpHeight = jumpHeight + 7;
if (distanceDelta < 3) distanceDelta = distanceDelta + 0.55;
} else if (jumpHeight > 0) {
jumpHeight = jumpHeight - 4;
if (distanceDelta < 3) distanceDelta = distanceDelta + 0.55;
}
}
}
ParallaxView.java
public class ParallaxView extends SurfaceView implements Runnable, SurfaceHolder.Callback {
static int bombed = 5;
Rect fromRect1;
Rect toRect1;
Rect fromRect2;
Rect toRect2;
boolean waitForTimer = false;
boolean recent = false;
boolean increment = false;
boolean toggleDeltaY = true;
boolean toggleGround = true;
boolean jump = false;
boolean shoot = false;
boolean checkpointComplete = false;
boolean runOnce = true;
boolean passed = false;
boolean donotdrawBuggy = false; // keep track of whether to not draw anything at all during the wait between being bombed and getting a new life
final int buggyXDisplacement = 450;
int numberOfshots = 0; // change to 0
int[] missiles = new int[200];
/* int alienBombYDelta = 0;
int alienBombYDelta2 = 0;
int alienBombXDelta = 20;
int alienBombXDelta2 = 30;*/
int p = 7;
int p2 = 13;
int index = 0;
int missileOffSetY = 0;
int jumpHeight = 0;
int xbuggy2 = 0;
int craterX = -550;
long lastTurn2 = System.currentTimeMillis();
long lastTurn3 = System.currentTimeMillis();
TextView tvId1;
int sectionComplete = 0;
static int score = 0;
double lastTurn4 = System.currentTimeMillis();
List<MoonBackground> backgrounds;
List<UFO> ufos;
int moondRockSmallId, resID, explodeID, explodeID2, alienResID2;
private volatile boolean running;
private Thread gameThread = null;
Bitmap explode, alien, alien2, explode2, spacerock, spacerock3, spacerock2, hole;
TextView tvId;
TextView checkpointtextview;
TextView checkpointtextview2;
TextView checkpointtextview3;
TextView checkpointtextview4;
TextView checkpointtextview5;
TextView checkpointtextview6;
// For drawing
private Paint paint;
private Canvas canvas;
private SurfaceHolder ourHolder;
UFO alien3;
UFO alien4;
UFO alien5;
// Holds a reference to the Activity
Context context;
ScreenDimension screenDimension;
// Control the fps
long fps = 60;
MoonRover moonRover;
// Screen resolution
int screenWidth;
int screenHeight;
boolean bexplode = false;
boolean brake = false;
boolean scoring = false;
public MoonRover getMoonRover() {
return moonRover;
}
// use Handler instead
class SetRecent extends TimerTask {
public void run() {
recent = false;
}
}
// use Handler instead
class ResetCheckpoint extends TimerTask {
public void run() {
Log.d("## sectionComplete", "sectionComplete " + sectionComplete);
if (sectionComplete == 0) MoonBackground.checkpoint = 'A';
if (sectionComplete == 1) MoonBackground.checkpoint = 'F';
if (sectionComplete == 2) MoonBackground.checkpoint = 'K';
if (sectionComplete == 3) MoonBackground.checkpoint = 'P';
}
}
public void surfaceCreated(SurfaceHolder holder) {
//Canvas c = getHolder().lockCanvas();
//draw();
//getHolder().unlockCanvasAndPost(c);
}
public void surfaceDestroyed(SurfaceHolder holder3) {
//Canvas c = getHolder().lockCanvas();
//draw();
//getHolder().unlockCanvasAndPost(c);
}
public void surfaceChanged(SurfaceHolder holder, int i1, int i2, int i3) {
//Canvas c = getHolder().lockCanvas();
//draw();
//getHolder().unlockCanvasAndPost(c);
}
private void update() {
// Update all the background positions
for (MoonBackground bg : backgrounds) {
bg.update(fps);
}
}
public ParallaxView(Context c, AttributeSet a) {
super(c, a);
this.context = c;
MoonBackground.checkpoint--; // why?
this.screenWidth = getContext().getResources().getDisplayMetrics().widthPixels;
this.screenHeight = getContext().getResources().getDisplayMetrics().heightPixels;
screenDimension = new ScreenDimension(getContext().getResources().getDisplayMetrics().widthPixels, getContext().getResources().getDisplayMetrics().heightPixels);
// Initialize our drawing objects
ourHolder = getHolder();
paint = new Paint();
// Initialize our arraylist
backgrounds = new ArrayList<>();
//load the background data into the MoonBackground objects and
// place them in our GameObject arraylist
backgrounds.add(new MoonBackground(
this.context,
screenWidth,
screenHeight,
"bg", 0, 120, 50));
backgrounds.add(new MoonBackground(
this.context,
screenWidth,
screenHeight,
"grass", 70, 110, 200));
//Log.d("Timer", "Timer ");
resID = context.getResources().getIdentifier("vehicle",
"drawable", context.getPackageName());
explodeID = context.getResources().getIdentifier("explode",
"drawable", context.getPackageName());
explodeID2 = context.getResources().getIdentifier("explode2",
"drawable", context.getPackageName());
moondRockSmallId = context.getResources().getIdentifier("spacerock",
"drawable", context.getPackageName());
int spacerock2i = context.getResources().getIdentifier("rock2_hdpi",
"drawable", context.getPackageName());
int spacerock3i = context.getResources().getIdentifier("rock3_hdpi",
"drawable", context.getPackageName());
int holeid = context.getResources().getIdentifier("hole",
"drawable", context.getPackageName());
//buggy = BitmapFactory.decodeResource(context.getResources(), resID);
explode = BitmapFactory.decodeResource(context.getResources(), explodeID);
explode2 = BitmapFactory.decodeResource(context.getResources(), explodeID2);
spacerock = BitmapFactory.decodeResource(context.getResources(), moondRockSmallId);
spacerock2 = BitmapFactory.decodeResource(context.getResources(), spacerock2i);
spacerock3 = BitmapFactory.decodeResource(context.getResources(), spacerock3i);
alienResID2 = context.getResources().getIdentifier("right_side_hdpi",
"drawable", context.getPackageName());
int alienResID3 = context.getResources().getIdentifier("spaceship2_hdpi",
"drawable", context.getPackageName());
alien = BitmapFactory.decodeResource(context.getResources(), alienResID2);
alien2 = BitmapFactory.decodeResource(context.getResources(), alienResID3);
hole = BitmapFactory.decodeResource(context.getResources(), holeid);
alien3 = new UFO(context, "spaceship2_hdpi", 1);
alien4 = new UFO(context, "spaceship3_hdpi", 2);
alien5 = new UFO(context, "right_side_hdpi", 3);
// Initialize our array list
ufos = new ArrayList<>();
ufos.add(alien3);
ufos.add(alien4);
ufos.add(alien5);
moonRover = new MoonRover(context, "vehicle");
}
@Override
public void run() {
while (running) {
long startFrameTime = System.currentTimeMillis();
update();
draw();
// Calculate the fps this frame
long timeThisFrame = System.currentTimeMillis() - startFrameTime;
if (timeThisFrame >= 1) {
fps = 1000 / timeThisFrame;
}
}
}
private void checkJump() {
if (System.currentTimeMillis() - lastTurn3 >= 650) { // 650 means how long the vehicle is in the air at a jump
// Change direction here
jump = false;
lastTurn3 = System.currentTimeMillis();
}
}
private void drawShots() {
for (int i1 = 0; i1 < numberOfshots; i1++) {
if (shoot) {
canvas.drawText("o", (float) (missiles[i1] + moonRover.getBuggyXdistance() + 450), (float) (screenHeight * 0.7) - moonRover.getJumpHeight(), paint); // add to y the jump height
canvas.drawText("o", (float) (moonRover.getBuggyXdistance() + 185 + 400), screenHeight / 110 * 95 - missiles[i1] - xbuggy2, paint);
}
if (i1 == numberOfshots - 1 && missiles[i1] > screenWidth) {
if (numberOfshots > 0) numberOfshots--;
if (index > 0) index--;
}
}
}
//use a Handler instead
private void changeDirections() {
if (System.currentTimeMillis() - lastTurn2 >= 7000) {
// Change direction here
toggleDeltaY = !toggleDeltaY;
lastTurn2 = System.currentTimeMillis();
}
}
//try to improve this
private void controlVelocity() {
if (!brake && moonRover.getBuggyXdistance() > 0) {
moonRover.increaseBuggyXdistance(moonRover.getDistanceDelta());
} else if (brake && moonRover.getBuggyXdistance() > 0) {
moonRover.decreaseBuggyXdistance(moonRover.getRetardation());
}
}
private void makeShots() {
for (int n = 0; n < numberOfshots; n++)
missiles[n] = missiles[n] + 20;
}
public void changeText() {
if (scoring) {
((Activity) this.getContext()).runOnUiThread(() -> {
String str = "Player 1 " + String.format("%06d", score);
tvId.setText(str);
scoring = false;
});
}
}
//change to handler
private void checkFire() {
if (System.currentTimeMillis() - lastTurn4 >= 118500) { // it means how often the alien fires
lastTurn4 = System.currentTimeMillis();
missileOffSetY = 0;
}
}
private void draw() {
if (moonRover.getRetardation() > 0.5) {
moonRover.setDistanceDelta(0);
}
if (moonRover.getDistanceDelta() > 0) //why?
moonRover.setRetardation(0.5);
if (ourHolder.getSurface().isValid()) {
//First we lock the area of memory we will be drawing to
canvas = ourHolder.lockCanvas();
if (checkpointComplete) {
canvas.drawColor(Color.BLACK);
((ParallaxActivity) getContext()).stopWatch.stop();
paint.setTextSize(60);
String s2 = "TIME TO REACH POINT \"" + MoonBackground.checkpoint + "\"\n";
if (runOnce) {
for (int q = 0; q < s2.length(); q++) {
final String s2f = s2;
final int r = q;
((Activity) this.getContext()).runOnUiThread(() -> {
checkpointtextview.setTextColor(Color.RED);
checkpointtextview.append(Character.toString(s2f.charAt(r)));
});
try {
Thread.sleep(50);
} catch (InterruptedException ie) {
}
}
}
String str = String.format("%03d", ((ParallaxActivity) this.getContext()).countUp);
String s3 = "YOUR TIME : " + str;
if (runOnce) {
for (int q = 0; q < s3.length(); q++) {
final String s3f = s3;
final int r = q;
((Activity) this.getContext()).runOnUiThread(() -> {
checkpointtextview2.setTextColor(Color.parseColor("#ADD8E6"));
checkpointtextview2.append(Character.toString(s3f.charAt(r)));
});
try {
Thread.sleep(50);
} catch (InterruptedException ie) {
}
}
}
String s4 = "THE AVERAGE TIME : 060";
if (runOnce) {
for (int q = 0; q < s4.length(); q++) {
final String s4f = s4;
final int r = q;
((Activity) this.getContext()).runOnUiThread(() -> {
checkpointtextview3.setTextColor(Color.parseColor("#ADD8E6"));
checkpointtextview3.append(Character.toString(s4f.charAt(r)));
});
try {
Thread.sleep(50);
} catch (InterruptedException ie) {
}
}
}
String s5 = "TOP RECORD : 060";
if (runOnce) {
for (int q = 0; q < s5.length(); q++) {
final String s5f = s5;
final int r = q;
((Activity) this.getContext()).runOnUiThread(() -> {
checkpointtextview4.setTextColor(Color.RED);
checkpointtextview4.append(Character.toString(s5f.charAt(r)));
});
try {
Thread.sleep(50);
} catch (InterruptedException ie) {
}
}
}
String s6 = "GOOD BONUS POINTS : 1000";
if (runOnce) {
for (int q = 0; q < s6.length(); q++) {
final String s6f = s6;
final int r = q;
((Activity) this.getContext()).runOnUiThread(() -> {
checkpointtextview5.setTextColor(Color.RED);
checkpointtextview5.append(Character.toString(s6f.charAt(r)));
});
try {
Thread.sleep(50);
} catch (InterruptedException ie) {
}
}
}
if (runOnce) {
score = score + 1000;
sectionComplete++;
recent = true;
}
runOnce = false;
((Activity) this.getContext()).runOnUiThread(new Runnable() {
@Override
public void run() {
Handler handler = new Handler();
handler.postDelayed(() -> {
((ParallaxActivity) getContext()).startTime = SystemClock.elapsedRealtime();
((ParallaxActivity) getContext()).stopWatch.setBase(((ParallaxActivity) getContext()).startTime);
((ParallaxActivity) getContext()).stopWatch.start();
checkpointtextview.setText("");
checkpointtextview2.setText("");
checkpointtextview3.setText("");
checkpointtextview4.setText("");
checkpointtextview5.setText("");
checkpointtextview6.setText("");
String str = "Player 1 " + String.format("%06d", score);
tvId.setText(str);
scoring = false;
moonRover.setBuggyXdistance(0);
moonRover.setDistanceDelta(0);
moonRover.setRetardation(0);
checkpointComplete = false;
runOnce = true;
}, 3000);
}
});
} else {
if (bombed == 0) //GAME OVER
{
final int duration = Toast.LENGTH_SHORT;
((Activity) this.getContext()).runOnUiThread(new Runnable() {
@Override
public void run() {
final Toast toast = Toast.makeText(context, "GAME OVER!\nScore: " + score, duration);
toast.show();
Handler handler = new Handler();
handler.postDelayed(() -> {
toast.cancel();
bombed = 5;
score = 0;
MoonBackground.checkpoint = 'A';
String str = "Player 1 " + String.format("%06d", score);
tvId.setText(str);
}, 3000);
}
});
}
moonRover.jump(canvas, jump);
if (shoot) {
xbuggy2 = xbuggy2 + 4;
}
checkFire();
checkJump();
canvas.drawColor(Color.argb(255, 0, 0, 0));
// Draw the background parallax
drawBackground(0);
// Draw the rest of the game
paint.setTextSize(60);
paint.setColor(Color.argb(255, 255, 255, 255));
drawShots();
changeDirections();
for (UFO ufo : ufos) {
ufo.update(canvas, paint, toggleDeltaY);
}
recent = alien3.drawMissile(this, canvas, paint, buggyXDisplacement, moonRover.getBuggyXdistance(), moonRover.getBitmapRover(), moonRover.getJumpHeight());
if (recent) {
waitForTimer = true;
bexplode = true;
UFO.recent = true;
}
boolean recent2 = alien4.drawMissile(this, canvas, paint, buggyXDisplacement, moonRover.getBuggyXdistance(), moonRover.getBitmapRover(), moonRover.getJumpHeight());
if (recent || recent2) {
recent = true;
waitForTimer = true;
bexplode = true;
UFO.recent = true;
}
boolean recent3 = alien5.drawMissile(this, canvas, paint, buggyXDisplacement, moonRover.getBuggyXdistance(), moonRover.getBitmapRover(), moonRover.getJumpHeight());
//TODO: reset scenario after buggy being hit by UFO missile
if (recent || recent2 || recent3) {
recent = true;
waitForTimer = true;
bexplode = true;
UFO.recent = true;
new Timer().schedule(new SetRecent(), 10000);
new Timer().schedule(new ResetCheckpoint(), 1000);
Handler handler = new Handler(Looper.getMainLooper());
// this code runs after a while
handler.postDelayed(new Runnable() {
@Override
public void run() {
waitForTimer = false;
bexplode = false;
moonRover.setBuggyXdistance(0);
Log.d("postDelayed", "postDelayed ");
donotdrawBuggy = true;
Handler handler2 = new Handler(Looper.getMainLooper());
handler2.postDelayed(new Runnable() {
@Override
public void run() {
donotdrawBuggy = false;
bexplode = false;
Handler handler3 = new Handler(Looper.getMainLooper());
handler3.postDelayed(() -> {
recent = false;
UFO.recent = false;
}, 2000);
}
}, 2000);
}
}, 2000);
}
//checkBuggyBombed();
for (int i1 = 0; i1 < numberOfshots; i1++) {
alien3.checkBeingHit(missiles, buggyXDisplacement, moonRover.getBuggyXdistance(), canvas, explode2, paint, score, this, i1, xbuggy2);
alien4.checkBeingHit(missiles, buggyXDisplacement, moonRover.getBuggyXdistance(), canvas, explode2, paint, score, this, i1, xbuggy2);
alien5.checkBeingHit(missiles, buggyXDisplacement, moonRover.getBuggyXdistance(), canvas, explode2, paint, score, this, i1, xbuggy2);
}
drawBackground(1);
// canvas.drawText("X", (float) (50 + buggyXDistance)+moonRover.getBitmapRover().getWidth()/2, (float) (screenHeight * 0.3) - jumpHeight+buggy.getHeight(), paint);
paint.setTextSize(60);
canvas.drawText("A E J O T Z", (float) (screenWidth * 0.7), (float) (screenHeight * 0.15), paint);
// Prevent buggy from moving outside horizontal screen
if (!brake && buggyXDisplacement + moonRover.getBuggyXdistance() > screenWidth - moonRover.getBitmapRover().getWidth() - 200) {
//buggyXDistance = screenWidth - moonRover.getBitmapRover().getWidth() - 200;
moonRover.setBuggyXdistance(screenWidth - moonRover.getBitmapRover().getWidth() - 200);
}
//Log.d("buggyXDistance", "buggyXDistance " + buggyXDistance);
if (!donotdrawBuggy && !bexplode && !waitForTimer && !checkpointComplete) {
moonRover.draw(canvas, paint, (float) (buggyXDisplacement + moonRover.getBuggyXdistance()), (float) (screenHeight * 0.5) - moonRover.getJumpHeight());
} else if (!donotdrawBuggy && bexplode && !checkpointComplete) {
moonRover.explode(canvas, paint, (float) (buggyXDisplacement + moonRover.getBuggyXdistance()), (float) (screenHeight * 0.5) - moonRover.getJumpHeight());
moonRover.setDistanceDelta(0);
moonRover.setRetardation(0);
}
int inc = 0;
for (int i = 0; i < bombed; i++) {
canvas.drawBitmap(Bitmap.createScaledBitmap(moonRover.getBitmapRover(), (int) (0.50 * (moonRover.getBitmapRover().getWidth() / 3)), (int) (0.50 * moonRover.getBitmapRover().getHeight() / 3), false), inc, 100, paint);
inc = inc + getMoonRover().getBitmapRover().getWidth() / 4;
}
makeShots();
//updateDeltas();
controlVelocity();
}
ourHolder.unlockCanvasAndPost(canvas);
}
}
// Clean up our thread if the game is stopped
public void pause() {
running = false;
try {
gameThread.join();
} catch (InterruptedException e) {
// Error
//e.printStackTrace();
}
}
// Make a new thread and startMissile it
// Execution moves to our run method
public void resume() {
running = true;
gameThread = new Thread(this);
gameThread.start();
}
private void drawBackground(int position) {
// Make a copy of the relevant background
MoonBackground bg = backgrounds.get(position);
// define what portion of images to capture and
// what coordinates of screen to draw them at
// For the regular bitmap
fromRect1 = new Rect(0, 0, bg.width - bg.xClip, bg.height);
toRect1 = new Rect(bg.xClip, bg.startY, bg.width, bg.endY);
// For the reversed background
fromRect2 = new Rect(bg.width - bg.xClip, 0, bg.width, bg.height);
toRect2 = new Rect(0, bg.startY, bg.xClip, bg.endY);
//draw the two background bitmaps
if (!bg.reversedFirst) {
if (MoonBackground.checkpoint != '@' && MoonBackground.checkpoint != 'E' && position == 1) {
//canvas.drawBitmap(bg.bitmap, fromRect1, toRect1, paint);
canvas.drawBitmap(bg.bitmap2, fromRect1, toRect1, paint);
} else {
canvas.drawBitmap(bg.bitmap, fromRect1, toRect1, paint);
}
canvas.drawBitmap(bg.bitmapReversed, fromRect2, toRect2, paint);
if (MoonBackground.checkpoint != '@' && MoonBackground.checkpoint != 'A' && MoonBackground.checkpoint != 'B' && bg.xClip <= 0) { // && position == 2) {
canvas.drawBitmap(spacerock3, toRect1.left, toRect1.top, paint);
} else if (MoonBackground.checkpoint != '@' && MoonBackground.checkpoint != 'A' && bg.xClip <= 0) { // && position == 2) {
canvas.drawBitmap(spacerock2, toRect1.left, toRect1.top, paint);
} else if (MoonBackground.checkpoint != '@' && bg.xClip <= 0) { // && position == 2) {
canvas.drawBitmap(spacerock, toRect1.left, toRect1.top, paint);
}
if (position == 1) {
paint.setTextSize(160);
if (MoonBackground.checkpoint <= 'Z' && MoonBackground.checkpoint >= 'A') {
canvas.drawText(Character.toString(MoonBackground.checkpoint), bg.xClip, (float) (bg.startY * 1.4), paint);
}
if (increment) {
MoonBackground.checkpoint++;
toggleGround = true;
}
if (MoonBackground.checkpoint == 'B' && (buggyXDisplacement + moonRover.getBuggyXdistance()) < (bg.xClip + 450) && java.lang.Math.abs((buggyXDisplacement + moonRover.getBuggyXdistance()) - (bg.xClip + 450)) < moonRover.getBitmapRover().getWidth()) {
passed = true;
}
if (MoonBackground.checkpoint == 'E' && (buggyXDisplacement + moonRover.getBuggyXdistance()) < (bg.xClip + 450) && java.lang.Math.abs((buggyXDisplacement + moonRover.getBuggyXdistance()) - (bg.xClip + 450)) < moonRover.getBitmapRover().getWidth()) {
checkpointComplete = true;
toggleGround = false;
canvas.drawColor(Color.BLACK);
return;
} else if (MoonBackground.checkpoint == 'J' && (buggyXDisplacement + moonRover.getBuggyXdistance()) < (bg.xClip + 450) && java.lang.Math.abs((buggyXDisplacement + moonRover.getBuggyXdistance()) - (bg.xClip + 450)) < moonRover.getBitmapRover().getWidth()) {
checkpointComplete = true;
canvas.drawColor(Color.BLACK);
return;
} else if (MoonBackground.checkpoint == 'O' && (buggyXDisplacement + moonRover.getBuggyXdistance()) < (bg.xClip + 450) && java.lang.Math.abs((buggyXDisplacement + moonRover.getBuggyXdistance()) - (bg.xClip + 450)) < moonRover.getBitmapRover().getWidth()) {
checkpointComplete = true;
canvas.drawColor(Color.BLACK);
return;
} else if (MoonBackground.checkpoint == 'T' && (buggyXDisplacement + moonRover.getBuggyXdistance()) < (bg.xClip + 450) && java.lang.Math.abs((buggyXDisplacement + moonRover.getBuggyXdistance()) - (bg.xClip + 450)) < moonRover.getBitmapRover().getWidth()) {
checkpointComplete = true;
canvas.drawColor(Color.BLACK);
return;
} else if (MoonBackground.checkpoint == 'Z' && (buggyXDisplacement + moonRover.getBuggyXdistance()) < (bg.xClip + 450) && java.lang.Math.abs((buggyXDisplacement + moonRover.getBuggyXdistance()) - (bg.xClip + 450)) < moonRover.getBitmapRover().getWidth()) {
checkpointComplete = true;
canvas.drawColor(Color.BLACK);
return;
}
increment = false;
if (bg.xClip == bg.width) increment = true;
((Activity) this.getContext()).runOnUiThread(new Runnable() {
@Override
public void run() {
tvId1.setText(Character.toString(MoonBackground.checkpoint));
}
});
}
} else {
if (MoonBackground.checkpoint != '@' && MoonBackground.checkpoint != 'E' && position == 1)
canvas.drawBitmap(bg.bitmap2, fromRect2, toRect2, paint);
else
canvas.drawBitmap(bg.bitmap, fromRect2, toRect2, paint);
canvas.drawBitmap(bg.bitmapReversed, fromRect1, toRect1, paint);
if (MoonBackground.checkpoint != '@' && position == 1 && MoonBackground.checkpoint != 'A' && MoonBackground.checkpoint != 'B' && MoonBackground.checkpoint != 'C' && MoonBackground.checkpoint != 'E' && MoonBackground.checkpoint != 'J' && MoonBackground.checkpoint != 'T' && MoonBackground.checkpoint != 'O' && MoonBackground.checkpoint != 'Z') {
//if buggy collides with moon rock 3
if (!waitForTimer && !UFO.recent && MoonBackground.checkpoint != 'A' && MoonBackground.checkpoint != 'E' && MoonBackground.checkpoint != 'J' && MoonBackground.checkpoint != 'T' && MoonBackground.checkpoint != 'O' && MoonBackground.checkpoint != 'Z' && MoonBackground.checkpoint != '@' && !recent && (buggyXDisplacement + moonRover.getBuggyXdistance()) < (bg.xClip) && java.lang.Math.abs((screenHeight * 0.5) - moonRover.getJumpHeight() - bg.startY) < 180 && java.lang.Math.abs((buggyXDisplacement + moonRover.getBuggyXdistance()) - (bg.xClip)) < moonRover.getBitmapRover().getWidth()) {
canvas.drawBitmap(explode, (float) (buggyXDisplacement + moonRover.getBuggyXdistance()), (float) (screenHeight * 0.5) - moonRover.getJumpHeight(), paint);
bombed--;
recent = true;
waitForTimer = true;
bexplode = true;
moonRover.explode(canvas, paint, (float) (buggyXDisplacement + moonRover.getBuggyXdistance()), (float) (screenHeight * 0.5) - moonRover.getJumpHeight());
moonRover.setDistanceDelta(1.15);
moonRover.setRetardation(0.5);
jumpHeight = 0;
moonRover.setJumpHeight(0);
((Activity) this.getContext()).runOnUiThread(new Runnable() {
@Override
public void run() {
Handler handler = new Handler();
handler.postDelayed(() -> {
waitForTimer = false;
moonRover.setBuggyXdistance(0);
bexplode = false;
}, 2000);
}
});
new Timer().schedule(new SetRecent(), 10000);
new Timer().schedule(new ResetCheckpoint(), 1000);
}
canvas.drawBitmap(spacerock3, toRect1.left, toRect1.top, paint);
} else if (MoonBackground.checkpoint != '@' && position == 1 && MoonBackground.checkpoint != 'A' && MoonBackground.checkpoint != 'B' && MoonBackground.checkpoint != 'E' && MoonBackground.checkpoint != 'J' && MoonBackground.checkpoint != 'T' && MoonBackground.checkpoint != 'O' && MoonBackground.checkpoint != 'Z') {
canvas.drawBitmap(spacerock2, toRect1.left, toRect1.top, paint);
//if buggy collides with moon rock 2
if (!waitForTimer && !UFO.recent && MoonBackground.checkpoint != 'A' && MoonBackground.checkpoint != 'E' && MoonBackground.checkpoint != 'J' && MoonBackground.checkpoint != 'T' && MoonBackground.checkpoint != 'O' && MoonBackground.checkpoint != 'Z' && MoonBackground.checkpoint != '@' && !recent && (buggyXDisplacement + moonRover.getBuggyXdistance()) < (bg.xClip) && java.lang.Math.abs((screenHeight * 0.5) - moonRover.getJumpHeight() - bg.startY) < 180 && java.lang.Math.abs((buggyXDisplacement + moonRover.getBuggyXdistance()) - (bg.xClip)) < moonRover.getBitmapRover().getWidth()) { // && java.lang.Math.abs((alienBombY + screenHeight / 100 * 25 + 75 + missileOffSetY) - ((screenHeight * 0.3) - jumpHeight )) < 65) {
//canvas.drawBitmap(explode, (float) (buggyXDisplacement + buggyXDistance), (float) (screenHeight * 0.5) - moonRover.getJumpHeight(), paint);
moonRover.explode(canvas, paint, (float) (buggyXDisplacement + moonRover.getBuggyXdistance()), (float) (screenHeight * 0.5) - moonRover.getJumpHeight());
bombed--;
recent = true;
waitForTimer = true;
bexplode = true;
canvas.drawBitmap(explode, (float) (buggyXDisplacement + moonRover.getBuggyXdistance()), (float) (screenHeight * 0.5) - moonRover.getJumpHeight(), paint);
moonRover.setDistanceDelta(1.15);
moonRover.setRetardation(0.5);
jumpHeight = 0;
moonRover.setJumpHeight(0);
((Activity) this.getContext()).runOnUiThread(new Runnable() {
@Override
public void run() {
Handler handler = new Handler();
handler.postDelayed(() -> {
waitForTimer = false;
moonRover.setBuggyXdistance(0);
bexplode = false;
}, 2000);
}
});
new Timer().schedule(new SetRecent(), 10000);
new Timer().schedule(new ResetCheckpoint(), 1000);
}
} else if (MoonBackground.checkpoint != '@' && position == 1 && MoonBackground.checkpoint != 'A' && MoonBackground.checkpoint != 'E' && MoonBackground.checkpoint != 'J' && MoonBackground.checkpoint != 'T' && MoonBackground.checkpoint != 'O' && MoonBackground.checkpoint != 'Z') {
canvas.drawBitmap(spacerock, toRect1.left, toRect1.top, paint);
//if buggy collides with moon rock 1
if (!waitForTimer && !UFO.recent && MoonBackground.checkpoint != 'A' && MoonBackground.checkpoint != 'E' && MoonBackground.checkpoint != 'J' && MoonBackground.checkpoint != 'T' && MoonBackground.checkpoint != 'O' && MoonBackground.checkpoint != 'Z' && MoonBackground.checkpoint != '@' && !recent && (buggyXDisplacement + moonRover.getBuggyXdistance()) < (bg.xClip) && java.lang.Math.abs((screenHeight * 0.5) - moonRover.getJumpHeight() - bg.startY) < 180 && java.lang.Math.abs((buggyXDisplacement + moonRover.getBuggyXdistance()) - (bg.xClip)) < moonRover.getBitmapRover().getWidth()) { // && java.lang.Math.abs((alienBombY + screenHeight / 100 * 25 + 75 + missileOffSetY) - ((screenHeight * 0.3) - jumpHeight )) < 65) {
moonRover.explode(canvas, paint, (float) (buggyXDisplacement + moonRover.getBuggyXdistance()), (float) (screenHeight * 0.5) - moonRover.getJumpHeight());
bombed--;
recent = true;
waitForTimer = true;
bexplode = true;
moonRover.setDistanceDelta(1.15);
moonRover.setRetardation(0.5);
moonRover.setJumpHeight(0);
((Activity) this.getContext()).runOnUiThread(new Runnable() {
@Override
public void run() {
Handler handler = new Handler();
handler.postDelayed(() -> {
waitForTimer = false;
moonRover.setBuggyXdistance(0);
bexplode = false;
}, 2000);
}
});
new Timer().schedule(new SetRecent(), 10000);
new Timer().schedule(new ResetCheckpoint(), 1000);
}
}
}
// collide with holes when there are holes
if (!waitForTimer && !UFO.recent && bg.reversedFirst && !UFO.recent && position == 1 && moonRover.getJumpHeight() < 20 && java.lang.Math.abs(moonRover.getBuggyXdistance() + craterX + java.lang.Math.abs(bg.xClip - bg.width)) < 20) //(buggyXDisplacement + buggyXDistance) < (bg.xClip) && java.lang.Math.abs((buggyXDisplacement + buggyXDistance) - (bg.xClip)) < moonRover.getBitmapRover().getWidth())
{
canvas.drawBitmap(explode, (float) (buggyXDisplacement + moonRover.getBuggyXdistance()), (float) (screenHeight * 0.5) - moonRover.getJumpHeight(), paint);
bombed--;
recent = true;
waitForTimer = true;
bexplode = true;
canvas.drawBitmap(explode, (float) (buggyXDisplacement + moonRover.getBuggyXdistance()), (float) (screenHeight * 0.5) - moonRover.getJumpHeight(), paint);
moonRover.setDistanceDelta(1.15);
moonRover.setRetardation(0.5);
jumpHeight = 0;
moonRover.setJumpHeight(0);
((Activity) this.getContext()).runOnUiThread(new Runnable() {
@Override
public void run() {
Handler handler = new Handler();
handler.postDelayed(() -> {
waitForTimer = false;
moonRover.setBuggyXdistance(0);
bexplode = false;
}, 2000);
}
});
new Timer().schedule(new SetRecent(), 10000);
new Timer().schedule(new ResetCheckpoint(), 1000);
}
//Log.d("## hole", "hole " + (int) ((buggyXDistance) + bg.xClip -bg.width));
if (!recent && moonRover.getJumpHeight() < 30 && position == 1 && !bg.reversedFirst && (java.lang.Math.abs((moonRover.getBuggyXdistance() + craterX) - java.lang.Math.abs(bg.xClip)) < 15)) // >1
{
canvas.drawBitmap(explode, (float) (buggyXDisplacement + moonRover.getBuggyXdistance()), (float) (screenHeight * 0.5) - moonRover.getJumpHeight(), paint);
// MoonBackground.checkpoint = 'A';
bombed--;
recent = true;
waitForTimer = true;
bexplode = true;
canvas.drawBitmap(explode, (float) (buggyXDisplacement + moonRover.getBuggyXdistance()), (float) (screenHeight * 0.5) - moonRover.getJumpHeight(), paint);
moonRover.setDistanceDelta(1.15);
moonRover.setRetardation(0.5);
moonRover.setJumpHeight(0);
((Activity) this.getContext()).runOnUiThread(new Runnable() {
@Override
public void run() {
Handler handler = new Handler();
handler.postDelayed(() -> {
waitForTimer = false;
moonRover.setBuggyXdistance(0);
bexplode = false;
}, 2000);
}
});
new Timer().schedule(new SetRecent(), 10000);
new Timer().schedule(new ResetCheckpoint(), 1000);
}
}
// Because we call this from onTouchEvent, this code will be executed for both
// normal touch events and for when the system calls this using Accessibility
@Override
public boolean performClick() {
super.performClick();
launchMissile();
return true;
}
protected void launchMissile() {
missiles[index] = 350; // missile distance from buggy
index++;
xbuggy2 = 0;
shoot = true;
}
// event listener for when the user touches the screen
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = MotionEventCompat.getActionMasked(event);
int coordX = (int) event.getX();
int coordY = (int) event.getY();
//Log.d("coordY", "coordY " + coordY);
if (coordX < 220 && moonRover.getJumpHeight() == 0 && action == MotionEvent.ACTION_MOVE) {
jump = true;
shoot = false;
lastTurn3 = System.currentTimeMillis();
return true; // do nothing
}
if (coordX > 219 && action == MotionEvent.ACTION_DOWN) {
numberOfshots++;
performClick();
return true;
}
return true;
}
}
ParallaxActivity.java
public class ParallaxActivity extends Activity implements View.OnClickListener {
long startTime;
long countUp;
TextView textGoesHere;
TextView tvId;
ParallaxView parallaxView;
boolean paused = false;
double acceleration = 0;
@Override
public void onClick(View v) {
ParallaxView parallaxView = findViewById(R.id.backgroundImage);
switch (v.getId()) {
case R.id.button3:
//ParallaxView parallaxView = findViewById(R.id.backgroundImage);
parallaxView.recent = false;
parallaxView.brake = false;
parallaxView.getMoonRover().setRetardation(0);
//parallaxView.buggyXDistance = parallaxView.buggyXDistance + 3;
parallaxView.getMoonRover().increaseBuggyXdistance(3);
parallaxView.getMoonRover().setDistanceDelta(parallaxView.getMoonRover().getDistanceDelta() + acceleration);
acceleration = acceleration + 0.2;
break;
case R.id.button4:
//ParallaxView parallaxView2 = findViewById(R.id.backgroundImage);
parallaxView.recent = false;
//parallaxView.buggyXDistance = parallaxView.buggyXDistance - 7;
parallaxView.getMoonRover().decreaseBuggyXdistance(7);
acceleration = 0;
parallaxView.getMoonRover().increaseRetardation(0.2);
parallaxView.brake = true;
break;
case R.id.button2:
//ParallaxView parallaxView3 = findViewById(R.id.backgroundImage);
parallaxView.numberOfshots++;
parallaxView.recent = false;
parallaxView.launchMissile();
parallaxView.scoring = true;
break;
case R.id.button1:
//ParallaxView parallaxView4 = findViewById(R.id.backgroundImage);
if (parallaxView.getMoonRover().getDistanceDelta() < 3) {
// parallaxView4.distanceDelta = parallaxView4.distanceDelta + 0.2;
parallaxView.getMoonRover().setDistanceDelta(parallaxView.getMoonRover().getDistanceDelta()+0.2);
}
parallaxView.jump = true;
parallaxView.shoot = false;
parallaxView.lastTurn3 = System.currentTimeMillis();
break;
case R.id.button5:
if (!paused) {
paused = true;
onPause();
} else {
paused = false;
onResume();
}
break;
default:
break;
}
}
public void setText(final String s, final TextView tv) {
//TextView tv= (TextView) tf.getView().findViewById(R.id.textview1);
tv.append(String.valueOf(s));
}
Chronometer stopWatch;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Get a Display object to access screen details
Display display = getWindowManager().getDefaultDisplay();
// Load the resolution into a Point object
Point resolution = new Point();
display.getSize(resolution);
setContentView(R.layout.main_layout);
Button btn1 = findViewById(R.id.button3);
btn1.setOnClickListener(this);
Button btn2 = findViewById(R.id.button4);
btn2.setOnClickListener(this);
Button btn3 = findViewById(R.id.button2);
btn3.setOnClickListener(this);
Button btn4 = findViewById(R.id.button1);
btn4.setOnClickListener(this);
Button btn5 = findViewById(R.id.button5);
btn5.setOnClickListener(this);
tvId = findViewById(R.id.player1);
TextView tvId1 = findViewById(R.id.checkpoint);
String s1 = " A ";
tvId1.setText(s1);
parallaxView = findViewById(R.id.backgroundImage);
parallaxView.checkpointtextview = findViewById(R.id.checkpointtext);
parallaxView.checkpointtextview.setText("");
parallaxView.checkpointtextview2 = findViewById(R.id.checkpointtext2);
parallaxView.checkpointtextview2.setText("");
parallaxView.checkpointtextview3 = findViewById(R.id.checkpointtext3);
parallaxView.checkpointtextview3.setText("");
parallaxView.checkpointtextview4 = findViewById(R.id.checkpointtext4);
parallaxView.checkpointtextview4.setText("");
parallaxView.checkpointtextview5 = findViewById(R.id.checkpointtext5);
parallaxView.checkpointtextview5.setText("");
parallaxView.checkpointtextview6 = findViewById(R.id.checkpointtext6);
parallaxView.checkpointtextview6.setText("");
stopWatch = (Chronometer) findViewById(R.id.chrono);
startTime = SystemClock.elapsedRealtime();
stopWatch.setBase(startTime);
textGoesHere = (TextView) findViewById(R.id.textGoesHere);
stopWatch.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener() {
@Override
public void onChronometerTick(Chronometer arg0) {
countUp = (SystemClock.elapsedRealtime() - startTime) / 1000;
String str = String.format("%04d", countUp);
textGoesHere.setText(str);
}
});
stopWatch.start();
parallaxView.tvId1 = tvId1;
parallaxView.tvId = tvId;
}
// If the Activity is paused make sure to pause our thread
@Override
protected void onPause() {
super.onPause();
parallaxView.pause();
}
// If the Activity is resumed make sure to resume our thread
@Override
protected void onResume() {
super.onResume();
parallaxView.resume();
}
}
-
1\$\begingroup\$ This question has about a thousand lines of code. You might want to split it up or at least describe it in more detail. \$\endgroup\$l0b0– l0b02018年07月13日 06:44:28 +00:00Commented Jul 13, 2018 at 6:44
-
\$\begingroup\$ @l0b0 I split it up. I will probably create a class or an interface "CruiseControl" for autonomous vehicles which change directions like non-player moving enemies do. \$\endgroup\$Niklas Rosencrantz– Niklas Rosencrantz2018年07月23日 05:24:26 +00:00Commented Jul 23, 2018 at 5:24
2 Answers 2
My answer will also be short as there are too many things to adress at one time. But there is exactly one thing I am able to say at this point of time: You mixed up model and view.
So my suggestion is to first create a model of your game so it is runnable without ANY UI elements and connect the model to the UI afterwards.
A good way to learn this kind of separation of concerns is to force yourself writing the model not in the android studio and have the model imported if you think it is "ready". You may also consider to have another UI techonology in the first place like JavaFX. If you import the model to Android at som point you will recognize the elements that you accidently put into the UI as it has been better placed within the model.
One other thing I recognized as I had a rough review over the code: your draw()-method is very long. Not that long methods are bad from scratch but your draw method has a lot of logic in it so it would be better split into pieces.
-
1\$\begingroup\$ That seems difficult, but I will try it. I am also aware that my draw methods are long and my request for review was mostly how to split the logic up in more and smaller elements. \$\endgroup\$Niklas Rosencrantz– Niklas Rosencrantz2018年07月21日 23:10:02 +00:00Commented Jul 21, 2018 at 23:10
You are probably using Android Studio, which is based on IntelliJ. This IDE offers really many inspections to improve your code. One of them is:
variable = variable + 3;
Can be replaced with:
variable += 3;
You should enable all these inspections and decide whether to apply them. Some of the inspections contradict each other, so choose your favorite ones. And don't apply the inspections blindly, only apply them if they actually improve the code.
Doing this relieves us humans from boring review tasks so that we can concentrate on the more interesting details in the next review round.