Created
October 13, 2017 17:58
-
-
Save JaniKibichi/bf7881dd5eb13fc30e722158c626ba15 to your computer and use it in GitHub Desktop.
Enhanced Snake Game
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.mjuaji.snake1720; | |
import android.app.Activity; | |
import android.content.Context; | |
import android.content.Intent; | |
import android.graphics.Bitmap; | |
import android.graphics.BitmapFactory; | |
import android.graphics.Canvas; | |
import android.graphics.Color; | |
import android.graphics.Paint; | |
import android.graphics.Point; | |
import android.graphics.Rect; | |
import android.os.Bundle; | |
import android.view.Display; | |
import android.view.KeyEvent; | |
import android.view.LayoutInflater; | |
import android.view.MotionEvent; | |
import android.view.SurfaceHolder; | |
import android.view.SurfaceView; | |
import android.view.View; | |
import android.view.ViewGroup; | |
import android.widget.Button; | |
import com.google.android.gms.games.Games; | |
public class MainActivity extends BaseGameActivity implements View.OnClickListener { | |
Button llPlay; | |
Button awardsLink; | |
com.google.android.gms.common.SignInButton sign_in_button; | |
Button sign_out_button; | |
Canvas canvas; | |
SnakeAnimView snakeAnimView; | |
//snake head sprite sheet | |
Bitmap headAnimBitmap; | |
//The portion of the bitmap to be drawn in the current frame | |
Rect rectToBeDrawn; | |
int frameHeight = 64; | |
int frameWidth = 64; | |
int numFrames = 6; | |
int frameNumber; | |
int screenWidth; | |
int screenHeight; | |
//stats | |
long lastFrameTime; | |
int fps; | |
int hi; | |
//start the game from on touch event | |
Intent i; | |
@Override | |
protected void onCreate(Bundle savedInstanceState){ | |
super.onCreate(savedInstanceState); | |
//find out the width and height of the Screen | |
Display display = getWindowManager().getDefaultDisplay(); | |
Point size = new Point(); | |
display.getSize(size); | |
screenWidth = size.x; | |
screenHeight = size.y; | |
headAnimBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.head_sprite_sheet); | |
snakeAnimView = new SnakeAnimView(this); | |
setContentView(snakeAnimView); | |
//load out UI on top of the SnakeAnimView | |
LayoutInflater mInflater = LayoutInflater.from(this); | |
View overView = mInflater.inflate(R.layout.activity_main, null); | |
this.addContentView(overView, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); | |
//game services button | |
sign_in_button = (com.google.android.gms.common.SignInButton) findViewById(R.id.sign_in_button); | |
sign_in_button.setOnClickListener(this); | |
sign_out_button = (Button) findViewById(R.id.sign_out_button); | |
sign_out_button.setOnClickListener(this); | |
awardsLink = (Button) findViewById(R.id.awardsLink); | |
awardsLink.setOnClickListener(this); | |
llPlay = (Button) findViewById(R.id.llPlay); | |
llPlay.setOnClickListener(this); | |
i = new Intent(this, GameActivity.class); | |
} | |
@Override | |
public void onSignInFailed() { | |
//sign in failed. so show the sign-in button | |
sign_in_button.setVisibility(View.VISIBLE); | |
sign_out_button.setVisibility(View.GONE); | |
} | |
@Override | |
public void onSignInSucceeded() { | |
//show sign-out button, hide the sign-in button | |
sign_in_button.setVisibility(View.GONE); | |
sign_out_button.setVisibility(View.VISIBLE); | |
llPlay.setVisibility(View.VISIBLE); | |
awardsLink.setVisibility(View.VISIBLE); | |
} | |
@Override | |
public void onClick(View view) { | |
switch(view.getId()){ | |
case R.id.sign_in_button: | |
//start the sign | |
beginUserInitiatedSignIn(); //implemented for us in BaseGameActivity | |
break; | |
case R.id.sign_out_button: | |
//sign out | |
signOut();//implemented for us in BaseGameActivity | |
//show sign-in button, hide the sign-out button | |
sign_in_button.setVisibility(View.VISIBLE); | |
sign_out_button.setVisibility(View.GONE); | |
llPlay.setVisibility(View.GONE); | |
awardsLink.setVisibility(View.GONE); | |
beginUserInitiatedSignIn(); | |
break; | |
case R.id.awardsLink: | |
startActivityForResult(Games.Achievements.getAchievementsIntent(getApiClient()),0); | |
break; | |
case R.id.llPlay: | |
startActivityForResult(Games.Leaderboards.getLeaderboardIntent(getApiClient(),getResources().getString(R.string.leaderboard_snake)),0); | |
break; | |
} | |
} | |
class SnakeAnimView extends SurfaceView implements Runnable{ | |
Thread ourThread = null; | |
SurfaceHolder ourHolder; | |
volatile boolean playingSnake; | |
Paint paint; | |
public SnakeAnimView(Context context){ | |
super(context); | |
ourHolder = getHolder(); | |
paint = new Paint(); | |
frameWidth = headAnimBitmap.getWidth()/numFrames; | |
frameHeight = headAnimBitmap.getHeight(); | |
} | |
@Override | |
public void run(){ | |
while(playingSnake){ | |
update(); | |
draw(); | |
controlFPS(); | |
} | |
} | |
public void update(){ | |
//which frame should we draw | |
rectToBeDrawn = new Rect((frameNumber*frameWidth)-1, 0, (frameNumber*frameWidth+frameWidth)-1,frameHeight); | |
//now the next frame | |
frameNumber++; | |
//dont try and draw frames that dont exist | |
if(frameNumber == numFrames){ | |
frameNumber = 0; //back to the first frame | |
} | |
} | |
public void draw(){ | |
if(ourHolder.getSurface().isValid()){ | |
canvas = ourHolder.lockCanvas(); | |
//the background | |
canvas.drawColor(Color.BLACK); | |
paint.setColor(Color.argb(255,255,255,255)); | |
paint.setTextSize(150); | |
canvas.drawText("Snake",10,150,paint); | |
paint.setTextSize(25); | |
canvas.drawText(" Hi score: " + hi, 10, screenHeight - 50, paint); | |
//draw the snake head make this Rect whatever size and location you like(startX, startY, endX, endY) | |
Rect destRect = new Rect(screenWidth/2 - 100, screenHeight/2-100, screenWidth/2+100, screenHeight/2+100); | |
canvas.drawBitmap(headAnimBitmap, rectToBeDrawn, destRect, paint); | |
ourHolder.unlockCanvasAndPost(canvas); | |
} | |
} | |
public void controlFPS(){ | |
long timeThisFrame = (System.currentTimeMillis() - lastFrameTime); | |
long timeToSleep = 500 - timeThisFrame; | |
if(timeThisFrame > 0){ | |
fps = (int)(1000/timeThisFrame); | |
} | |
if(timeToSleep > 0){ | |
try{ | |
ourThread.sleep(timeToSleep); | |
}catch(InterruptedException e){ | |
} | |
} | |
lastFrameTime = System.currentTimeMillis(); | |
} | |
public void pause(){ | |
playingSnake = false; | |
try{ | |
ourThread.join(); | |
}catch(InterruptedException e){ | |
} | |
} | |
public void resume(){ | |
playingSnake = true; | |
ourThread = new Thread(this); | |
ourThread.start(); | |
} | |
@Override | |
public boolean onTouchEvent(MotionEvent motionEvent){ | |
startActivity(i); | |
return true; | |
} | |
} | |
@Override | |
protected void onStop(){ | |
super.onStop(); | |
while(true){ | |
snakeAnimView.pause(); | |
break; | |
} | |
finish(); | |
} | |
@Override | |
protected void onResume(){ | |
super.onResume(); | |
snakeAnimView.resume(); | |
} | |
@Override | |
protected void onPause(){ | |
super.onPause(); | |
snakeAnimView.pause(); | |
} | |
public boolean onKeyDown(int keyCode, KeyEvent event){ | |
if(keyCode == KeyEvent.KEYCODE_BACK){ | |
snakeAnimView.pause(); | |
finish(); | |
return true; | |
} | |
return false; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment