Skip to content

Instantly share code, notes, and snippets.

@JaniKibichi
Created October 5, 2017 11:52
Show Gist options
  • Save JaniKibichi/11d75aff9725282525ec744c47399b49 to your computer and use it in GitHub Desktop.
Save JaniKibichi/11d75aff9725282525ec744c47399b49 to your computer and use it in GitHub Desktop.
SnakeGame Main Activity
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.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class MainActivity extends Activity {
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);
i = new Intent(this, GameActivity.class);
}
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