Add original project.
							
								
								
									
										42
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						@@ -33,3 +33,45 @@ google-services.json
 | 
			
		||||
# Android Profiling
 | 
			
		||||
*.hprof
 | 
			
		||||
 | 
			
		||||
## Suggested ^^
 | 
			
		||||
 | 
			
		||||
## From TicTacToe project for good measure. vv
 | 
			
		||||
 | 
			
		||||
# Gradle files
 | 
			
		||||
.gradle/
 | 
			
		||||
build/
 | 
			
		||||
 | 
			
		||||
# Local configuration file (sdk path, etc)
 | 
			
		||||
local.properties
 | 
			
		||||
 | 
			
		||||
# Log/OS Files
 | 
			
		||||
*.log
 | 
			
		||||
 | 
			
		||||
# Android Studio generated files and folders
 | 
			
		||||
captures/
 | 
			
		||||
.externalNativeBuild/
 | 
			
		||||
.cxx/
 | 
			
		||||
*.apk
 | 
			
		||||
output.json
 | 
			
		||||
 | 
			
		||||
# IntelliJ
 | 
			
		||||
*.iml
 | 
			
		||||
.idea/
 | 
			
		||||
misc.xml
 | 
			
		||||
deploymentTargetDropDown.xml
 | 
			
		||||
render.experimental.xml
 | 
			
		||||
 | 
			
		||||
# Keystore files
 | 
			
		||||
*.jks
 | 
			
		||||
*.keystore
 | 
			
		||||
 | 
			
		||||
# Google Services (e.g. APIs or Firebase)
 | 
			
		||||
google-services.json
 | 
			
		||||
 | 
			
		||||
# Android Profiling
 | 
			
		||||
*.hprof
 | 
			
		||||
/app/debug/output-metadata.json
 | 
			
		||||
 | 
			
		||||
# Ha!
 | 
			
		||||
keystore/*
 | 
			
		||||
release
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								app/.gitignore
									
									
									
									
										vendored
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1 @@
 | 
			
		||||
/build
 | 
			
		||||
							
								
								
									
										30
									
								
								app/build.gradle
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,30 @@
 | 
			
		||||
apply plugin: 'com.android.application'
 | 
			
		||||
 | 
			
		||||
android {
 | 
			
		||||
    compileSdkVersion 24
 | 
			
		||||
    buildToolsVersion "24.0.2"
 | 
			
		||||
    defaultConfig {
 | 
			
		||||
        applicationId "apps.hyperling.com.platformer"
 | 
			
		||||
        minSdkVersion 15
 | 
			
		||||
        targetSdkVersion 24
 | 
			
		||||
        versionCode 10
 | 
			
		||||
        versionName "0.9"
 | 
			
		||||
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
 | 
			
		||||
    }
 | 
			
		||||
    buildTypes {
 | 
			
		||||
        release {
 | 
			
		||||
            minifyEnabled false
 | 
			
		||||
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dependencies {
 | 
			
		||||
    compile fileTree(dir: 'libs', include: ['*.jar'])
 | 
			
		||||
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
 | 
			
		||||
        exclude group: 'com.android.support', module: 'support-annotations'
 | 
			
		||||
    })
 | 
			
		||||
    compile 'com.android.support:appcompat-v7:24.2.1'
 | 
			
		||||
    compile 'com.google.android.gms:play-services-ads:9.8.0'
 | 
			
		||||
    testCompile 'junit:junit:4.12'
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										17
									
								
								app/proguard-rules.pro
									
									
									
									
										vendored
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,17 @@
 | 
			
		||||
# Add project specific ProGuard rules here.
 | 
			
		||||
# By default, the flags in this file are appended to flags specified
 | 
			
		||||
# in /home/ling/Android/Sdk/tools/proguard/proguard-android.txt
 | 
			
		||||
# You can edit the include path and order by changing the proguardFiles
 | 
			
		||||
# directive in build.gradle.
 | 
			
		||||
#
 | 
			
		||||
# For more details, see
 | 
			
		||||
#   http://developer.android.com/guide/developing/tools/proguard.html
 | 
			
		||||
 | 
			
		||||
# Add any project specific keep options here:
 | 
			
		||||
 | 
			
		||||
# If your project uses WebView with JS, uncomment the following
 | 
			
		||||
# and specify the fully qualified class name to the JavaScript interface
 | 
			
		||||
# class:
 | 
			
		||||
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
 | 
			
		||||
#   public *;
 | 
			
		||||
#}
 | 
			
		||||
@@ -0,0 +1,26 @@
 | 
			
		||||
package com.hyperling.apps.games;
 | 
			
		||||
 | 
			
		||||
import android.content.Context;
 | 
			
		||||
import android.support.test.InstrumentationRegistry;
 | 
			
		||||
import android.support.test.runner.AndroidJUnit4;
 | 
			
		||||
 | 
			
		||||
import org.junit.Test;
 | 
			
		||||
import org.junit.runner.RunWith;
 | 
			
		||||
 | 
			
		||||
import static org.junit.Assert.*;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Instrumentation test, which will execute on an Android device.
 | 
			
		||||
 *
 | 
			
		||||
 * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
 | 
			
		||||
 */
 | 
			
		||||
@RunWith(AndroidJUnit4.class)
 | 
			
		||||
public class ExampleInstrumentedTest {
 | 
			
		||||
    @Test
 | 
			
		||||
    public void useAppContext() throws Exception {
 | 
			
		||||
        // Context of the app under test.
 | 
			
		||||
        Context appContext = InstrumentationRegistry.getTargetContext();
 | 
			
		||||
 | 
			
		||||
        assertEquals("apps.hyperling.com.platformer", appContext.getPackageName());
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										41
									
								
								app/src/main/AndroidManifest.xml
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,41 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
    package="com.hyperling.apps.games">
 | 
			
		||||
 | 
			
		||||
    <!-- Include required permissions for Google Mobile Ads to run. -->
 | 
			
		||||
    <uses-permission android:name="android.permission.INTERNET" />
 | 
			
		||||
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
 | 
			
		||||
 | 
			
		||||
    <application
 | 
			
		||||
        android:allowBackup="true"
 | 
			
		||||
        android:icon="@drawable/icon"
 | 
			
		||||
        android:label="@string/app_name"
 | 
			
		||||
        android:supportsRtl="true"
 | 
			
		||||
        android:theme="@style/AppTheme"
 | 
			
		||||
        android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize">
 | 
			
		||||
        <!-- android:configChanges="orientation|keyboardHidden|screenSize" -->
 | 
			
		||||
 | 
			
		||||
        <!-- This meta-data tag is required to use Google Play Services. -->
 | 
			
		||||
        <meta-data
 | 
			
		||||
            android:name="com.google.android.gms.version"
 | 
			
		||||
            android:value="@integer/google_play_services_version" />
 | 
			
		||||
 | 
			
		||||
        <activity android:name="com.hyperling.apps.games.MainActivity">
 | 
			
		||||
            <intent-filter>
 | 
			
		||||
                <action android:name="android.intent.action.MAIN" />
 | 
			
		||||
 | 
			
		||||
                <category android:name="android.intent.category.LAUNCHER" />
 | 
			
		||||
            </intent-filter>
 | 
			
		||||
        </activity>
 | 
			
		||||
 | 
			
		||||
        <activity
 | 
			
		||||
            android:name="com.hyperling.apps.games.GameActivity"
 | 
			
		||||
            android:screenOrientation="landscape"
 | 
			
		||||
            android:theme="@style/Theme.AppCompat.NoActionBar"/>
 | 
			
		||||
 | 
			
		||||
        <activity android:name="com.hyperling.apps.games.OptionsActivity"/>
 | 
			
		||||
 | 
			
		||||
        <activity android:name="com.hyperling.apps.games.HighScoreActivity"/>
 | 
			
		||||
    </application>
 | 
			
		||||
 | 
			
		||||
</manifest>
 | 
			
		||||
							
								
								
									
										36
									
								
								app/src/main/java/com/hyperling/apps/games/AdsHelper.java
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,36 @@
 | 
			
		||||
package com.hyperling.apps.games;
 | 
			
		||||
 | 
			
		||||
import android.content.Context;
 | 
			
		||||
import android.content.SharedPreferences;
 | 
			
		||||
import android.view.View;
 | 
			
		||||
 | 
			
		||||
import com.google.android.gms.ads.AdRequest;
 | 
			
		||||
import com.google.android.gms.ads.AdView;
 | 
			
		||||
import com.google.android.gms.ads.MobileAds;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Created by ling on 12/26/16.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
public class AdsHelper {
 | 
			
		||||
 | 
			
		||||
    // To be called in onResume in Activities
 | 
			
		||||
    public static void toggleAds(SharedPreferences sharedPreferences, String adsKey, Context applicationContext, AdView mAdView){
 | 
			
		||||
        // Enable ads?
 | 
			
		||||
        boolean adsEnabled = sharedPreferences.getBoolean(adsKey, false);
 | 
			
		||||
        if (adsEnabled) {
 | 
			
		||||
            mAdView.setVisibility(View.VISIBLE);
 | 
			
		||||
            MobileAds.initialize(applicationContext, "ca-app-pub-3940256099942544~3347511713");
 | 
			
		||||
            AdRequest adRequest = new AdRequest.Builder()
 | 
			
		||||
                    .addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
 | 
			
		||||
                    .addTestDevice("C6A494DC6E7C9AC29102694D48487084") // Nexus 7
 | 
			
		||||
                    .addTestDevice("6545BCC9B60A394005546783687339B7") // Moto G
 | 
			
		||||
                    .build();
 | 
			
		||||
            mAdView.loadAd(adRequest);
 | 
			
		||||
        }
 | 
			
		||||
        else{
 | 
			
		||||
            mAdView.setVisibility(View.GONE);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										54
									
								
								app/src/main/java/com/hyperling/apps/games/Animation.java
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,54 @@
 | 
			
		||||
package com.hyperling.apps.games;
 | 
			
		||||
 | 
			
		||||
import android.graphics.Bitmap;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Created by ling on 12/22/16.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
public class Animation {
 | 
			
		||||
 | 
			
		||||
    private Bitmap[] frames;
 | 
			
		||||
    private int currentFrame;
 | 
			
		||||
    private long startTime;
 | 
			
		||||
    private long delay;
 | 
			
		||||
    private boolean playedOnce;
 | 
			
		||||
 | 
			
		||||
    public void setFrames(Bitmap[] f) {
 | 
			
		||||
        frames = f;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setDelay(long d) {
 | 
			
		||||
        delay = d;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setCurrentFrame(int cf) {
 | 
			
		||||
        currentFrame = cf;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public Bitmap getImage(){
 | 
			
		||||
        return frames[currentFrame];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public int getCurrentFrame(){
 | 
			
		||||
        return currentFrame;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean getPlayedOnce(){
 | 
			
		||||
        return playedOnce;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void update(){
 | 
			
		||||
        long elapsed = System.currentTimeMillis() - startTime;
 | 
			
		||||
        if (elapsed > delay){
 | 
			
		||||
            currentFrame++;
 | 
			
		||||
            startTime = System.currentTimeMillis();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (currentFrame == frames.length){
 | 
			
		||||
            currentFrame = 0;
 | 
			
		||||
            playedOnce = true;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										76
									
								
								app/src/main/java/com/hyperling/apps/games/Bird.java
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,76 @@
 | 
			
		||||
package com.hyperling.apps.games;
 | 
			
		||||
 | 
			
		||||
import android.graphics.Bitmap;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Created by ling on 12/23/16.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
public class Bird extends Player {
 | 
			
		||||
 | 
			
		||||
    private boolean flapping = false;
 | 
			
		||||
 | 
			
		||||
    private int lives = 0;
 | 
			
		||||
 | 
			
		||||
    public Bird(Bitmap b, int w, int h, int numFrames){
 | 
			
		||||
        super(b, w, h, numFrames);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean isFlapping() {
 | 
			
		||||
        return flapping;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setFlapping(boolean flapping) {
 | 
			
		||||
        this.flapping = flapping;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public int getLives() {
 | 
			
		||||
        return lives;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void addLives(int lives) {
 | 
			
		||||
        this.lives += lives;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void subtractLives(int lives) {
 | 
			
		||||
        this.lives -= lives;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void update() {
 | 
			
		||||
        // Go up!
 | 
			
		||||
        if (flapping){
 | 
			
		||||
            dy += -1;
 | 
			
		||||
        }
 | 
			
		||||
        // Otherwise fall
 | 
			
		||||
        else{
 | 
			
		||||
            dy += 2;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Do not fly up faster than this
 | 
			
		||||
        if (dy < -5){
 | 
			
		||||
            dy = -5;
 | 
			
		||||
        }
 | 
			
		||||
        // Do not fall faster than this
 | 
			
		||||
        if (dy > 7){
 | 
			
		||||
            dy = 7;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /***** Map limits *****/
 | 
			
		||||
        if (y < GameView.HEIGHT - getHeight() || dy < 0) {
 | 
			
		||||
            y += dy;
 | 
			
		||||
        }
 | 
			
		||||
        // Do not leave bottom of map
 | 
			
		||||
        else{
 | 
			
		||||
            y = GameView.HEIGHT - getHeight();
 | 
			
		||||
            dy = 0;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Do not leave top of map
 | 
			
		||||
        if (y < 0){
 | 
			
		||||
            y = 0;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        super.update();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										71
									
								
								app/src/main/java/com/hyperling/apps/games/BirdEnemy.java
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,71 @@
 | 
			
		||||
package com.hyperling.apps.games;
 | 
			
		||||
 | 
			
		||||
import android.graphics.Bitmap;
 | 
			
		||||
import android.graphics.Canvas;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Created by ling on 12/26/16.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
public class BirdEnemy extends GameObject {
 | 
			
		||||
 | 
			
		||||
    protected Bitmap image;
 | 
			
		||||
 | 
			
		||||
    private Animation animation;
 | 
			
		||||
 | 
			
		||||
    private int speed, damage;
 | 
			
		||||
 | 
			
		||||
    public BirdEnemy(Bitmap b, int w, int h, int numFrames, int x, int y, int speed, int damage){
 | 
			
		||||
        image = b;
 | 
			
		||||
        width = w;
 | 
			
		||||
        height = h;
 | 
			
		||||
        this.x = x;
 | 
			
		||||
        this.y = y;
 | 
			
		||||
        this.speed = speed;
 | 
			
		||||
        this.damage = damage;
 | 
			
		||||
 | 
			
		||||
        if (speed > -1){
 | 
			
		||||
            speed = -1;
 | 
			
		||||
        }
 | 
			
		||||
        if (this.y >= GameView.HEIGHT - this.height){
 | 
			
		||||
            this.y = GameView.HEIGHT - this.height;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Create animation
 | 
			
		||||
        Bitmap[] image = new Bitmap[numFrames];
 | 
			
		||||
        animation = new Animation();
 | 
			
		||||
 | 
			
		||||
        for (int i = 0; i < numFrames; i++){
 | 
			
		||||
            image[i] = Bitmap.createBitmap(b, width * i, 0, width, height);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        animation.setFrames(image);
 | 
			
		||||
 | 
			
		||||
        //animation.setDelay(100);
 | 
			
		||||
        int delay = 25 * Math.abs(speed);
 | 
			
		||||
        if (delay > 125){
 | 
			
		||||
            delay = 125;
 | 
			
		||||
        }
 | 
			
		||||
        else if (delay < 75){
 | 
			
		||||
            delay = 75;
 | 
			
		||||
        }
 | 
			
		||||
        animation.setDelay(delay);
 | 
			
		||||
        animation.setCurrentFrame((int)(Math.random() * numFrames));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void update(){
 | 
			
		||||
        animation.update();
 | 
			
		||||
 | 
			
		||||
        // Move the object
 | 
			
		||||
        x += speed;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void draw(Canvas canvas) {
 | 
			
		||||
        // Draw the object
 | 
			
		||||
        canvas.drawBitmap(animation.getImage(), getX(), getY(), null);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public int getDamage() {
 | 
			
		||||
        return damage;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										290
									
								
								app/src/main/java/com/hyperling/apps/games/BirdGameView.java
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,290 @@
 | 
			
		||||
package com.hyperling.apps.games;
 | 
			
		||||
 | 
			
		||||
import android.content.Context;
 | 
			
		||||
import android.graphics.Bitmap;
 | 
			
		||||
import android.graphics.BitmapFactory;
 | 
			
		||||
import android.graphics.Canvas;
 | 
			
		||||
import android.graphics.Color;
 | 
			
		||||
import android.graphics.Rect;
 | 
			
		||||
import android.util.Log;
 | 
			
		||||
import android.view.MotionEvent;
 | 
			
		||||
import android.view.SurfaceHolder;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Created by ling on 12/28/16.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
public class BirdGameView extends GameView {
 | 
			
		||||
    private final String birdScoreKey;
 | 
			
		||||
 | 
			
		||||
    private final int birdGameSpeed = -8;
 | 
			
		||||
    private final int birdEnemySpeedVariance = 5;
 | 
			
		||||
    private final int birdEnemySpeedConstant = 2;
 | 
			
		||||
    private final int cloudsSpeed = birdGameSpeed/2;
 | 
			
		||||
 | 
			
		||||
    private Bird bird;
 | 
			
		||||
    private Bitmap birdBitmap;
 | 
			
		||||
 | 
			
		||||
    private ArrayList<BirdEnemy> birdEnemies;
 | 
			
		||||
    private Bitmap birdEnemyBitmap;
 | 
			
		||||
 | 
			
		||||
    private final int birdWidth = 30;
 | 
			
		||||
    private final int birdHeight = 20;
 | 
			
		||||
    private final int birdFrames = 4;
 | 
			
		||||
 | 
			
		||||
    private ArrayList<ExtraLife> birdExtraLives;
 | 
			
		||||
    private Bitmap birdExtraLifeBitmap;
 | 
			
		||||
 | 
			
		||||
    private final int birdExtraLifeWidth = 20;
 | 
			
		||||
    private final int birdExtraLifeHeight = 30;
 | 
			
		||||
 | 
			
		||||
    private final int birdMaxNumEnemyRows = HEIGHT / birdHeight;
 | 
			
		||||
    private final int birdEnemySpawnRate = 25;
 | 
			
		||||
 | 
			
		||||
    private Bitmap backgroundBitmap, cloudsBitmap;
 | 
			
		||||
 | 
			
		||||
    public BirdGameView(Context context){
 | 
			
		||||
        super(context);
 | 
			
		||||
 | 
			
		||||
        // Keys
 | 
			
		||||
        birdScoreKey = resources.getString(R.string.birdScoreKey);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void displayScore(Canvas canvas){
 | 
			
		||||
        int highScore = sharedPreferences.getInt(birdScoreKey, 0);
 | 
			
		||||
        textPaint.setColor(Color.parseColor("#330066"));
 | 
			
		||||
        canvas.drawText("High: " + highScore, 0, textPaint.getTextSize(), textPaint);
 | 
			
		||||
        canvas.drawText("Current: " + bird.getScore(), 0, textPaint.getTextSize() * 2, textPaint);
 | 
			
		||||
 | 
			
		||||
        if (bird.getLives() > 0) {
 | 
			
		||||
            canvas.drawText("Lives: " + bird.getLives(), 0, textPaint.getTextSize() * 3, textPaint);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (fpsEnabled){
 | 
			
		||||
            canvas.drawText("FPS: " + thread.averageFPS, 0, HEIGHT - 1, textPaint);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (!bird.isPlaying()) {
 | 
			
		||||
            textPaint.setColor(Color.parseColor("#330066"));
 | 
			
		||||
            canvas.drawText("You are the Purple Bird", WIDTH / 4, HEIGHT / 4 - textPaint.getTextSize(), textPaint);
 | 
			
		||||
 | 
			
		||||
            textPaint.setColor(Color.parseColor("#FF9900"));
 | 
			
		||||
            canvas.drawText("Tap the Screen to Start", WIDTH / 4, HEIGHT / 4, textPaint);
 | 
			
		||||
            canvas.drawText("Hold the Screen to Fly Higher", WIDTH / 4, HEIGHT / 4 + textPaint.getTextSize(), textPaint);
 | 
			
		||||
 | 
			
		||||
            textPaint.setColor(Color.parseColor("#FF0000"));
 | 
			
		||||
            canvas.drawText("Dodge the Enemy Birds", WIDTH / 4, HEIGHT * 3 / 4, textPaint);
 | 
			
		||||
 | 
			
		||||
            textPaint.setColor(Color.parseColor("#FFFF00"));
 | 
			
		||||
            textPaint.setFakeBoldText(true);
 | 
			
		||||
            canvas.drawText("Collect the Bird Coins for Extra Lives", WIDTH / 4, HEIGHT * 3 / 4 + textPaint.getTextSize(), textPaint);
 | 
			
		||||
            textPaint.setFakeBoldText(false);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void surfaceCreated(SurfaceHolder holder) {
 | 
			
		||||
 | 
			
		||||
        // Base Object Initializations
 | 
			
		||||
        if (higherQualityEnabled) {
 | 
			
		||||
            backgroundBitmap = BitmapFactory.decodeResource(resources, R.drawable.background_forest_without_clouds);
 | 
			
		||||
            cloudsBitmap = BitmapFactory.decodeResource(resources, R.drawable.clouds);
 | 
			
		||||
        }
 | 
			
		||||
        else{
 | 
			
		||||
            backgroundBitmap = BitmapFactory.decodeResource(resources, R.drawable.background_forest);
 | 
			
		||||
        }
 | 
			
		||||
        birdBitmap = BitmapFactory.decodeResource(resources, R.drawable.bird);
 | 
			
		||||
        birdEnemyBitmap = BitmapFactory.decodeResource(resources, R.drawable.bird_enemy);
 | 
			
		||||
        birdExtraLifeBitmap = BitmapFactory.decodeResource(resources, R.drawable.bird_extra_life);
 | 
			
		||||
 | 
			
		||||
        // Game Object Initializations
 | 
			
		||||
        background = new GameBackground(backgroundBitmap);
 | 
			
		||||
        if (higherQualityEnabled) {
 | 
			
		||||
            clouds = new GameBackground(cloudsBitmap);
 | 
			
		||||
        }
 | 
			
		||||
        bird = new Bird(birdBitmap, birdWidth, birdHeight, birdFrames);
 | 
			
		||||
        birdEnemies = new ArrayList<>();
 | 
			
		||||
        birdExtraLives = new ArrayList<>();
 | 
			
		||||
 | 
			
		||||
        // Settings
 | 
			
		||||
        setGameSpeed(birdGameSpeed);
 | 
			
		||||
 | 
			
		||||
        super.surfaceCreated(holder);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean onTouchEvent(MotionEvent event) {
 | 
			
		||||
 | 
			
		||||
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
 | 
			
		||||
            if (!bird.isPlaying()) {
 | 
			
		||||
                bird.setPlaying(true);
 | 
			
		||||
 | 
			
		||||
                int lifeMiddleOfScreen = HEIGHT/2 - birdExtraLifeHeight/2;
 | 
			
		||||
                birdExtraLives.add(new ExtraLife(birdExtraLifeBitmap, birdExtraLifeWidth, birdExtraLifeHeight, WIDTH, lifeMiddleOfScreen, 1));
 | 
			
		||||
            }
 | 
			
		||||
            else{
 | 
			
		||||
                bird.setFlapping(true);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (event.getAction() == MotionEvent.ACTION_UP){
 | 
			
		||||
            bird.setFlapping(false);
 | 
			
		||||
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return super.onTouchEvent(event);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void pauseGame() {
 | 
			
		||||
        super.pauseGame(birdScoreKey, bird.getScore());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void update() {
 | 
			
		||||
        super.update();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        if (bird.isPlaying()) {
 | 
			
		||||
            background.update(gameSpeed);
 | 
			
		||||
            if (higherQualityEnabled) {
 | 
			
		||||
                clouds.update(cloudsSpeed);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            int birdLevel = bird.getScore() / (birdEnemySpawnRate * birdMaxNumEnemyRows);
 | 
			
		||||
 | 
			
		||||
            // Update extra lives before enemies :)
 | 
			
		||||
            for (int i = 0; i < birdExtraLives.size(); i++) {
 | 
			
		||||
                ExtraLife birdExtraLife = birdExtraLives.get(i);
 | 
			
		||||
                boolean removeLife = false;
 | 
			
		||||
 | 
			
		||||
                // Check if we've hit any extra lives
 | 
			
		||||
                if (bird.getRect().intersect(birdExtraLife.getRect())){
 | 
			
		||||
                    bird.addLives(birdExtraLife.getNumLives());
 | 
			
		||||
                    removeLife = true;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (removeLife || birdExtraLife.x + birdExtraLifeWidth < 0){
 | 
			
		||||
                    birdExtraLives.remove(birdExtraLife);
 | 
			
		||||
                    i--;
 | 
			
		||||
                }
 | 
			
		||||
                else{
 | 
			
		||||
                    birdExtraLife.update(birdGameSpeed);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            /***** Add new lives *****/
 | 
			
		||||
            // Only < so that lives don't appear until more than 1 bird can be on a row
 | 
			
		||||
            if (birdExtraLives.size() < birdLevel){
 | 
			
		||||
                int birdExtraLifeX = WIDTH + birdExtraLifeWidth;
 | 
			
		||||
                int birdExtraLifeY = ((int)(Math.random() * HEIGHT));;
 | 
			
		||||
                birdExtraLives.add(new ExtraLife(birdExtraLifeBitmap, birdExtraLifeWidth, birdExtraLifeHeight, birdExtraLifeX, birdExtraLifeY, 1));
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Update enemies
 | 
			
		||||
            for (int i = 0; i < birdEnemies.size(); i++){
 | 
			
		||||
                BirdEnemy birdEnemy = birdEnemies.get(i);
 | 
			
		||||
                boolean birdEnemyRemove = false;
 | 
			
		||||
 | 
			
		||||
                // Check if we've hit any enemies
 | 
			
		||||
                if (bird.getRect().intersect(birdEnemy.getRect())){
 | 
			
		||||
 | 
			
		||||
                    bird.subtractLives(birdEnemy.getDamage());
 | 
			
		||||
                    birdEnemyRemove = true;
 | 
			
		||||
 | 
			
		||||
                    if (bird.getLives() < 0) {
 | 
			
		||||
                        /***** Stop the game, save the score, and reset the player and all objects *****/
 | 
			
		||||
                        bird.setPlaying(false);
 | 
			
		||||
                        saveScore(birdScoreKey, bird.getScore());
 | 
			
		||||
 | 
			
		||||
                        // Reset
 | 
			
		||||
                        bird = new Bird(birdBitmap, birdWidth, birdHeight, birdFrames);
 | 
			
		||||
                        birdEnemies = new ArrayList<>();
 | 
			
		||||
                        birdExtraLives = new ArrayList<>();
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                birdEnemy.update();
 | 
			
		||||
 | 
			
		||||
                // Check if any enemies can be removed yet
 | 
			
		||||
                if (birdEnemyRemove || birdEnemy.x + birdEnemy.width < 0){
 | 
			
		||||
                    birdEnemies.remove(birdEnemy);
 | 
			
		||||
                    i--;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Check if we can add new enemies
 | 
			
		||||
            if (birdEnemies.size() < bird.getScore() / 25 && !thread.markerFrame){
 | 
			
		||||
                //int enemyX = WIDTH + (int)(WIDTH * Math.random());
 | 
			
		||||
                int enemyX = WIDTH + birdWidth;
 | 
			
		||||
                int enemyY = ((int)(Math.random() * HEIGHT));
 | 
			
		||||
                // Add constant so that the bird is always slower than the background
 | 
			
		||||
                // Prevents birds from looking frozen or like they're going backwards
 | 
			
		||||
                int enemySpeed = gameSpeed + ((int)(Math.random() * birdEnemySpeedVariance) + birdEnemySpeedConstant);
 | 
			
		||||
                int numBirdEnemiesInRow = 0;
 | 
			
		||||
                for (BirdEnemy birdEnemy : birdEnemies){
 | 
			
		||||
                    Log.d(TAG, "GameView.update():  enemyY=" + enemyY + ", birdEnemy.y=" + birdEnemy.y);
 | 
			
		||||
                    if (birdEnemy.getRect().intersect(new Rect(birdEnemy.x, enemyY, birdEnemy.x + birdWidth, enemyY + birdHeight))){
 | 
			
		||||
                        numBirdEnemiesInRow++;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                Log.d(TAG, "GameView.update():  birdLevel=" + birdLevel);
 | 
			
		||||
                Log.d(TAG, "GameView.update():  numBirdEnemiesInRow=" + numBirdEnemiesInRow);
 | 
			
		||||
 | 
			
		||||
                // Just for a little chaos, 1/100 chance for extra enemies
 | 
			
		||||
                boolean addExtraEnemies = ((int) (Math.random() * 100)) == 69;
 | 
			
		||||
 | 
			
		||||
                // <= so that the game can start
 | 
			
		||||
                if (numBirdEnemiesInRow <= birdLevel || addExtraEnemies){
 | 
			
		||||
                    Log.d(TAG, "GameView.update():  Adding birdEnemy!");
 | 
			
		||||
                    birdEnemies.add(new BirdEnemy(birdEnemyBitmap, birdWidth, birdHeight, birdFrames, enemyX, enemyY, enemySpeed, 1));
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            bird.update();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void draw(Canvas canvas) {
 | 
			
		||||
 | 
			
		||||
        if (canvas != null) {
 | 
			
		||||
            super.draw(canvas);
 | 
			
		||||
 | 
			
		||||
            final float scaleX = (float) getWidth()/WIDTH;
 | 
			
		||||
            final float scaleY = (float) getHeight()/HEIGHT;
 | 
			
		||||
 | 
			
		||||
            Log.d(TAG, "GameView.draw():  Canvas not null, scaling! scaleX=" + scaleX + ", scaleY=" + scaleY);
 | 
			
		||||
            Log.d(TAG, "GameView.draw():  Canvas not null, scaling! getScaleX()=" + getScaleX() + ", getScaleY()=" + getScaleY());
 | 
			
		||||
 | 
			
		||||
            final int savedState = canvas.save();
 | 
			
		||||
            canvas.scale(scaleX, scaleY);
 | 
			
		||||
 | 
			
		||||
            // Draw all the game's objects
 | 
			
		||||
            if (higherQualityEnabled) {
 | 
			
		||||
                clouds.draw(canvas);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            background.draw(canvas);
 | 
			
		||||
 | 
			
		||||
            for (ExtraLife birdExtraLife : birdExtraLives) {
 | 
			
		||||
                birdExtraLife.draw(canvas);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            for (BirdEnemy birdEnemy : birdEnemies) {
 | 
			
		||||
                birdEnemy.draw(canvas);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            displayScore(canvas);
 | 
			
		||||
 | 
			
		||||
            bird.draw(canvas);
 | 
			
		||||
 | 
			
		||||
            // Prevent canvas from infinite scaling
 | 
			
		||||
            canvas.restoreToCount(savedState);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										103
									
								
								app/src/main/java/com/hyperling/apps/games/Chicken.java
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,103 @@
 | 
			
		||||
package com.hyperling.apps.games;
 | 
			
		||||
 | 
			
		||||
import android.graphics.Bitmap;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Created by ling on 12/23/16.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
public class Chicken extends Player {
 | 
			
		||||
 | 
			
		||||
    private boolean jumping, flapping;
 | 
			
		||||
    private int lastY, lastDY;
 | 
			
		||||
    private int leftFootX, rightFootX;
 | 
			
		||||
 | 
			
		||||
    public Chicken(Bitmap b, int w, int h, int numFrames){
 | 
			
		||||
        super(b, w, h, numFrames);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean isJumping() {
 | 
			
		||||
        return jumping;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setJumping(boolean jumping) {
 | 
			
		||||
        this.jumping = jumping;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean isFlapping() {
 | 
			
		||||
        return flapping;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setFlapping(boolean flapping) {
 | 
			
		||||
        this.flapping = flapping;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void jump(){
 | 
			
		||||
        // If we are already jumping then we should flap instead
 | 
			
		||||
        if (jumping){
 | 
			
		||||
            flap();
 | 
			
		||||
        }
 | 
			
		||||
        // Jumps are more powerful than flaps
 | 
			
		||||
        else{
 | 
			
		||||
            jumping = true;
 | 
			
		||||
            dy -= 20;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void flap(){
 | 
			
		||||
        // Only allow a flap after we start falling
 | 
			
		||||
        if (!flapping){
 | 
			
		||||
            flapping = true;
 | 
			
		||||
            dy -= 10;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void update(int platformY) {
 | 
			
		||||
        // If we are in the same Y position and are not flapping, we are on solid ground.
 | 
			
		||||
        if (lastY == y && !flapping){
 | 
			
		||||
            jumping = false;
 | 
			
		||||
        }
 | 
			
		||||
        // Allow flapping once the last flap wears off.
 | 
			
		||||
        if (dy > 0){
 | 
			
		||||
            flapping = false;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Apply gravity
 | 
			
		||||
        dy += 1;
 | 
			
		||||
 | 
			
		||||
        // Do not allow super flapping
 | 
			
		||||
        if (dy < -5){
 | 
			
		||||
            dy = -5;
 | 
			
		||||
        }
 | 
			
		||||
        // Fall slower if we have jumped
 | 
			
		||||
        else if (dy > 5 && jumping){
 | 
			
		||||
            dy = 5;
 | 
			
		||||
        }
 | 
			
		||||
        // Otherwise cap gravity
 | 
			
		||||
        else if (dy > 15 && !jumping){
 | 
			
		||||
            dy = 15;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Do not fall through platforms
 | 
			
		||||
        if (y + dy > platformY - getHeight()){
 | 
			
		||||
            setY(platformY - getHeight());
 | 
			
		||||
            setDy(0);
 | 
			
		||||
        }
 | 
			
		||||
        else{
 | 
			
		||||
            y += dy;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Do not leave top of map
 | 
			
		||||
        if (y < 0){
 | 
			
		||||
            y = 0;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Remember where we used to be
 | 
			
		||||
        lastY = y;
 | 
			
		||||
        lastDY = dy;
 | 
			
		||||
 | 
			
		||||
        super.update();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										320
									
								
								app/src/main/java/com/hyperling/apps/games/ChickenGameView.java
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,320 @@
 | 
			
		||||
package com.hyperling.apps.games;
 | 
			
		||||
 | 
			
		||||
import android.content.Context;
 | 
			
		||||
import android.graphics.Bitmap;
 | 
			
		||||
import android.graphics.BitmapFactory;
 | 
			
		||||
import android.graphics.Canvas;
 | 
			
		||||
import android.graphics.Color;
 | 
			
		||||
import android.util.Log;
 | 
			
		||||
import android.view.MotionEvent;
 | 
			
		||||
import android.view.SurfaceHolder;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Created by ling on 12/28/16.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
public class ChickenGameView extends GameView {
 | 
			
		||||
 | 
			
		||||
    private Chicken chicken;
 | 
			
		||||
    private Bitmap chickenBitmap;
 | 
			
		||||
    private final int chickenWidth = 20;
 | 
			
		||||
    private final int chickenHeight = 20;
 | 
			
		||||
    private final int chickenFrames = 2;
 | 
			
		||||
 | 
			
		||||
    private final int lavaHeight = 30;
 | 
			
		||||
 | 
			
		||||
    private ArrayList<Platform> platforms;
 | 
			
		||||
    private Bitmap platformBitmap;
 | 
			
		||||
    private final int platformWidth = 32;
 | 
			
		||||
    private final int platformHeight = 400;
 | 
			
		||||
    private final int platformDefaultY = HEIGHT - lavaHeight;
 | 
			
		||||
 | 
			
		||||
    private Bitmap backgroundBitmap, lavaBitmap, cloudsBitmap;
 | 
			
		||||
 | 
			
		||||
    private int chickenGameSpeed = -4;
 | 
			
		||||
    private int cloudsSpeed = chickenGameSpeed / 2;
 | 
			
		||||
    private int lavaSpeed = chickenGameSpeed - 1;
 | 
			
		||||
 | 
			
		||||
    private ArrayList<Enemy> enemies;
 | 
			
		||||
    private Bitmap enemyBitmap;
 | 
			
		||||
    private final int enemyWidth = 32;
 | 
			
		||||
    private final int enemyHeight = 32;
 | 
			
		||||
    private final int enemyFrames = 1;
 | 
			
		||||
    private final int enemySpeed = chickenGameSpeed * 2;
 | 
			
		||||
 | 
			
		||||
    private String chickenScoreKey;
 | 
			
		||||
 | 
			
		||||
    private int maxGapSize = 200;
 | 
			
		||||
 | 
			
		||||
    public ChickenGameView(Context context) {
 | 
			
		||||
        super(context);
 | 
			
		||||
 | 
			
		||||
        // Keys
 | 
			
		||||
        chickenScoreKey = resources.getString(R.string.chickenScoreKey);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void surfaceCreated(SurfaceHolder holder) {
 | 
			
		||||
        setGameSpeed(chickenGameSpeed);
 | 
			
		||||
 | 
			
		||||
        // Create global Bitmaps
 | 
			
		||||
        if (higherQualityEnabled) {
 | 
			
		||||
            backgroundBitmap = BitmapFactory.decodeResource(resources, R.drawable.background_forest_without_clouds);
 | 
			
		||||
            lavaBitmap = BitmapFactory.decodeResource(resources, R.drawable.lava);
 | 
			
		||||
            cloudsBitmap = BitmapFactory.decodeResource(resources, R.drawable.clouds);
 | 
			
		||||
        }
 | 
			
		||||
        else{
 | 
			
		||||
            backgroundBitmap = BitmapFactory.decodeResource(resources, R.drawable.background_forest_with_lava);
 | 
			
		||||
        }
 | 
			
		||||
        chickenBitmap = BitmapFactory.decodeResource(resources, R.drawable.chicken);
 | 
			
		||||
        platformBitmap = BitmapFactory.decodeResource(resources, R.drawable.normal_platform);
 | 
			
		||||
        enemyBitmap = BitmapFactory.decodeResource(resources, R.drawable.enemy);
 | 
			
		||||
 | 
			
		||||
        // Initialize Background(s)
 | 
			
		||||
        background = new GameBackground(backgroundBitmap);
 | 
			
		||||
        if (higherQualityEnabled) {
 | 
			
		||||
            clouds = new GameBackground(cloudsBitmap);
 | 
			
		||||
            lava = new GameBackground(lavaBitmap);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        resetPlatforms();
 | 
			
		||||
 | 
			
		||||
        enemies = new ArrayList<>();
 | 
			
		||||
 | 
			
		||||
        chicken = new Chicken(chickenBitmap, chickenWidth, chickenHeight, chickenFrames);
 | 
			
		||||
 | 
			
		||||
        super.surfaceCreated(holder);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void pauseGame() {
 | 
			
		||||
        super.pauseGame(chickenScoreKey, chicken.getScore());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean onTouchEvent(MotionEvent event) {
 | 
			
		||||
 | 
			
		||||
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
 | 
			
		||||
            if (!chicken.isPlaying()) {
 | 
			
		||||
                chicken.setPlaying(true);
 | 
			
		||||
            }
 | 
			
		||||
            else {
 | 
			
		||||
                // Accelerate when moving higher in the air
 | 
			
		||||
                /*
 | 
			
		||||
                if (chicken.isJumping()) {
 | 
			
		||||
                    boost(2, 250);
 | 
			
		||||
                }
 | 
			
		||||
                // Boost harder on the a jump than a flap
 | 
			
		||||
                else{
 | 
			
		||||
                    boost(2, 500);
 | 
			
		||||
                }
 | 
			
		||||
                */
 | 
			
		||||
                chicken.jump();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return super.onTouchEvent(event);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void resetPlatforms(){
 | 
			
		||||
        platforms = new ArrayList<>();
 | 
			
		||||
 | 
			
		||||
        // Create initial platform layer
 | 
			
		||||
        int platformEndX = 0;
 | 
			
		||||
        while (platformEndX < WIDTH){
 | 
			
		||||
            Platform platform = new Platform(platformBitmap, platformWidth, platformHeight, platformEndX, platformDefaultY);
 | 
			
		||||
            platformEndX = platform.x + platform.width;
 | 
			
		||||
 | 
			
		||||
            platforms.add(platform);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void displayScore(Canvas canvas){
 | 
			
		||||
        int highScore = sharedPreferences.getInt(chickenScoreKey, 0);
 | 
			
		||||
        textPaint.setColor(Color.parseColor("#330066"));
 | 
			
		||||
        canvas.drawText("High: " + highScore, 0, textPaint.getTextSize(), textPaint);
 | 
			
		||||
        canvas.drawText("Current: " + chicken.getScore(), 0, textPaint.getTextSize() * 2, textPaint);
 | 
			
		||||
 | 
			
		||||
        if (fpsEnabled){
 | 
			
		||||
            canvas.drawText("FPS: " + thread.averageFPS, 0, HEIGHT - 1, textPaint);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (!chicken.isPlaying()) {
 | 
			
		||||
            textPaint.setColor(Color.parseColor("#330066"));
 | 
			
		||||
            canvas.drawText("You are the Purple and White Chicken", WIDTH / 4, HEIGHT / 4 - textPaint.getTextSize(), textPaint);
 | 
			
		||||
 | 
			
		||||
            textPaint.setColor(Color.parseColor("#FF9900"));
 | 
			
		||||
            canvas.drawText("Tap the Screen to Start", WIDTH / 4, HEIGHT / 4, textPaint);
 | 
			
		||||
            canvas.drawText("Tap the Screen to Jump and Flap", WIDTH / 4, HEIGHT / 4 + textPaint.getTextSize(), textPaint);
 | 
			
		||||
 | 
			
		||||
            textPaint.setColor(Color.parseColor("#FF0000"));
 | 
			
		||||
            canvas.drawText("Don't fall into the lava!", WIDTH / 4, HEIGHT * 3 / 4, textPaint);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void endGame(){
 | 
			
		||||
        // Stop the game, save, then reset the game
 | 
			
		||||
        chicken.setPlaying(false);
 | 
			
		||||
        saveScore(chickenScoreKey, chicken.getScore());
 | 
			
		||||
 | 
			
		||||
        resetPlatforms();
 | 
			
		||||
        enemies = new ArrayList<>();
 | 
			
		||||
        chicken = new Chicken(chickenBitmap, chickenWidth, chickenHeight, chickenFrames);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void update() {
 | 
			
		||||
        super.update();
 | 
			
		||||
 | 
			
		||||
        if (chicken.isPlaying()) {
 | 
			
		||||
            background.update(gameSpeed);
 | 
			
		||||
            if (higherQualityEnabled) {
 | 
			
		||||
                clouds.update(cloudsSpeed);
 | 
			
		||||
                lava.update(lavaSpeed);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Remove old platforms
 | 
			
		||||
            for (int i = 0; i < platforms.size(); i++) {
 | 
			
		||||
                Platform platform = platforms.get(i);
 | 
			
		||||
 | 
			
		||||
                platform.update(gameSpeed);
 | 
			
		||||
 | 
			
		||||
                if (platform.x + platform.width < 0) {
 | 
			
		||||
                    platforms.remove(platform);
 | 
			
		||||
                    i--;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Add new platform(s) if the last platform is already being displayed
 | 
			
		||||
            // Check where the last platform left off
 | 
			
		||||
            boolean createPlatforms = true;
 | 
			
		||||
            int lastPlatformEndX = 0;
 | 
			
		||||
            for (Platform platform : platforms) {
 | 
			
		||||
                if (platform.x > WIDTH) {
 | 
			
		||||
                    createPlatforms = false;
 | 
			
		||||
                    break;
 | 
			
		||||
                } else {
 | 
			
		||||
                    lastPlatformEndX = platform.x + platform.width;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (createPlatforms && !thread.markerFrame) {
 | 
			
		||||
                // Get X
 | 
			
		||||
                int newPlatformX;
 | 
			
		||||
                // Chance of a gap
 | 
			
		||||
                boolean createGap = ((int) (Math.random() * 100) > 69);
 | 
			
		||||
                if (createGap) {
 | 
			
		||||
                    newPlatformX = lastPlatformEndX + (int) (Math.random() * maxGapSize);
 | 
			
		||||
                } else {
 | 
			
		||||
                    newPlatformX = lastPlatformEndX;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                // Get Y
 | 
			
		||||
                int newPlatformY = platformDefaultY - ((int) (platformHeight * Math.random())) / (chickenHeight * 2);
 | 
			
		||||
 | 
			
		||||
                // Add the platform
 | 
			
		||||
                platforms.add(new Platform(platformBitmap, platformWidth, platformHeight, newPlatformX, newPlatformY));
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Check if we fell in a hole
 | 
			
		||||
            if (chicken.y > HEIGHT) {
 | 
			
		||||
                endGame();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Refresh enemies array
 | 
			
		||||
            boolean enemyOnTop = false;
 | 
			
		||||
            for (int i = 0; i < enemies.size() && i >= 0; i++) {
 | 
			
		||||
                Enemy enemy = enemies.get(i);
 | 
			
		||||
 | 
			
		||||
                Log.d(TAG, "ChickenGameView.update():  enemy.getBottomY()=" + enemy.getBottomY());
 | 
			
		||||
                // Check if we hit an enemy
 | 
			
		||||
                if (chicken.getRect().intersect(enemy.getRect())) {
 | 
			
		||||
                    endGame();
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
                // Check if enemy is off the screen
 | 
			
		||||
                else if (enemy.getEndX() <= 0) {
 | 
			
		||||
                    enemies.remove(enemy);
 | 
			
		||||
                    i--;
 | 
			
		||||
                }
 | 
			
		||||
                // Verify there is still an enemy on top
 | 
			
		||||
                else {
 | 
			
		||||
                    if (enemy.y < chickenHeight) {
 | 
			
		||||
                        enemyOnTop = true;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            Log.d(TAG, "ChickenGameView.update():  enemyOnTop=" + enemyOnTop);
 | 
			
		||||
 | 
			
		||||
            // Always prioritize an enemy on the top, else create normal enemies above all the platforms
 | 
			
		||||
            if (!thread.markerFrame) {
 | 
			
		||||
                if (!enemyOnTop) {
 | 
			
		||||
                    int enemyY = (int) (chickenHeight * Math.random());
 | 
			
		||||
                    enemies.add(new Enemy(enemyBitmap, enemyWidth, enemyHeight, enemyFrames, WIDTH, enemyY, enemySpeed, 1));
 | 
			
		||||
                }
 | 
			
		||||
                else if ((chicken.getScore() / 25) > enemies.size()) {
 | 
			
		||||
                    int newEnemyHeight = HEIGHT;
 | 
			
		||||
 | 
			
		||||
                    // Make sure the enemy is always above the platforms
 | 
			
		||||
                    for (Platform platform : platforms) {
 | 
			
		||||
                        if (platform.y < newEnemyHeight) {
 | 
			
		||||
                            newEnemyHeight = platform.y;
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    newEnemyHeight -= enemyHeight * 2;
 | 
			
		||||
                    newEnemyHeight = (int) (newEnemyHeight * Math.random());
 | 
			
		||||
                    enemies.add(new Enemy(enemyBitmap, enemyWidth, enemyHeight, enemyFrames, WIDTH, newEnemyHeight, enemySpeed, 1));
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            for (Enemy enemy : enemies){
 | 
			
		||||
                enemy.update();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            chicken.update(findPlatformY(chicken, platforms));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void draw(Canvas canvas) {
 | 
			
		||||
 | 
			
		||||
        if (canvas != null) {
 | 
			
		||||
            super.draw(canvas);
 | 
			
		||||
            final float scaleX = (float) getWidth() / WIDTH;
 | 
			
		||||
            final float scaleY = (float) getHeight() / HEIGHT;
 | 
			
		||||
 | 
			
		||||
            Log.d(TAG, "GameView.draw():  Canvas not null, scaling! scaleX=" + scaleX + ", scaleY=" + scaleY);
 | 
			
		||||
            Log.d(TAG, "GameView.draw():  Canvas not null, scaling! getScaleX()=" + getScaleX() + ", getScaleY()=" + getScaleY());
 | 
			
		||||
 | 
			
		||||
            final int savedState = canvas.save();
 | 
			
		||||
            canvas.scale(scaleX, scaleY);
 | 
			
		||||
 | 
			
		||||
            // Draw all the game's objects
 | 
			
		||||
            if (higherQualityEnabled) {
 | 
			
		||||
                clouds.draw(canvas);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            background.draw(canvas);
 | 
			
		||||
 | 
			
		||||
            if (higherQualityEnabled) {
 | 
			
		||||
                lava.draw(canvas);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            for (Platform platform : platforms) {
 | 
			
		||||
                platform.draw(canvas);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            for (Enemy enemy : enemies){
 | 
			
		||||
                enemy.draw(canvas);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            displayScore(canvas);
 | 
			
		||||
 | 
			
		||||
            chicken.draw(canvas);
 | 
			
		||||
 | 
			
		||||
            // Prevent canvas from infinite scaling
 | 
			
		||||
            canvas.restoreToCount(savedState);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										72
									
								
								app/src/main/java/com/hyperling/apps/games/Enemy.java
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,72 @@
 | 
			
		||||
package com.hyperling.apps.games;
 | 
			
		||||
 | 
			
		||||
import android.graphics.Bitmap;
 | 
			
		||||
import android.graphics.Canvas;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Created by ling on 12/26/16.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
public class Enemy extends GameObject {
 | 
			
		||||
 | 
			
		||||
    protected Bitmap image;
 | 
			
		||||
 | 
			
		||||
    private Animation animation;
 | 
			
		||||
 | 
			
		||||
    private int speed, damage;
 | 
			
		||||
 | 
			
		||||
    public Enemy(Bitmap b, int w, int h, int numFrames, int x, int y, int speed, int damage){
 | 
			
		||||
        image = b;
 | 
			
		||||
        width = w;
 | 
			
		||||
        height = h;
 | 
			
		||||
        this.x = x;
 | 
			
		||||
        this.y = y;
 | 
			
		||||
        this.speed = speed;
 | 
			
		||||
        this.damage = damage;
 | 
			
		||||
 | 
			
		||||
        if (speed > -1){
 | 
			
		||||
            speed = -1;
 | 
			
		||||
        }
 | 
			
		||||
        if (this.y >= GameView.HEIGHT - this.height){
 | 
			
		||||
            this.y = GameView.HEIGHT - this.height;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Create animation
 | 
			
		||||
        Bitmap[] image = new Bitmap[numFrames];
 | 
			
		||||
        animation = new Animation();
 | 
			
		||||
 | 
			
		||||
        for (int i = 0; i < numFrames; i++){
 | 
			
		||||
            image[i] = Bitmap.createBitmap(b, width * i, 0, width, height);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        animation.setFrames(image);
 | 
			
		||||
 | 
			
		||||
        //animation.setDelay(100);
 | 
			
		||||
        int delay = 25 * Math.abs(speed);
 | 
			
		||||
        if (delay > 125){
 | 
			
		||||
            delay = 125;
 | 
			
		||||
        }
 | 
			
		||||
        else if (delay < 75){
 | 
			
		||||
            delay = 75;
 | 
			
		||||
        }
 | 
			
		||||
        animation.setDelay(delay);
 | 
			
		||||
        animation.setCurrentFrame((int)(Math.random() * numFrames));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void update(){
 | 
			
		||||
        animation.update();
 | 
			
		||||
 | 
			
		||||
        // Move the object
 | 
			
		||||
        x += speed;
 | 
			
		||||
        super.updateEdgeLocations();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void draw(Canvas canvas) {
 | 
			
		||||
        // Draw the object
 | 
			
		||||
        canvas.drawBitmap(animation.getImage(), getX(), getY(), null);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public int getDamage() {
 | 
			
		||||
        return damage;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										34
									
								
								app/src/main/java/com/hyperling/apps/games/EnvironmentObject.java
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,34 @@
 | 
			
		||||
package com.hyperling.apps.games;
 | 
			
		||||
 | 
			
		||||
import android.graphics.Bitmap;
 | 
			
		||||
import android.graphics.Canvas;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Created by ling on 12/23/16.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
public abstract class EnvironmentObject extends GameObject {
 | 
			
		||||
 | 
			
		||||
    protected Bitmap image;
 | 
			
		||||
 | 
			
		||||
    public EnvironmentObject(Bitmap i, int w, int h, int x, int y){
 | 
			
		||||
        image = i;
 | 
			
		||||
        width = w;
 | 
			
		||||
        height = h;
 | 
			
		||||
        this.x = x;
 | 
			
		||||
        this.y = y;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void update(int gameSpeed){
 | 
			
		||||
        // Move the object
 | 
			
		||||
        x += gameSpeed;
 | 
			
		||||
 | 
			
		||||
        setEndX(getX() + getWidth());
 | 
			
		||||
        setCenterX((getX() + getEndX()) / 2);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void draw(Canvas canvas) {
 | 
			
		||||
        // Draw the object
 | 
			
		||||
        canvas.drawBitmap(image, x, y, null);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										25
									
								
								app/src/main/java/com/hyperling/apps/games/ExtraLife.java
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,25 @@
 | 
			
		||||
package com.hyperling.apps.games;
 | 
			
		||||
 | 
			
		||||
import android.graphics.Bitmap;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Created by ling on 12/26/16.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
public class ExtraLife extends EnvironmentObject {
 | 
			
		||||
 | 
			
		||||
    private int numLives;
 | 
			
		||||
 | 
			
		||||
    public ExtraLife(Bitmap b, int w, int h, int x, int y, int numLives){
 | 
			
		||||
        super(b, w, h, x, y);
 | 
			
		||||
        this.numLives = numLives;
 | 
			
		||||
 | 
			
		||||
        if (this.y >= GameView.HEIGHT - this.height){
 | 
			
		||||
            this.y = GameView.HEIGHT - this.height;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public int getNumLives() {
 | 
			
		||||
        return numLives;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										56
									
								
								app/src/main/java/com/hyperling/apps/games/GameActivity.java
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,56 @@
 | 
			
		||||
package com.hyperling.apps.games;
 | 
			
		||||
 | 
			
		||||
import android.os.Bundle;
 | 
			
		||||
import android.support.v7.app.AppCompatActivity;
 | 
			
		||||
import android.view.Window;
 | 
			
		||||
import android.view.WindowManager;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Created by ling on 12/17/16.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
public class GameActivity extends AppCompatActivity {
 | 
			
		||||
 | 
			
		||||
    BirdGameView birdGameView;
 | 
			
		||||
    ChickenGameView chickenGameView;
 | 
			
		||||
 | 
			
		||||
    private String gameType, birdGame, cowGame, pigGame, chickenGame, catGame;
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onCreate(Bundle savedInstanceState) {
 | 
			
		||||
        super.onCreate(savedInstanceState);
 | 
			
		||||
 | 
			
		||||
        requestWindowFeature(Window.FEATURE_NO_TITLE);
 | 
			
		||||
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
 | 
			
		||||
 | 
			
		||||
        gameType = GameActivity.this.getIntent().getAction();
 | 
			
		||||
 | 
			
		||||
        // Game types
 | 
			
		||||
        birdGame = getString(R.string.btnGameBird);
 | 
			
		||||
        cowGame = getString(R.string.btnGameCow);
 | 
			
		||||
        pigGame = getString(R.string.btnGamePig);
 | 
			
		||||
        chickenGame = getString(R.string.btnGameChicken);
 | 
			
		||||
        catGame = getString(R.string.btnGameCat);
 | 
			
		||||
 | 
			
		||||
        if (gameType.equals(birdGame)) {
 | 
			
		||||
            birdGameView = new BirdGameView(GameActivity.this);
 | 
			
		||||
            setContentView(birdGameView);
 | 
			
		||||
        }
 | 
			
		||||
        else if (gameType.equals(chickenGame)) {
 | 
			
		||||
            chickenGameView = new ChickenGameView(GameActivity.this);
 | 
			
		||||
            setContentView(chickenGameView);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void onPause() {
 | 
			
		||||
 | 
			
		||||
        if (gameType.equals(birdGame)) {
 | 
			
		||||
            birdGameView.pauseGame();
 | 
			
		||||
        }
 | 
			
		||||
        else if (gameType.equals(chickenGame)) {
 | 
			
		||||
            chickenGameView.pauseGame();
 | 
			
		||||
        }
 | 
			
		||||
        super.onPause();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										44
									
								
								app/src/main/java/com/hyperling/apps/games/GameBackground.java
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,44 @@
 | 
			
		||||
package com.hyperling.apps.games;
 | 
			
		||||
 | 
			
		||||
import android.graphics.Bitmap;
 | 
			
		||||
import android.graphics.Canvas;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Created by ling on 12/17/16.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
public class GameBackground {
 | 
			
		||||
 | 
			
		||||
    private Bitmap image;
 | 
			
		||||
    private int x, y;
 | 
			
		||||
 | 
			
		||||
    public GameBackground(Bitmap i){
 | 
			
		||||
        image = i;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void update(int gameSpeed){
 | 
			
		||||
        // Move the background
 | 
			
		||||
        x += gameSpeed;
 | 
			
		||||
 | 
			
		||||
        // If the image is completely off the screen, put it back to the middle.
 | 
			
		||||
        if (x <= -GameView.WIDTH || x >= GameView.WIDTH){
 | 
			
		||||
            x = 0;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void draw(Canvas canvas){
 | 
			
		||||
        // Draw the current image
 | 
			
		||||
        canvas.drawBitmap(image, x, y, null);
 | 
			
		||||
 | 
			
		||||
        // Place two more to the right since we are to the left
 | 
			
		||||
        if (x < 0){
 | 
			
		||||
            canvas.drawBitmap(image, x + GameView.WIDTH, y, null);
 | 
			
		||||
            //canvas.drawBitmap(image, x + (2 * GameView.WIDTH), y, null);
 | 
			
		||||
        }
 | 
			
		||||
        // Place two more to the left since we are to the right
 | 
			
		||||
        else if (x > 0){
 | 
			
		||||
            canvas.drawBitmap(image, x - GameView.WIDTH, y, null);
 | 
			
		||||
            //canvas.drawBitmap(image, x - (2 * GameView.WIDTH), y, null);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										101
									
								
								app/src/main/java/com/hyperling/apps/games/GameLoopThread.java
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,101 @@
 | 
			
		||||
package com.hyperling.apps.games;
 | 
			
		||||
 | 
			
		||||
import android.graphics.Canvas;
 | 
			
		||||
import android.util.Log;
 | 
			
		||||
import android.view.SurfaceHolder;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Created by ling on 12/17/16.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
public class GameLoopThread extends Thread {
 | 
			
		||||
    private final int FPS = 30;
 | 
			
		||||
    protected double averageFPS;
 | 
			
		||||
    private SurfaceHolder surfaceHolder;
 | 
			
		||||
    private GameView gameView;
 | 
			
		||||
    private boolean running;
 | 
			
		||||
    public static Canvas canvas;
 | 
			
		||||
 | 
			
		||||
    public boolean markerFrame;
 | 
			
		||||
 | 
			
		||||
    private String TAG;
 | 
			
		||||
 | 
			
		||||
    public GameLoopThread(SurfaceHolder sh, GameView gv){
 | 
			
		||||
        super();
 | 
			
		||||
        surfaceHolder = sh;
 | 
			
		||||
        gameView = gv;
 | 
			
		||||
 | 
			
		||||
        TAG = gameView.getResources().getString(R.string.TAG);
 | 
			
		||||
 | 
			
		||||
        markerFrame = false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void run() {
 | 
			
		||||
        super.run();
 | 
			
		||||
 | 
			
		||||
        long timeStart, timeRun, timeWait, timeTotal, timeTarget;
 | 
			
		||||
        timeTotal = 0;
 | 
			
		||||
        timeTarget = 1000/FPS;
 | 
			
		||||
 | 
			
		||||
        int frameCount = 0;
 | 
			
		||||
 | 
			
		||||
        while(running){
 | 
			
		||||
            timeStart = System.currentTimeMillis();
 | 
			
		||||
            canvas = null;
 | 
			
		||||
 | 
			
		||||
            try{
 | 
			
		||||
                canvas = this.surfaceHolder.lockCanvas();
 | 
			
		||||
                synchronized (surfaceHolder){
 | 
			
		||||
                    this.gameView.update();
 | 
			
		||||
                    this.gameView.draw(canvas);
 | 
			
		||||
                }
 | 
			
		||||
            } catch(Exception e){
 | 
			
		||||
                e.printStackTrace();
 | 
			
		||||
            } finally {
 | 
			
		||||
                if (canvas != null) {
 | 
			
		||||
                    try {
 | 
			
		||||
                        surfaceHolder.unlockCanvasAndPost(canvas);
 | 
			
		||||
                    } catch (Exception e) {
 | 
			
		||||
                        e.printStackTrace();
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            timeRun = (System.currentTimeMillis() - timeStart);
 | 
			
		||||
            timeWait = timeTarget - timeRun;
 | 
			
		||||
 | 
			
		||||
            if (timeWait > 0) {
 | 
			
		||||
                try {
 | 
			
		||||
                    this.sleep(timeWait);
 | 
			
		||||
                } catch (Exception e) {
 | 
			
		||||
                    e.printStackTrace();
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            timeTotal += System.currentTimeMillis()-timeStart;
 | 
			
		||||
            frameCount++;
 | 
			
		||||
            if (frameCount >= FPS){
 | 
			
		||||
                averageFPS = 1000/((timeTotal/frameCount));
 | 
			
		||||
                frameCount = 0;
 | 
			
		||||
                timeTotal = 0;
 | 
			
		||||
 | 
			
		||||
                Log.i(TAG, "GameLoopThread.run():  averageFPS=" + averageFPS);
 | 
			
		||||
                Log.d(TAG, "GameLoopThread.run():  canvas.getHeight()=" + canvas.getHeight() + ", canvas.getWidth()=" + canvas.getWidth());
 | 
			
		||||
 | 
			
		||||
                markerFrame = true;
 | 
			
		||||
            }
 | 
			
		||||
            else{
 | 
			
		||||
                markerFrame = false;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setRunning(boolean r){
 | 
			
		||||
        running = r;
 | 
			
		||||
 | 
			
		||||
        if (running) {
 | 
			
		||||
            this.start();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										116
									
								
								app/src/main/java/com/hyperling/apps/games/GameObject.java
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,116 @@
 | 
			
		||||
package com.hyperling.apps.games;
 | 
			
		||||
 | 
			
		||||
import android.graphics.Rect;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Created by ling on 12/22/16.
 | 
			
		||||
 * https://youtu.be/kGqKNpk6VJw?list=PLWweaDaGRHjvQlpLV0yZDmRKVBdy6rSlg
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
public abstract class GameObject {
 | 
			
		||||
    protected int x;
 | 
			
		||||
    protected int y;
 | 
			
		||||
    protected int dx;
 | 
			
		||||
    protected int dy;
 | 
			
		||||
    protected int width;
 | 
			
		||||
    protected int height;
 | 
			
		||||
 | 
			
		||||
    protected int centerX;
 | 
			
		||||
    protected int endX;
 | 
			
		||||
 | 
			
		||||
    protected int centerY;
 | 
			
		||||
    protected int bottomY;
 | 
			
		||||
 | 
			
		||||
    public int getX() {
 | 
			
		||||
        return x;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setX(int x) {
 | 
			
		||||
        this.x = x;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public int getY() {
 | 
			
		||||
        return y;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setY(int y) {
 | 
			
		||||
        this.y = y;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public int getDx() {
 | 
			
		||||
        return dx;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setDx(int dx) {
 | 
			
		||||
        this.dx = dx;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public int getDy() {
 | 
			
		||||
        return dy;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setDy(int dy) {
 | 
			
		||||
        this.dy = dy;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public int getWidth() {
 | 
			
		||||
        return width;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setWidth(int width) {
 | 
			
		||||
        this.width = width;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public int getHeight() {
 | 
			
		||||
        return height;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setHeight(int height) {
 | 
			
		||||
        this.height = height;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public int getCenterX() {
 | 
			
		||||
        return centerX;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setCenterX(int centerX) {
 | 
			
		||||
        this.centerX = centerX;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public int getEndX() {
 | 
			
		||||
        return endX;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setEndX(int endX) {
 | 
			
		||||
        this.endX = endX;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public int getCenterY() {
 | 
			
		||||
        return centerY;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setCenterY(int centerY) {
 | 
			
		||||
        this.centerY = centerY;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public int getBottomY() {
 | 
			
		||||
        return bottomY;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setBottomY(int bottomY) {
 | 
			
		||||
        this.bottomY = bottomY;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void updateEdgeLocations(){
 | 
			
		||||
        endX = x + width;
 | 
			
		||||
        bottomY = y + height;
 | 
			
		||||
 | 
			
		||||
        centerX = (x + endX) / 2;
 | 
			
		||||
        centerY = (y + bottomY) / 2;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public Rect getRect(){
 | 
			
		||||
        return new Rect(x, y, x + width, y + height);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										203
									
								
								app/src/main/java/com/hyperling/apps/games/GameView.java
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,203 @@
 | 
			
		||||
package com.hyperling.apps.games;
 | 
			
		||||
 | 
			
		||||
import android.content.Context;
 | 
			
		||||
import android.content.SharedPreferences;
 | 
			
		||||
import android.content.res.Resources;
 | 
			
		||||
import android.graphics.Canvas;
 | 
			
		||||
import android.text.TextPaint;
 | 
			
		||||
import android.util.Log;
 | 
			
		||||
import android.view.MotionEvent;
 | 
			
		||||
import android.view.SurfaceHolder;
 | 
			
		||||
import android.view.SurfaceView;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Created by ling on 12/17/16.
 | 
			
		||||
 * https://youtu.be/-XOMJYZmfkw?list=PLWweaDaGRHjvQlpLV0yZDmRKVBdy6rSlg
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
public abstract class GameView extends SurfaceView implements SurfaceHolder.Callback{
 | 
			
		||||
 | 
			
		||||
    public static final int WIDTH = 640;
 | 
			
		||||
    public static final int HEIGHT = 400;
 | 
			
		||||
 | 
			
		||||
    protected Resources resources;
 | 
			
		||||
    protected final String sharedPreferencesKey, higherQualityKey, fpsKey;
 | 
			
		||||
 | 
			
		||||
    protected static String TAG;
 | 
			
		||||
 | 
			
		||||
    protected SharedPreferences sharedPreferences;
 | 
			
		||||
    protected boolean higherQualityEnabled, fpsEnabled;
 | 
			
		||||
 | 
			
		||||
    protected int gameSpeed = -5;
 | 
			
		||||
    protected int boostQty;
 | 
			
		||||
    protected long boostEnd;
 | 
			
		||||
    protected boolean boosting;
 | 
			
		||||
 | 
			
		||||
    protected GameLoopThread thread;
 | 
			
		||||
    protected GameBackground background, clouds, lava;
 | 
			
		||||
 | 
			
		||||
    protected TextPaint textPaint;
 | 
			
		||||
 | 
			
		||||
    public GameView(Context context){
 | 
			
		||||
        super(context);
 | 
			
		||||
 | 
			
		||||
        // For filling strings and getting Bitmaps
 | 
			
		||||
        resources = getResources();
 | 
			
		||||
 | 
			
		||||
        // Keys
 | 
			
		||||
        sharedPreferencesKey = resources.getString(R.string.sharedPreferencesKey);
 | 
			
		||||
        higherQualityKey = resources.getString(R.string.higherQualityKey);
 | 
			
		||||
        fpsKey = resources.getString(R.string.fpsKey);
 | 
			
		||||
 | 
			
		||||
        // Initialize shared preferences
 | 
			
		||||
        sharedPreferences = context.getSharedPreferences(sharedPreferencesKey, Context.MODE_PRIVATE);
 | 
			
		||||
        higherQualityEnabled = sharedPreferences.getBoolean(higherQualityKey, false);
 | 
			
		||||
        fpsEnabled = sharedPreferences.getBoolean(fpsKey, false);
 | 
			
		||||
 | 
			
		||||
        // For output
 | 
			
		||||
        TAG = resources.getString(R.string.TAG);
 | 
			
		||||
 | 
			
		||||
        // Add the callback to SurfaceHolder (This allows control of events)
 | 
			
		||||
        getHolder().addCallback(this);
 | 
			
		||||
 | 
			
		||||
        // Initialize engine
 | 
			
		||||
        thread = new GameLoopThread(getHolder(), this);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected static String getTAG() {
 | 
			
		||||
        return TAG;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected void boost(int boostMultiplier, long boostDuration){
 | 
			
		||||
        if (!boosting){
 | 
			
		||||
            boosting = true;
 | 
			
		||||
            boostQty = boostMultiplier;
 | 
			
		||||
            boostEnd = System.currentTimeMillis() + boostDuration;
 | 
			
		||||
 | 
			
		||||
            gameSpeed *= boostQty;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected void setGameSpeed(int newSpeed){
 | 
			
		||||
        gameSpeed = newSpeed;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected int findPlatformY(Player player, ArrayList<Platform> platforms){
 | 
			
		||||
 | 
			
		||||
        // Get the tallest (smallest) platform.y where platform.y < player.y
 | 
			
		||||
        int platformHighestY = HEIGHT*2;
 | 
			
		||||
        for (Platform platform : platforms){
 | 
			
		||||
 | 
			
		||||
            if (player.endX > platform.x &&
 | 
			
		||||
                    player.x < platform.endX &&
 | 
			
		||||
                    player.centerY <= platform.y &&
 | 
			
		||||
                    platform.y < platformHighestY){
 | 
			
		||||
                Log.d(TAG, "GameView.findPlatformY():" +
 | 
			
		||||
                        "  player.x=" + player.x +
 | 
			
		||||
                        ", player.endX=" + player.endX +
 | 
			
		||||
                        ", player.centerY=" + player.centerY +
 | 
			
		||||
                        ", platform.x=" + platform.x +
 | 
			
		||||
                        ", platform.endX=" + platform.endX +
 | 
			
		||||
                        ", platform.y=" + platform.y +
 | 
			
		||||
                        ", platformHighestY=" + platformHighestY);
 | 
			
		||||
 | 
			
		||||
                platformHighestY = platform.y;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Log.d(TAG, "GameView.findPlatformY():  player.y=" + player.y + ", platformHighestY=" + platformHighestY);
 | 
			
		||||
        return platformHighestY;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void surfaceCreated(SurfaceHolder holder) {
 | 
			
		||||
        // Safe to start the thread
 | 
			
		||||
        textPaint = new TextPaint();
 | 
			
		||||
        textPaint.setTextSize(textPaint.getTextSize() * 2);
 | 
			
		||||
 | 
			
		||||
        thread.setRunning(true);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void surfaceDestroyed(SurfaceHolder holder) {
 | 
			
		||||
        // Try to stop the thread
 | 
			
		||||
        boolean retry = true;
 | 
			
		||||
        int retryCount = 0;
 | 
			
		||||
        while(retry && retryCount < 1000){
 | 
			
		||||
            try{
 | 
			
		||||
                thread.setRunning(false);
 | 
			
		||||
                thread.join();
 | 
			
		||||
                thread = null;
 | 
			
		||||
                retry = false;
 | 
			
		||||
            } catch(Exception e){
 | 
			
		||||
                e.printStackTrace();
 | 
			
		||||
                retryCount++;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean onTouchEvent(MotionEvent event) {
 | 
			
		||||
        return super.onTouchEvent(event);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected void pauseGame(String scoreKey, int score){
 | 
			
		||||
        // Save and force a commit
 | 
			
		||||
        saveScore(scoreKey, score);
 | 
			
		||||
        sharedPreferences.edit().commit();
 | 
			
		||||
 | 
			
		||||
        System.exit(1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected void saveScore(String scoreKey, int score){
 | 
			
		||||
            // Check if score is better than high score
 | 
			
		||||
            int oldScore = sharedPreferences.getInt(scoreKey, 0);
 | 
			
		||||
            Log.d(TAG, "GameView.saveScore():  score=" + score + ", oldScore=" + oldScore);
 | 
			
		||||
 | 
			
		||||
            if (score > oldScore) {
 | 
			
		||||
                SharedPreferences.Editor editor = sharedPreferences.edit();
 | 
			
		||||
                editor.putInt(scoreKey, score);
 | 
			
		||||
                editor.apply();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            int highScore = sharedPreferences.getInt(scoreKey, 0);
 | 
			
		||||
            Log.d(TAG, "GameView.saveScore():  Saved, new highScore=" + highScore);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected void update(){
 | 
			
		||||
        // Check if the boost is over and end it
 | 
			
		||||
        if (boosting && System.currentTimeMillis() > boostEnd){
 | 
			
		||||
            boosting = false;
 | 
			
		||||
            gameSpeed /= boostQty;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void draw(Canvas canvas) {
 | 
			
		||||
 | 
			
		||||
        if (canvas != null) {
 | 
			
		||||
            super.draw(canvas);
 | 
			
		||||
            /*
 | 
			
		||||
            final float scaleX = (float) getWidth()/WIDTH;
 | 
			
		||||
            final float scaleY = (float) getHeight()/HEIGHT;
 | 
			
		||||
            Log.d(TAG, "GameView.draw():  Canvas not null, scaling! scaleX=" + scaleX + ", scaleY=" + scaleY);
 | 
			
		||||
            Log.d(TAG, "GameView.draw():  Canvas not null, scaling! getScaleX()=" + getScaleX() + ", getScaleY()=" + getScaleY());
 | 
			
		||||
            final int savedState = canvas.save();
 | 
			
		||||
            canvas.scale(scaleX, scaleY);
 | 
			
		||||
 | 
			
		||||
            // Draw all the game's objects
 | 
			
		||||
            background.draw(canvas);
 | 
			
		||||
 | 
			
		||||
            // Prevent canvas from infinite scaling
 | 
			
		||||
            canvas.restoreToCount(savedState);
 | 
			
		||||
            */
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										127
									
								
								app/src/main/java/com/hyperling/apps/games/HighScoreActivity.java
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,127 @@
 | 
			
		||||
package com.hyperling.apps.games;
 | 
			
		||||
 | 
			
		||||
import android.content.SharedPreferences;
 | 
			
		||||
import android.support.v7.app.AppCompatActivity;
 | 
			
		||||
import android.os.Bundle;
 | 
			
		||||
import android.util.Log;
 | 
			
		||||
import android.widget.LinearLayout;
 | 
			
		||||
import android.widget.TextView;
 | 
			
		||||
 | 
			
		||||
import com.google.android.gms.ads.AdView;
 | 
			
		||||
 | 
			
		||||
public class HighScoreActivity extends AppCompatActivity {
 | 
			
		||||
 | 
			
		||||
    private String sharedPreferencesKey, adsKey, TAG, html;
 | 
			
		||||
    private String[] allBirdScoreKeys, allChickenScoreKeys;
 | 
			
		||||
 | 
			
		||||
    private SharedPreferences sharedPreferences;
 | 
			
		||||
 | 
			
		||||
    LeaderboardHelper leaderboardHelper;
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void onCreate(Bundle savedInstanceState) {
 | 
			
		||||
        super.onCreate(savedInstanceState);
 | 
			
		||||
        setContentView(R.layout.activity_high_score);
 | 
			
		||||
 | 
			
		||||
        TAG = getString(R.string.TAG);
 | 
			
		||||
 | 
			
		||||
        // Get keys
 | 
			
		||||
        sharedPreferencesKey = getString(R.string.sharedPreferencesKey);
 | 
			
		||||
        allBirdScoreKeys = getResources().getStringArray(R.array.allBirdScoreKeys);
 | 
			
		||||
        allChickenScoreKeys = getResources().getStringArray(R.array.allChickenScoreKeys);
 | 
			
		||||
        adsKey = getString(R.string.adsKey);
 | 
			
		||||
 | 
			
		||||
        // Shared preferences
 | 
			
		||||
        sharedPreferences = getSharedPreferences(sharedPreferencesKey, MODE_PRIVATE);
 | 
			
		||||
 | 
			
		||||
        // Bird stuff
 | 
			
		||||
        LinearLayout birdScoreLayout = (LinearLayout) findViewById(R.id.birdScoreLayout);
 | 
			
		||||
        loadScoreLayout(birdScoreLayout, allBirdScoreKeys);
 | 
			
		||||
 | 
			
		||||
        // Chicken stuff
 | 
			
		||||
        LinearLayout chickenScoreLayout = (LinearLayout) findViewById(R.id.chickenScoreLayout);
 | 
			
		||||
        loadScoreLayout(chickenScoreLayout, allChickenScoreKeys);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void loadScoreLayout(LinearLayout layout, String[] scoreKeys){
 | 
			
		||||
 | 
			
		||||
        for (String key : scoreKeys){
 | 
			
		||||
            int score = sharedPreferences.getInt(key, 0);
 | 
			
		||||
            if (score > 0){
 | 
			
		||||
                String label = key;
 | 
			
		||||
                // Add spaces to string before uppercase and numbers
 | 
			
		||||
                label = label.replaceAll(" ", "");
 | 
			
		||||
                //label = label.replaceAll("0", "");
 | 
			
		||||
                for (int i = 1; i < label.length(); i++){
 | 
			
		||||
                    if (label.charAt(i) == label.toUpperCase().charAt(i) || isNumeric(label.charAt(i))){
 | 
			
		||||
                        label = label.substring(0, i) + " " + label.substring(i);
 | 
			
		||||
                        i++;
 | 
			
		||||
                        if (isNumeric(label.charAt(i))){
 | 
			
		||||
                            label = label.substring(0, i) + "- Version " + label.substring(i);
 | 
			
		||||
                            break;
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                label = label.concat(": ");
 | 
			
		||||
                String scoreString = "" + score;
 | 
			
		||||
 | 
			
		||||
                // Create UI Objects
 | 
			
		||||
                LinearLayout linearLayout = new LinearLayout(this);
 | 
			
		||||
                TextView tvLabel = new TextView(this);
 | 
			
		||||
                TextView tvScore = new TextView(this);
 | 
			
		||||
 | 
			
		||||
                // Set their text
 | 
			
		||||
                tvLabel.setText(label);
 | 
			
		||||
                tvScore.setText(scoreString);
 | 
			
		||||
 | 
			
		||||
                // Finish the layout
 | 
			
		||||
                linearLayout.setOrientation(LinearLayout.HORIZONTAL);
 | 
			
		||||
                linearLayout.addView(tvLabel);
 | 
			
		||||
                linearLayout.addView(tvScore);
 | 
			
		||||
 | 
			
		||||
                // Add score to layout
 | 
			
		||||
                layout.addView(linearLayout);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void onResume() {
 | 
			
		||||
        leaderboardHelper = new LeaderboardHelper();
 | 
			
		||||
        displayAds();
 | 
			
		||||
        super.onResume();
 | 
			
		||||
 | 
			
		||||
        Runnable getHTML = new Runnable() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public void run() {
 | 
			
		||||
                html = leaderboardHelper.getTable("BirdScore009");
 | 
			
		||||
                Log.d(TAG, "HighScoreActivity.onResume():  html=" + html);
 | 
			
		||||
            }
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        Thread t = new Thread(getHTML);
 | 
			
		||||
        t.start();
 | 
			
		||||
 | 
			
		||||
        Log.d(TAG, "HighScoreActivity.onResume()  html=" + html);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void displayAds(){
 | 
			
		||||
        AdsHelper.toggleAds(sharedPreferences, adsKey, getApplicationContext(), (AdView) findViewById(R.id.adViewHighScores));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private boolean isNumeric(char c){
 | 
			
		||||
        try{
 | 
			
		||||
            String s = "" + c;
 | 
			
		||||
            int i = Integer.parseInt(s);
 | 
			
		||||
            if (i >= 0) {
 | 
			
		||||
                return true;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        catch (Exception e){
 | 
			
		||||
            //e.printStackTrace();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										69
									
								
								app/src/main/java/com/hyperling/apps/games/LeaderboardHelper.java
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,69 @@
 | 
			
		||||
package com.hyperling.apps.games;
 | 
			
		||||
 | 
			
		||||
import android.util.Log;
 | 
			
		||||
 | 
			
		||||
import java.io.BufferedReader;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.io.InputStream;
 | 
			
		||||
import java.io.InputStreamReader;
 | 
			
		||||
import java.net.URL;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Created by ling on 1/3/17.
 | 
			
		||||
 * Get Unique Device ID: http://stackoverflow.com/questions/16869482/how-to-get-unique-device-hardware-id-in-android#16869491
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
public class LeaderboardHelper {
 | 
			
		||||
 | 
			
		||||
    private final String baseURL = "https://hyperling.com:1337/hyper_games/";
 | 
			
		||||
    private String getVariables = "";
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    public void addVariable(String key, String value){
 | 
			
		||||
        if (getVariables.length() == 0) {
 | 
			
		||||
            getVariables += "?";
 | 
			
		||||
        }
 | 
			
		||||
        else{
 | 
			
		||||
            getVariables += "&";
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        getVariables += key + "=" + value;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void clearVariables(){
 | 
			
		||||
        getVariables = "";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getTable(String id){
 | 
			
		||||
        String newURL = baseURL + "?leaderboard_id=" + id;
 | 
			
		||||
        String html = "";
 | 
			
		||||
 | 
			
		||||
        URL url;
 | 
			
		||||
        InputStream is = null;
 | 
			
		||||
        BufferedReader br;
 | 
			
		||||
        String line;
 | 
			
		||||
 | 
			
		||||
        try {
 | 
			
		||||
            url = new URL(newURL);
 | 
			
		||||
            is = url.openStream();  // throws an IOException
 | 
			
		||||
            br = new BufferedReader(new InputStreamReader(is));
 | 
			
		||||
 | 
			
		||||
            while ((line = br.readLine()) != null) {
 | 
			
		||||
                html = html.concat(line);
 | 
			
		||||
            }
 | 
			
		||||
        } catch (Exception e) {
 | 
			
		||||
            e.printStackTrace();
 | 
			
		||||
        } finally {
 | 
			
		||||
            try {
 | 
			
		||||
                if (is != null) is.close();
 | 
			
		||||
            } catch (IOException ioe) {
 | 
			
		||||
                // nothing to see here
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return html;
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										171
									
								
								app/src/main/java/com/hyperling/apps/games/MainActivity.java
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,171 @@
 | 
			
		||||
package com.hyperling.apps.games;
 | 
			
		||||
 | 
			
		||||
import android.content.Intent;
 | 
			
		||||
import android.content.SharedPreferences;
 | 
			
		||||
import android.support.v7.app.AppCompatActivity;
 | 
			
		||||
import android.os.Bundle;
 | 
			
		||||
import android.util.Log;
 | 
			
		||||
import android.view.View;
 | 
			
		||||
import android.widget.Button;
 | 
			
		||||
 | 
			
		||||
import com.google.android.gms.ads.AdView;
 | 
			
		||||
 | 
			
		||||
public class MainActivity extends AppCompatActivity {
 | 
			
		||||
 | 
			
		||||
    private Button btnGameBird, btnGameCow, btnGamePig, btnGameChicken, btnGameCat, btnGameSquirrel, btnOptions, btnHighScores, btnHelp;
 | 
			
		||||
 | 
			
		||||
    private String TAG, sharedPreferencesKey, adsKey, birdScoreKey, chickenScoreKey;
 | 
			
		||||
 | 
			
		||||
    private SharedPreferences sharedPreferences;
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void onCreate(Bundle savedInstanceState) {
 | 
			
		||||
        super.onCreate(savedInstanceState);
 | 
			
		||||
 | 
			
		||||
        setContentView(R.layout.activity_main);
 | 
			
		||||
 | 
			
		||||
        TAG = getString(R.string.TAG);
 | 
			
		||||
 | 
			
		||||
        // Keys
 | 
			
		||||
        sharedPreferencesKey = getString(R.string.sharedPreferencesKey);
 | 
			
		||||
        adsKey = getString(R.string.adsKey);
 | 
			
		||||
        birdScoreKey = getString(R.string.birdScoreKey);
 | 
			
		||||
        chickenScoreKey = getString(R.string.chickenScoreKey);
 | 
			
		||||
 | 
			
		||||
        // Shared Preferences
 | 
			
		||||
        sharedPreferences = getSharedPreferences(sharedPreferencesKey, MODE_PRIVATE);
 | 
			
		||||
 | 
			
		||||
        // Initialize buttons
 | 
			
		||||
        btnGameBird = (Button) findViewById(R.id.btnBirdGame);
 | 
			
		||||
        btnGameCow = (Button) findViewById(R.id.btnGameCow);
 | 
			
		||||
        btnGamePig = (Button) findViewById(R.id.btnGamePig);
 | 
			
		||||
        btnGameChicken = (Button) findViewById(R.id.btnGameChicken);
 | 
			
		||||
        btnGameCat = (Button) findViewById(R.id.btnGameCat);
 | 
			
		||||
        btnGameSquirrel = (Button) findViewById(R.id.btnGameSquirrel);
 | 
			
		||||
        btnOptions = (Button) findViewById(R.id.btnOptions);
 | 
			
		||||
        btnHighScores = (Button) findViewById(R.id.btnHighScores);
 | 
			
		||||
        btnHelp = (Button) findViewById(R.id.btnHelp);
 | 
			
		||||
 | 
			
		||||
        // Set up game buttons
 | 
			
		||||
        btnGameBird.setOnClickListener(new View.OnClickListener() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public void onClick(View v) {
 | 
			
		||||
                doGameButton((Button) v);
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
        btnGameCow.setOnClickListener(new View.OnClickListener() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public void onClick(View v) {
 | 
			
		||||
                doGameButton((Button) v);
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
        btnGamePig.setOnClickListener(new View.OnClickListener() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public void onClick(View v) {
 | 
			
		||||
                doGameButton((Button) v);
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
        btnGameChicken.setOnClickListener(new View.OnClickListener() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public void onClick(View v) {
 | 
			
		||||
                doGameButton((Button) v);
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
        btnGameCat.setOnClickListener(new View.OnClickListener() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public void onClick(View v) {
 | 
			
		||||
                doGameButton((Button) v);
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
        btnGameSquirrel.setOnClickListener(new View.OnClickListener() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public void onClick(View v) {
 | 
			
		||||
                doGameButton((Button) v);
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        // Set up other buttons
 | 
			
		||||
        btnOptions.setOnClickListener(new View.OnClickListener() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public void onClick(View v) {
 | 
			
		||||
                doOptionsButton();
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
        btnHighScores.setOnClickListener(new View.OnClickListener() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public void onClick(View v) {
 | 
			
		||||
                doHighScoresButton();
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void onResume() {
 | 
			
		||||
        displayAds();
 | 
			
		||||
 | 
			
		||||
        // Append high scores to button text
 | 
			
		||||
        int score;
 | 
			
		||||
        String newText;
 | 
			
		||||
 | 
			
		||||
        score = sharedPreferences.getInt(birdScoreKey, 0);
 | 
			
		||||
        Log.d(TAG, "MainActivity.onResume():  birdScore=" + score);
 | 
			
		||||
        if (score > 0) {
 | 
			
		||||
            newText = getString(R.string.btnGameBird) + '\n' + getString(R.string.btnHighScoreSubHeader).concat(" ") + score;
 | 
			
		||||
            Log.d(TAG, "MainActivity.onResume():  newText=" + newText);
 | 
			
		||||
            btnGameBird.setText(newText);
 | 
			
		||||
        }
 | 
			
		||||
        else{
 | 
			
		||||
            btnGameBird.setText(getString(R.string.btnGameBird));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        score = sharedPreferences.getInt(chickenScoreKey, 0);
 | 
			
		||||
        if (score > 0) {
 | 
			
		||||
            newText = getString(R.string.btnGameChicken) + '\n' + getString(R.string.btnHighScoreSubHeader).concat(" ") + score;
 | 
			
		||||
            Log.d(TAG, "MainActivity.onResume():  newText=" + newText);
 | 
			
		||||
            btnGameChicken.setText(newText);
 | 
			
		||||
        }
 | 
			
		||||
        else{
 | 
			
		||||
            btnGameChicken.setText(getString(R.string.btnGameChicken));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        super.onResume();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Start the game
 | 
			
		||||
    private void doGameButton(Button b){
 | 
			
		||||
        Log.i(TAG, "MainActivity.doCowGameButton()");
 | 
			
		||||
 | 
			
		||||
        // Only get the game name, not the high score
 | 
			
		||||
        String gameType, buttonText;
 | 
			
		||||
        buttonText = b.getText().toString();
 | 
			
		||||
        int newLine = buttonText.indexOf('\n');
 | 
			
		||||
        if (newLine > 0) {
 | 
			
		||||
            gameType = buttonText.substring(0, buttonText.indexOf('\n'));
 | 
			
		||||
        }
 | 
			
		||||
        else{
 | 
			
		||||
            gameType = buttonText;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Start the GameActivity
 | 
			
		||||
        Intent game = new Intent(MainActivity.this, GameActivity.class);
 | 
			
		||||
        game.setAction(gameType);
 | 
			
		||||
        startActivity(game);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Go to OptionsActivity
 | 
			
		||||
    private void doOptionsButton(){
 | 
			
		||||
        Log.i(TAG, "MainActivity.doOptionsButton()");
 | 
			
		||||
 | 
			
		||||
        Intent options = new Intent(MainActivity.this, OptionsActivity.class);
 | 
			
		||||
        startActivity(options);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void displayAds(){
 | 
			
		||||
        AdsHelper.toggleAds(sharedPreferences, adsKey, getApplicationContext(), (AdView) findViewById(R.id.adViewMain));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void doHighScoresButton(){
 | 
			
		||||
        Intent highScores = new Intent(MainActivity.this, HighScoreActivity.class);
 | 
			
		||||
        startActivity(highScores);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										187
									
								
								app/src/main/java/com/hyperling/apps/games/OptionsActivity.java
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,187 @@
 | 
			
		||||
package com.hyperling.apps.games;
 | 
			
		||||
 | 
			
		||||
import android.content.Intent;
 | 
			
		||||
import android.content.SharedPreferences;
 | 
			
		||||
import android.os.Bundle;
 | 
			
		||||
import android.support.v7.app.AppCompatActivity;
 | 
			
		||||
import android.view.View;
 | 
			
		||||
import android.view.WindowManager;
 | 
			
		||||
import android.widget.Button;
 | 
			
		||||
import android.widget.CheckBox;
 | 
			
		||||
import android.widget.RelativeLayout;
 | 
			
		||||
 | 
			
		||||
import com.google.android.gms.ads.AdRequest;
 | 
			
		||||
import com.google.android.gms.ads.AdView;
 | 
			
		||||
import com.google.android.gms.ads.MobileAds;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Created by ling on 12/22/16.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
public class OptionsActivity extends AppCompatActivity {
 | 
			
		||||
 | 
			
		||||
    private String sharedPreferencesKey, adsKey, higherQualityKey, fpsKey;
 | 
			
		||||
 | 
			
		||||
    private SharedPreferences sharedPreferences;
 | 
			
		||||
 | 
			
		||||
    private RelativeLayout layoutAds, layoutHigherQuality, layoutFPS;
 | 
			
		||||
    private CheckBox cbAds, cbHigherQuality, cbFPS;
 | 
			
		||||
    private boolean adsEnabled, higherQualityEnabled, fpsEnabled;
 | 
			
		||||
 | 
			
		||||
    private Button btnDeletePreferences, btnConfirmDeletePreferences;
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onCreate(Bundle savedInstanceState) {
 | 
			
		||||
        super.onCreate(savedInstanceState);
 | 
			
		||||
        setContentView(R.layout.activity_options);
 | 
			
		||||
 | 
			
		||||
        // Prevent the keyboard from popping up automatically
 | 
			
		||||
        this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
 | 
			
		||||
 | 
			
		||||
        // Get SharedPreferences
 | 
			
		||||
        sharedPreferencesKey = getString(R.string.sharedPreferencesKey);
 | 
			
		||||
        sharedPreferences = getSharedPreferences(sharedPreferencesKey, MODE_PRIVATE);
 | 
			
		||||
 | 
			
		||||
        // Set up Ads
 | 
			
		||||
        adsKey = getString(R.string.adsKey);
 | 
			
		||||
        layoutAds = (RelativeLayout) findViewById(R.id.optionAdsLayout);
 | 
			
		||||
        cbAds = (CheckBox) findViewById(R.id.optionAdsCheckBox);
 | 
			
		||||
        layoutAds.setOnClickListener(new View.OnClickListener() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public void onClick(View v) {
 | 
			
		||||
                flipOption(adsKey);
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
        cbAds.setOnClickListener(new View.OnClickListener() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public void onClick(View v) {
 | 
			
		||||
                flipOption(adsKey);
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
        setAds();
 | 
			
		||||
 | 
			
		||||
        // Higher Quality Content
 | 
			
		||||
        higherQualityKey = getString(R.string.higherQualityKey);
 | 
			
		||||
        layoutHigherQuality = (RelativeLayout) findViewById(R.id.optionHigherQualityLayout);
 | 
			
		||||
        cbHigherQuality = (CheckBox) findViewById(R.id.optionHigherQualityCheckBox);
 | 
			
		||||
        layoutHigherQuality.setOnClickListener(new View.OnClickListener() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public void onClick(View v) {
 | 
			
		||||
                flipOption(higherQualityKey);
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
        cbHigherQuality.setOnClickListener(new View.OnClickListener() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public void onClick(View v) {
 | 
			
		||||
                flipOption(higherQualityKey);
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
        setHigherQuality();
 | 
			
		||||
 | 
			
		||||
        // In-Game FPS
 | 
			
		||||
        fpsKey = getString(R.string.fpsKey);
 | 
			
		||||
        layoutFPS = (RelativeLayout) findViewById(R.id.optionFPSLayout);
 | 
			
		||||
        cbFPS = (CheckBox) findViewById(R.id.fpsCheckBox);
 | 
			
		||||
        layoutFPS.setOnClickListener(new View.OnClickListener() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public void onClick(View v) {
 | 
			
		||||
                flipOption(fpsKey);
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
        cbFPS.setOnClickListener(new View.OnClickListener() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public void onClick(View v) {
 | 
			
		||||
                flipOption(fpsKey);
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
        setFPS();
 | 
			
		||||
 | 
			
		||||
        // Reset buttons
 | 
			
		||||
        btnDeletePreferences = (Button) findViewById(R.id.btnDeletePreferences);
 | 
			
		||||
        btnConfirmDeletePreferences = (Button) findViewById(R.id.btnConfirmDeletePreferences);
 | 
			
		||||
 | 
			
		||||
        btnDeletePreferences.setOnClickListener(new View.OnClickListener() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public void onClick(View v) {
 | 
			
		||||
                showConfirmDeletePreferencesButton((Button) v);
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
        btnConfirmDeletePreferences.setOnClickListener(new View.OnClickListener() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public void onClick(View v) {
 | 
			
		||||
                deletePreferences();
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void flipOption(String key){
 | 
			
		||||
        boolean option = sharedPreferences.getBoolean(key, false);
 | 
			
		||||
 | 
			
		||||
        // Save the setting
 | 
			
		||||
        SharedPreferences.Editor editor = sharedPreferences.edit();
 | 
			
		||||
        editor.putBoolean(key, !option);
 | 
			
		||||
        editor.apply();
 | 
			
		||||
 | 
			
		||||
        // Change the box
 | 
			
		||||
        if (key.equals(adsKey)){
 | 
			
		||||
            setAds();
 | 
			
		||||
        }
 | 
			
		||||
        else if (key.equals(higherQualityKey)){
 | 
			
		||||
            setHigherQuality();
 | 
			
		||||
        }
 | 
			
		||||
        else if (key.equals(fpsKey)){
 | 
			
		||||
            setFPS();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void setAds(){
 | 
			
		||||
        adsEnabled = sharedPreferences.getBoolean(adsKey, false);
 | 
			
		||||
        cbAds.setChecked(adsEnabled);
 | 
			
		||||
        toggleAds();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void toggleAds(){
 | 
			
		||||
        // Enable ads?
 | 
			
		||||
        adsEnabled = sharedPreferences.getBoolean(adsKey, false);
 | 
			
		||||
        AdView mAdView = (AdView) findViewById(R.id.adViewOptions);
 | 
			
		||||
        if (adsEnabled) {
 | 
			
		||||
            mAdView.setVisibility(View.VISIBLE);
 | 
			
		||||
            MobileAds.initialize(getApplicationContext(), "ca-app-pub-3940256099942544~3347511713");
 | 
			
		||||
            AdRequest adRequest = new AdRequest.Builder()
 | 
			
		||||
                    .addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
 | 
			
		||||
                    .addTestDevice("C6A494DC6E7C9AC29102694D48487084") // Nexus 7
 | 
			
		||||
                    .addTestDevice("6545BCC9B60A394005546783687339B7") // Moto G
 | 
			
		||||
                    .build();
 | 
			
		||||
            mAdView.loadAd(adRequest);
 | 
			
		||||
        }
 | 
			
		||||
        else{
 | 
			
		||||
            mAdView.setVisibility(View.GONE);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setHigherQuality() {
 | 
			
		||||
        higherQualityEnabled = sharedPreferences.getBoolean(higherQualityKey, false);
 | 
			
		||||
        cbHigherQuality.setChecked(higherQualityEnabled);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setFPS() {
 | 
			
		||||
        fpsEnabled = sharedPreferences.getBoolean(fpsKey, false);
 | 
			
		||||
        cbFPS.setChecked(fpsEnabled);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void showConfirmDeletePreferencesButton(Button callButton){
 | 
			
		||||
        callButton.setEnabled(false);
 | 
			
		||||
        btnConfirmDeletePreferences.setVisibility(View.VISIBLE);
 | 
			
		||||
        btnConfirmDeletePreferences.setEnabled(true);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void deletePreferences(){
 | 
			
		||||
        SharedPreferences.Editor editor = sharedPreferences.edit();
 | 
			
		||||
        editor.clear();
 | 
			
		||||
        editor.apply();
 | 
			
		||||
 | 
			
		||||
        Intent resetScreen = new Intent(OptionsActivity.this, OptionsActivity.class);
 | 
			
		||||
        startActivity(resetScreen);
 | 
			
		||||
        finish();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										19
									
								
								app/src/main/java/com/hyperling/apps/games/Platform.java
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,19 @@
 | 
			
		||||
package com.hyperling.apps.games;
 | 
			
		||||
 | 
			
		||||
import android.graphics.Bitmap;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Created by ling on 12/23/16.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
public class Platform extends EnvironmentObject {
 | 
			
		||||
 | 
			
		||||
    public Platform(Bitmap b, int w, int h, int x, int y){
 | 
			
		||||
        super(b, w, h, x, y);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void update(int gameSpeed) {
 | 
			
		||||
        super.update(gameSpeed);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										155
									
								
								app/src/main/java/com/hyperling/apps/games/Player.java
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,155 @@
 | 
			
		||||
package com.hyperling.apps.games;
 | 
			
		||||
 | 
			
		||||
import android.graphics.Bitmap;
 | 
			
		||||
import android.graphics.Canvas;
 | 
			
		||||
import android.util.Log;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Created by ling on 12/22/16.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
public abstract class Player extends GameObject {
 | 
			
		||||
 | 
			
		||||
    private String TAG;
 | 
			
		||||
 | 
			
		||||
    //private Bitmap spritesheet;
 | 
			
		||||
    private int score;
 | 
			
		||||
 | 
			
		||||
    //private boolean up, down, left, right, sprint;
 | 
			
		||||
    private boolean playing;
 | 
			
		||||
    private Animation animation;
 | 
			
		||||
    private long startTime;
 | 
			
		||||
 | 
			
		||||
    public Player(Bitmap b, int w, int h, int numFrames){
 | 
			
		||||
        TAG = GameView.getTAG();
 | 
			
		||||
 | 
			
		||||
        setX(GameView.WIDTH/5);
 | 
			
		||||
        setY(GameView.HEIGHT/2);
 | 
			
		||||
        setDx(0);
 | 
			
		||||
        setDy(0);
 | 
			
		||||
 | 
			
		||||
        score = 0;
 | 
			
		||||
 | 
			
		||||
        setWidth(w);
 | 
			
		||||
        setHeight(h);
 | 
			
		||||
 | 
			
		||||
        Bitmap[] image = new Bitmap[numFrames];
 | 
			
		||||
        animation = new Animation();
 | 
			
		||||
 | 
			
		||||
        for (int i = 0; i < numFrames; i++){
 | 
			
		||||
            image[i] = Bitmap.createBitmap(b, width * i, 0, width, height);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        animation.setFrames(image);
 | 
			
		||||
        animation.setDelay(100);
 | 
			
		||||
        startTime = System.currentTimeMillis();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public Player(){
 | 
			
		||||
        super();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /*
 | 
			
		||||
    public void setUp(boolean b){
 | 
			
		||||
        up = b;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setDown(boolean b){
 | 
			
		||||
        down = b;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setLeft(boolean b){
 | 
			
		||||
        left = b;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setRight(boolean b){
 | 
			
		||||
        right = b;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setSprint(boolean b){
 | 
			
		||||
        sprint = b;
 | 
			
		||||
    }
 | 
			
		||||
    */
 | 
			
		||||
 | 
			
		||||
    public boolean isPlaying(){
 | 
			
		||||
        return playing;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setPlaying(boolean p){
 | 
			
		||||
        playing = p;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public int getScore() {
 | 
			
		||||
        return score;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void update(){
 | 
			
		||||
        animation.update();
 | 
			
		||||
 | 
			
		||||
        long elapsed = (System.currentTimeMillis() - startTime);
 | 
			
		||||
        if (elapsed > 100){
 | 
			
		||||
            score++;
 | 
			
		||||
            startTime = System.currentTimeMillis();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /* Specific animals should override this
 | 
			
		||||
        if (left){
 | 
			
		||||
            dx = Math.abs(dx) * -1;
 | 
			
		||||
        }
 | 
			
		||||
        else if (right){
 | 
			
		||||
            dx = Math.abs(dx);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (sprint){
 | 
			
		||||
            dx *= 2;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (up){
 | 
			
		||||
            dy += -1;
 | 
			
		||||
        }
 | 
			
		||||
        else{
 | 
			
		||||
            dy += 2;
 | 
			
		||||
        }
 | 
			
		||||
        if (dy < -5){
 | 
			
		||||
            dy = -5;
 | 
			
		||||
        }
 | 
			
		||||
        if (dy > 10){
 | 
			
		||||
            dy = 10;
 | 
			
		||||
        }
 | 
			
		||||
        */
 | 
			
		||||
 | 
			
		||||
        /* Character specific as well
 | 
			
		||||
        // Only move when going up or have not hit the ground yet.
 | 
			
		||||
        if (y < GameView.HEIGHT - getHeight() || dy < 0) {
 | 
			
		||||
            y += dy;
 | 
			
		||||
        }
 | 
			
		||||
        // Do not leave bottom of map
 | 
			
		||||
        else{
 | 
			
		||||
            y = GameView.HEIGHT - getHeight();
 | 
			
		||||
            dy = 0;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Do not leave top of map
 | 
			
		||||
        if (y < 0){
 | 
			
		||||
            y = 0;
 | 
			
		||||
        }
 | 
			
		||||
        */
 | 
			
		||||
 | 
			
		||||
        setEndX(getX() + getWidth());
 | 
			
		||||
        setCenterX((getX() + getEndX()) / 2);
 | 
			
		||||
 | 
			
		||||
        setBottomY(getY() + getHeight());
 | 
			
		||||
        setCenterY((getY() + getBottomY()) / 2);
 | 
			
		||||
 | 
			
		||||
        Log.d(TAG, "Player.update():" +
 | 
			
		||||
                "  score=" + score +
 | 
			
		||||
                ", x=" + x +
 | 
			
		||||
                ", dx=" + dx +
 | 
			
		||||
                ", y=" + y +
 | 
			
		||||
                ", dy=" + dy);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void draw(Canvas canvas){
 | 
			
		||||
        canvas.drawBitmap(animation.getImage(), getX(), getY(), null);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								app/src/main/res/drawable-nodpi/background_forest.png
									
									
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 122 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								app/src/main/res/drawable-nodpi/background_forest_with_lava.png
									
									
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 147 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								app/src/main/res/drawable-nodpi/background_forest_without_clouds.png
									
									
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 116 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								app/src/main/res/drawable-nodpi/banner.png
									
									
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 32 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								app/src/main/res/drawable-nodpi/bird.png
									
									
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 574 B  | 
							
								
								
									
										
											BIN
										
									
								
								app/src/main/res/drawable-nodpi/bird_enemy.png
									
									
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 554 B  | 
							
								
								
									
										
											BIN
										
									
								
								app/src/main/res/drawable-nodpi/bird_extra_life.png
									
									
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 347 B  | 
							
								
								
									
										
											BIN
										
									
								
								app/src/main/res/drawable-nodpi/chicken.png
									
									
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 995 B  | 
							
								
								
									
										
											BIN
										
									
								
								app/src/main/res/drawable-nodpi/clouds.png
									
									
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 7.5 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								app/src/main/res/drawable-nodpi/enemy.png
									
									
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 178 B  | 
							
								
								
									
										
											BIN
										
									
								
								app/src/main/res/drawable-nodpi/icon.png
									
									
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 14 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								app/src/main/res/drawable-nodpi/lava.png
									
									
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 42 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								app/src/main/res/drawable-nodpi/normal_platform.png
									
									
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 427 B  | 
							
								
								
									
										
											BIN
										
									
								
								app/src/main/res/drawable-nodpi/test_player.png
									
									
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 439 B  | 
							
								
								
									
										71
									
								
								app/src/main/res/layout/activity_high_score.xml
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,71 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
    xmlns:tools="http://schemas.android.com/tools"
 | 
			
		||||
    xmlns:ads="http://schemas.android.com/apk/res-auto"
 | 
			
		||||
    android:id="@+id/activity_high_score"
 | 
			
		||||
    android:layout_width="match_parent"
 | 
			
		||||
    android:layout_height="match_parent"
 | 
			
		||||
    android:paddingBottom="@dimen/activity_vertical_margin"
 | 
			
		||||
    android:paddingLeft="@dimen/activity_horizontal_margin"
 | 
			
		||||
    android:paddingRight="@dimen/activity_horizontal_margin"
 | 
			
		||||
    android:paddingTop="@dimen/activity_vertical_margin"
 | 
			
		||||
    tools:context="com.hyperling.apps.games.HighScoreActivity">
 | 
			
		||||
 | 
			
		||||
    <com.google.android.gms.ads.AdView
 | 
			
		||||
        android:id="@+id/adViewHighScores"
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:layout_alignParentBottom="true"
 | 
			
		||||
        android:layout_centerHorizontal="true"
 | 
			
		||||
        android:visibility="gone"
 | 
			
		||||
        ads:adSize="BANNER"
 | 
			
		||||
        ads:adUnitId="@string/interstitial_ad_unit_id_high_score" />
 | 
			
		||||
 | 
			
		||||
    <ScrollView
 | 
			
		||||
        android:id="@+id/scrollViewHighScore"
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:layout_alignParentTop="true"
 | 
			
		||||
        android:layout_centerHorizontal="true"
 | 
			
		||||
        android:layout_above="@+id/adViewHighScores">
 | 
			
		||||
 | 
			
		||||
        <LinearLayout
 | 
			
		||||
            android:layout_width="match_parent"
 | 
			
		||||
            android:layout_height="wrap_content"
 | 
			
		||||
            android:orientation="vertical">
 | 
			
		||||
 | 
			
		||||
            <TextView
 | 
			
		||||
                android:text="@string/birdScoreHeader"
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:textSize="@dimen/textHeaderSize"
 | 
			
		||||
                android:textStyle="bold"/>
 | 
			
		||||
 | 
			
		||||
            <LinearLayout
 | 
			
		||||
                android:id="@+id/birdScoreLayout"
 | 
			
		||||
                android:layout_width="wrap_content"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:orientation="vertical"/>
 | 
			
		||||
 | 
			
		||||
            <Space
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="@dimen/spaceSize" />
 | 
			
		||||
 | 
			
		||||
            <TextView
 | 
			
		||||
                android:text="@string/chickenScoreHeader"
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:textSize="@dimen/textHeaderSize"
 | 
			
		||||
                android:textStyle="bold"/>
 | 
			
		||||
 | 
			
		||||
            <LinearLayout
 | 
			
		||||
                android:id="@+id/chickenScoreLayout"
 | 
			
		||||
                android:layout_width="wrap_content"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:orientation="vertical"/>
 | 
			
		||||
 | 
			
		||||
        </LinearLayout>
 | 
			
		||||
 | 
			
		||||
    </ScrollView>
 | 
			
		||||
 | 
			
		||||
</RelativeLayout>
 | 
			
		||||
							
								
								
									
										125
									
								
								app/src/main/res/layout/activity_main.xml
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,125 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
    xmlns:tools="http://schemas.android.com/tools"
 | 
			
		||||
    xmlns:ads="http://schemas.android.com/apk/res-auto"
 | 
			
		||||
    android:id="@+id/activity_main"
 | 
			
		||||
    android:layout_width="match_parent"
 | 
			
		||||
    android:layout_height="match_parent"
 | 
			
		||||
    android:paddingBottom="@dimen/activity_vertical_margin"
 | 
			
		||||
    android:paddingLeft="@dimen/activity_horizontal_margin"
 | 
			
		||||
    android:paddingRight="@dimen/activity_horizontal_margin"
 | 
			
		||||
    android:paddingTop="@dimen/activity_vertical_margin"
 | 
			
		||||
    tools:context="com.hyperling.apps.games.MainActivity">
 | 
			
		||||
 | 
			
		||||
    <com.google.android.gms.ads.AdView
 | 
			
		||||
        android:id="@+id/adViewMain"
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:layout_alignParentBottom="true"
 | 
			
		||||
        android:layout_centerHorizontal="true"
 | 
			
		||||
        android:visibility="gone"
 | 
			
		||||
        ads:adSize="BANNER"
 | 
			
		||||
        ads:adUnitId="@string/interstitial_ad_unit_id_main" />
 | 
			
		||||
 | 
			
		||||
    <ScrollView
 | 
			
		||||
        android:id="@+id/scrollViewMain"
 | 
			
		||||
        android:layout_width="wrap_content"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:layout_alignParentTop="true"
 | 
			
		||||
        android:layout_centerHorizontal="true"
 | 
			
		||||
        android:layout_above="@+id/adViewMain">
 | 
			
		||||
 | 
			
		||||
        <LinearLayout
 | 
			
		||||
            android:layout_width="wrap_content"
 | 
			
		||||
            android:layout_height="wrap_content"
 | 
			
		||||
            android:orientation="vertical">
 | 
			
		||||
 | 
			
		||||
            <Space
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="16dp" />
 | 
			
		||||
 | 
			
		||||
            <TextView
 | 
			
		||||
                android:text="@string/tvGamesHeader"
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:textSize="30sp"
 | 
			
		||||
                android:textStyle="bold"
 | 
			
		||||
                android:gravity="center"/>
 | 
			
		||||
 | 
			
		||||
            <Button
 | 
			
		||||
                android:id="@+id/btnBirdGame"
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:text="@string/btnGameBird"/>
 | 
			
		||||
 | 
			
		||||
            <Button
 | 
			
		||||
                android:id="@+id/btnGameCow"
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:text="@string/btnGameCow"
 | 
			
		||||
                android:enabled="false"/>
 | 
			
		||||
 | 
			
		||||
            <Button
 | 
			
		||||
                android:id="@+id/btnGamePig"
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:text="@string/btnGamePig"
 | 
			
		||||
                android:enabled="false"/>
 | 
			
		||||
 | 
			
		||||
            <Button
 | 
			
		||||
                android:id="@+id/btnGameChicken"
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:text="@string/btnGameChicken"/>
 | 
			
		||||
 | 
			
		||||
            <Button
 | 
			
		||||
                android:id="@+id/btnGameCat"
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:text="@string/btnGameCat"
 | 
			
		||||
                android:enabled="false"/>
 | 
			
		||||
 | 
			
		||||
            <Button
 | 
			
		||||
                android:id="@+id/btnGameSquirrel"
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:text="@string/btnGameSquirrel"
 | 
			
		||||
                android:enabled="false"/>
 | 
			
		||||
 | 
			
		||||
            <Space
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="16dp" />
 | 
			
		||||
 | 
			
		||||
            <Button
 | 
			
		||||
                android:id="@+id/btnOptions"
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:text="@string/btnOptions"
 | 
			
		||||
                android:textSize="30sp"/>
 | 
			
		||||
 | 
			
		||||
            <Space
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="16dp" />
 | 
			
		||||
 | 
			
		||||
            <Button
 | 
			
		||||
                android:id="@+id/btnHighScores"
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:text="@string/btnHighScores"
 | 
			
		||||
                android:textSize="30sp"/>
 | 
			
		||||
 | 
			
		||||
            <Space
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="16dp" />
 | 
			
		||||
 | 
			
		||||
            <Button
 | 
			
		||||
                android:id="@+id/btnHelp"
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:text="@string/btnHelp"
 | 
			
		||||
                android:textSize="30sp"
 | 
			
		||||
                android:enabled="false"/>
 | 
			
		||||
 | 
			
		||||
        </LinearLayout>
 | 
			
		||||
    </ScrollView>
 | 
			
		||||
</RelativeLayout>
 | 
			
		||||
							
								
								
									
										292
									
								
								app/src/main/res/layout/activity_options.xml
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,292 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<RelativeLayout
 | 
			
		||||
    xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
    xmlns:tools="http://schemas.android.com/tools"
 | 
			
		||||
    xmlns:ads="http://schemas.android.com/apk/res-auto"
 | 
			
		||||
    android:id="@+id/activity_options"
 | 
			
		||||
    android:layout_width="match_parent"
 | 
			
		||||
    android:layout_height="match_parent"
 | 
			
		||||
    android:paddingBottom="@dimen/activity_vertical_margin"
 | 
			
		||||
    android:paddingLeft="@dimen/activity_horizontal_margin"
 | 
			
		||||
    android:paddingRight="@dimen/activity_horizontal_margin"
 | 
			
		||||
    android:paddingTop="@dimen/activity_vertical_margin"
 | 
			
		||||
    tools:context="com.hyperling.apps.games.OptionsActivity">
 | 
			
		||||
 | 
			
		||||
    <com.google.android.gms.ads.AdView
 | 
			
		||||
        android:id="@+id/adViewOptions"
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:layout_alignParentBottom="true"
 | 
			
		||||
        android:layout_centerHorizontal="true"
 | 
			
		||||
        android:visibility="gone"
 | 
			
		||||
        ads:adSize="BANNER"
 | 
			
		||||
        ads:adUnitId="@string/interstitial_ad_unit_id_options" />
 | 
			
		||||
 | 
			
		||||
    <ScrollView
 | 
			
		||||
        android:id="@+id/scrollViewOptions"
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:layout_above="@+id/adViewOptions"
 | 
			
		||||
        android:layout_centerInParent="true"
 | 
			
		||||
        android:layout_alignParentTop="true">
 | 
			
		||||
 | 
			
		||||
        <LinearLayout
 | 
			
		||||
            android:layout_width="match_parent"
 | 
			
		||||
            android:layout_height="wrap_content"
 | 
			
		||||
            android:orientation="vertical">
 | 
			
		||||
 | 
			
		||||
            <TextView
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:text="@string/optionGroupGeneral"
 | 
			
		||||
                android:textSize="@dimen/textHeaderSize"
 | 
			
		||||
                android:textStyle="bold"/>
 | 
			
		||||
 | 
			
		||||
            <View
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="@dimen/separatorSize"
 | 
			
		||||
                android:background="@color/colorPrimaryDark" />
 | 
			
		||||
 | 
			
		||||
            <RelativeLayout
 | 
			
		||||
                android:id="@+id/optionAdsLayout"
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="wrap_content">
 | 
			
		||||
                <CheckBox
 | 
			
		||||
                    android:id="@+id/optionAdsCheckBox"
 | 
			
		||||
                    android:layout_width="wrap_content"
 | 
			
		||||
                    android:layout_height="wrap_content"
 | 
			
		||||
                    android:layout_alignParentRight="true"
 | 
			
		||||
                    android:layout_alignParentEnd="true"
 | 
			
		||||
                    android:layout_centerVertical="true"/>
 | 
			
		||||
                <TextView
 | 
			
		||||
                    android:text="@string/optionAds"
 | 
			
		||||
                    android:layout_width="wrap_content"
 | 
			
		||||
                    android:layout_height="wrap_content"
 | 
			
		||||
                    android:layout_alignParentLeft="true"
 | 
			
		||||
                    android:layout_alignParentStart="true"
 | 
			
		||||
                    android:layout_centerVertical="true"
 | 
			
		||||
                    android:layout_toLeftOf="@id/optionAdsCheckBox"
 | 
			
		||||
                    android:layout_toStartOf="@id/optionAdsCheckBox"/>
 | 
			
		||||
            </RelativeLayout>
 | 
			
		||||
 | 
			
		||||
            <View
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="@dimen/separatorSize"
 | 
			
		||||
                android:background="@color/colorPrimaryDark" />
 | 
			
		||||
 | 
			
		||||
            <Space
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="@dimen/spaceSize" />
 | 
			
		||||
 | 
			
		||||
            <TextView
 | 
			
		||||
                android:text="@string/optionGroupInGame"
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:textSize="@dimen/textHeaderSize"
 | 
			
		||||
                android:textStyle="bold" />
 | 
			
		||||
 | 
			
		||||
            <View
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="@dimen/separatorSize"
 | 
			
		||||
                android:background="@color/colorPrimaryDark" />
 | 
			
		||||
 | 
			
		||||
            <RelativeLayout
 | 
			
		||||
                android:id="@+id/optionPracticeRoundLayout"
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="wrap_content">
 | 
			
		||||
                <CheckBox
 | 
			
		||||
                    android:id="@+id/optionPracticeRoundCheckBox"
 | 
			
		||||
                    android:layout_width="wrap_content"
 | 
			
		||||
                    android:layout_height="wrap_content"
 | 
			
		||||
                    android:layout_alignParentRight="true"
 | 
			
		||||
                    android:layout_alignParentEnd="true"
 | 
			
		||||
                    android:layout_centerVertical="true"
 | 
			
		||||
                    android:enabled="false"/>
 | 
			
		||||
                <TextView
 | 
			
		||||
                    android:text="@string/optionPracticeRound"
 | 
			
		||||
                    android:layout_width="wrap_content"
 | 
			
		||||
                    android:layout_height="wrap_content"
 | 
			
		||||
                    android:layout_alignParentLeft="true"
 | 
			
		||||
                    android:layout_alignParentStart="true"
 | 
			
		||||
                    android:layout_centerVertical="true"
 | 
			
		||||
                    android:layout_toLeftOf="@id/optionPracticeRoundCheckBox"
 | 
			
		||||
                    android:layout_toStartOf="@id/optionPracticeRoundCheckBox"
 | 
			
		||||
                    android:textStyle="italic"/>
 | 
			
		||||
            </RelativeLayout>
 | 
			
		||||
 | 
			
		||||
            <View
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="@dimen/separatorSize"
 | 
			
		||||
                android:background="@color/colorPrimaryDark" />
 | 
			
		||||
 | 
			
		||||
            <RelativeLayout
 | 
			
		||||
                android:id="@+id/optionHigherQualityLayout"
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="wrap_content">
 | 
			
		||||
                <CheckBox
 | 
			
		||||
                    android:id="@+id/optionHigherQualityCheckBox"
 | 
			
		||||
                    android:layout_width="wrap_content"
 | 
			
		||||
                    android:layout_height="wrap_content"
 | 
			
		||||
                    android:layout_alignParentRight="true"
 | 
			
		||||
                    android:layout_alignParentEnd="true"
 | 
			
		||||
                    android:layout_centerVertical="true"/>
 | 
			
		||||
                <TextView
 | 
			
		||||
                    android:text="@string/optionHigherQuality"
 | 
			
		||||
                    android:layout_width="wrap_content"
 | 
			
		||||
                    android:layout_height="wrap_content"
 | 
			
		||||
                    android:layout_alignParentLeft="true"
 | 
			
		||||
                    android:layout_alignParentStart="true"
 | 
			
		||||
                    android:layout_centerVertical="true"
 | 
			
		||||
                    android:layout_toLeftOf="@id/optionHigherQualityCheckBox"
 | 
			
		||||
                    android:layout_toStartOf="@id/optionHigherQualityCheckBox"/>
 | 
			
		||||
            </RelativeLayout>
 | 
			
		||||
 | 
			
		||||
            <View
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="@dimen/separatorSize"
 | 
			
		||||
                android:background="@color/colorPrimaryDark" />
 | 
			
		||||
 | 
			
		||||
            <RelativeLayout
 | 
			
		||||
                android:id="@+id/optionFPSLayout"
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="wrap_content">
 | 
			
		||||
                <CheckBox
 | 
			
		||||
                    android:id="@+id/fpsCheckBox"
 | 
			
		||||
                    android:layout_width="wrap_content"
 | 
			
		||||
                    android:layout_height="wrap_content"
 | 
			
		||||
                    android:layout_alignParentRight="true"
 | 
			
		||||
                    android:layout_alignParentEnd="true"
 | 
			
		||||
                    android:layout_centerVertical="true"/>
 | 
			
		||||
                <TextView
 | 
			
		||||
                    android:text="@string/optionFPS"
 | 
			
		||||
                    android:layout_width="wrap_content"
 | 
			
		||||
                    android:layout_height="wrap_content"
 | 
			
		||||
                    android:layout_alignParentLeft="true"
 | 
			
		||||
                    android:layout_alignParentStart="true"
 | 
			
		||||
                    android:layout_centerVertical="true"
 | 
			
		||||
                    android:layout_toLeftOf="@id/fpsCheckBox"
 | 
			
		||||
                    android:layout_toStartOf="@id/fpsCheckBox"/>
 | 
			
		||||
            </RelativeLayout>
 | 
			
		||||
 | 
			
		||||
            <View
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="@dimen/separatorSize"
 | 
			
		||||
                android:background="@color/colorPrimaryDark" />
 | 
			
		||||
 | 
			
		||||
            <Space
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="@dimen/spaceSize" />
 | 
			
		||||
 | 
			
		||||
            <TextView
 | 
			
		||||
                android:text="@string/optionGroupOnline"
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:textSize="@dimen/textHeaderSize"
 | 
			
		||||
                android:textStyle="bold"/>
 | 
			
		||||
 | 
			
		||||
            <View
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="@dimen/separatorSize"
 | 
			
		||||
                android:background="@color/colorPrimaryDark" />
 | 
			
		||||
 | 
			
		||||
            <RelativeLayout
 | 
			
		||||
                android:id="@+id/optionNicknameLayout"
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="wrap_content">
 | 
			
		||||
                <EditText
 | 
			
		||||
                    android:id="@+id/optionNicknameEditText"
 | 
			
		||||
                    android:layout_width="wrap_content"
 | 
			
		||||
                    android:layout_height="wrap_content"
 | 
			
		||||
                    android:layout_alignParentRight="true"
 | 
			
		||||
                    android:layout_alignParentEnd="true"
 | 
			
		||||
                    android:layout_centerVertical="true"
 | 
			
		||||
                    android:enabled="false"/>
 | 
			
		||||
                <!--android:hint="@string/optionNicknameHint"-->
 | 
			
		||||
                <TextView
 | 
			
		||||
                    android:text="@string/optionNickname"
 | 
			
		||||
                    android:layout_width="wrap_content"
 | 
			
		||||
                    android:layout_height="wrap_content"
 | 
			
		||||
                    android:layout_alignParentLeft="true"
 | 
			
		||||
                    android:layout_alignParentStart="true"
 | 
			
		||||
                    android:layout_centerVertical="true"
 | 
			
		||||
                    android:layout_toLeftOf="@id/optionNicknameEditText"
 | 
			
		||||
                    android:layout_toStartOf="@id/optionNicknameEditText"
 | 
			
		||||
                    android:textStyle="italic"/>
 | 
			
		||||
            </RelativeLayout>
 | 
			
		||||
 | 
			
		||||
            <View
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="@dimen/separatorSize"
 | 
			
		||||
                android:background="@color/colorPrimaryDark" />
 | 
			
		||||
 | 
			
		||||
            <RelativeLayout
 | 
			
		||||
                android:id="@+id/optionUploadLayout"
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="wrap_content">
 | 
			
		||||
                <CheckBox
 | 
			
		||||
                    android:id="@+id/optionUploadCheckBox"
 | 
			
		||||
                    android:layout_width="wrap_content"
 | 
			
		||||
                    android:layout_height="wrap_content"
 | 
			
		||||
                    android:layout_alignParentRight="true"
 | 
			
		||||
                    android:layout_alignParentEnd="true"
 | 
			
		||||
                    android:layout_centerVertical="true"
 | 
			
		||||
                    android:enabled="false"/>
 | 
			
		||||
                <TextView
 | 
			
		||||
                    android:text="@string/optionUpload"
 | 
			
		||||
                    android:layout_width="wrap_content"
 | 
			
		||||
                    android:layout_height="wrap_content"
 | 
			
		||||
                    android:layout_alignParentLeft="true"
 | 
			
		||||
                    android:layout_alignParentStart="true"
 | 
			
		||||
                    android:layout_centerVertical="true"
 | 
			
		||||
                    android:layout_toLeftOf="@id/optionUploadCheckBox"
 | 
			
		||||
                    android:layout_toStartOf="@id/optionUploadCheckBox"
 | 
			
		||||
                    android:textStyle="italic"/>
 | 
			
		||||
            </RelativeLayout>
 | 
			
		||||
 | 
			
		||||
            <View
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="@dimen/separatorSize"
 | 
			
		||||
                android:background="@color/colorPrimaryDark" />
 | 
			
		||||
 | 
			
		||||
            <Space
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="@dimen/spaceSize" />
 | 
			
		||||
 | 
			
		||||
            <TextView
 | 
			
		||||
                android:text="@string/optionGroupOther"
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:textSize="@dimen/textHeaderSize"
 | 
			
		||||
                android:textStyle="bold"/>
 | 
			
		||||
 | 
			
		||||
            <View
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="@dimen/separatorSize"
 | 
			
		||||
                android:background="@color/colorPrimaryDark" />
 | 
			
		||||
 | 
			
		||||
            <Button
 | 
			
		||||
                android:id="@+id/btnDeletePreferences"
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:text="@string/btnDeletePreferences"
 | 
			
		||||
                android:gravity="center"/>
 | 
			
		||||
 | 
			
		||||
            <Button
 | 
			
		||||
                android:id="@+id/btnConfirmDeletePreferences"
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:text="@string/btnConfirmDeletePreferences"
 | 
			
		||||
                android:gravity="center"
 | 
			
		||||
                android:enabled="false"
 | 
			
		||||
                android:visibility="gone"/>
 | 
			
		||||
 | 
			
		||||
            <View
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="@dimen/separatorSize"
 | 
			
		||||
                android:background="@color/colorPrimaryDark" />
 | 
			
		||||
 | 
			
		||||
        </LinearLayout>
 | 
			
		||||
 | 
			
		||||
    </ScrollView>
 | 
			
		||||
 | 
			
		||||
</RelativeLayout>
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								app/src/main/res/mipmap-hdpi/ic_launcher.png
									
									
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 3.3 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								app/src/main/res/mipmap-mdpi/ic_launcher.png
									
									
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 2.2 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								app/src/main/res/mipmap-xhdpi/ic_launcher.png
									
									
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 4.7 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								app/src/main/res/mipmap-xxhdpi/ic_launcher.png
									
									
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 7.5 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
									
									
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 10 KiB  | 
							
								
								
									
										6
									
								
								app/src/main/res/values-w820dp/dimens.xml
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,6 @@
 | 
			
		||||
<resources>
 | 
			
		||||
    <!-- Example customization of dimensions originally defined in res/values/dimens.xml
 | 
			
		||||
         (such as screen margins) for screens with more than 820dp of available width. This
 | 
			
		||||
         would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). -->
 | 
			
		||||
    <dimen name="activity_horizontal_margin">64dp</dimen>
 | 
			
		||||
</resources>
 | 
			
		||||
							
								
								
									
										12
									
								
								app/src/main/res/values/colors.xml
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,12 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<resources>
 | 
			
		||||
    <!--
 | 
			
		||||
    <color name="colorPrimary">#3F51B5</color>
 | 
			
		||||
    <color name="colorPrimaryDark">#303F9F</color>
 | 
			
		||||
    <color name="colorAccent">#FF4081</color>
 | 
			
		||||
    -->
 | 
			
		||||
 | 
			
		||||
    <color name="colorPrimary">#330066</color>
 | 
			
		||||
    <color name="colorPrimaryDark">#333333</color>
 | 
			
		||||
    <color name="colorAccent">#FF9900</color>
 | 
			
		||||
</resources>
 | 
			
		||||
							
								
								
									
										9
									
								
								app/src/main/res/values/dimens.xml
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,9 @@
 | 
			
		||||
<resources>
 | 
			
		||||
    <!-- Default screen margins, per the Android Design guidelines. -->
 | 
			
		||||
    <dimen name="activity_horizontal_margin">16dp</dimen>
 | 
			
		||||
    <dimen name="activity_vertical_margin">16dp</dimen>
 | 
			
		||||
 | 
			
		||||
    <dimen name="textHeaderSize">30sp</dimen>
 | 
			
		||||
    <dimen name="spaceSize">16dp</dimen>
 | 
			
		||||
    <dimen name="separatorSize">1dp</dimen>
 | 
			
		||||
</resources>
 | 
			
		||||
							
								
								
									
										92
									
								
								app/src/main/res/values/strings.xml
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,92 @@
 | 
			
		||||
<resources>
 | 
			
		||||
    <string name="app_name">Hyper Games</string>
 | 
			
		||||
 | 
			
		||||
    <string name="TAG">apps.hyperling.com.platformer</string>
 | 
			
		||||
 | 
			
		||||
    <!-- Main Activity -->
 | 
			
		||||
    <string name="tvGamesHeader">Games</string>
 | 
			
		||||
    <string name="btnGameBird">Betty the Bird (Beta)</string>
 | 
			
		||||
    <!-- Default Game -->
 | 
			
		||||
    <!-- Testing only? Flappybird? -->
 | 
			
		||||
    <string name="btnGameCow">Carly the Cow</string>
 | 
			
		||||
    <!-- A cow must defend itself to escape the farmers trying to kill it. -->
 | 
			
		||||
    <!-- Auto-runner. Cow can charge to scare farmers away. (They run off the map, cow does not kill or hit them) -->
 | 
			
		||||
    <string name="btnGamePig">Patty the Pig</string>
 | 
			
		||||
    <!-- A pig must hide from pursuers and avoid drying out in the sun using mud baths. -->
 | 
			
		||||
    <!-- Press down to make the pig walk. Tapping rapidly makes it run for a short amount of time. You must avoid being noticed by patrols of farmers (like Deku Palace). -->
 | 
			
		||||
    <!-- This is a top-down game? -->
 | 
			
		||||
    <string name="btnGameChicken">Charlie the Chicken (Unfinished)</string>
 | 
			
		||||
    <!-- Game where you must jump/fly over obstacles? -->
 | 
			
		||||
    <!-- Auto-runner. Tapping makes it fly while holding down makes it run. Possible to get a running start and then fly? Avoid farmers and their nets. -->
 | 
			
		||||
    <string name="btnGameCat">Kitty the Cat</string>
 | 
			
		||||
    <!-- Full platformer like Super Mario World or Donkey Kong Country. -->
 | 
			
		||||
    <!-- Tap the direction of the screen you'd like to move. Character is in the middle instead of on the left like an auto-runner. -->
 | 
			
		||||
    <string name="btnGameSquirrel">Sammy the Squirrel</string>
 | 
			
		||||
    <!-- Top-down like pig game, but like Frogger -->
 | 
			
		||||
    <string name="btnOptions">Options</string>
 | 
			
		||||
    <string name="btnHighScores">High Scores</string>
 | 
			
		||||
    <string name="btnHelp">Help</string>
 | 
			
		||||
 | 
			
		||||
    <string name="btnHighScoreSubHeader">High Score:</string>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <!-- Options Actvity -->
 | 
			
		||||
    <string name="optionGroupGeneral">General</string>
 | 
			
		||||
    <string name="optionGroupInGame">In Game</string>
 | 
			
		||||
    <string name="optionGroupOnline">Online</string>
 | 
			
		||||
    <string name="optionGroupOther">Other</string>
 | 
			
		||||
 | 
			
		||||
    <string name="optionAds">Allow Ads on Menu Screens?</string>
 | 
			
		||||
    <string name="optionPracticeRound">Play Practice Round when Starting New Games?</string>
 | 
			
		||||
    <string name="optionHigherQuality">Allow Higher Quality Images and Animations?</string>
 | 
			
		||||
    <string name="optionFPS">Display FPS?</string>
 | 
			
		||||
    <string name="optionNickname">Nickname for Online Leaderboards:</string>
 | 
			
		||||
    <string name="optionUpload">Allow Automatic High Score Uploads?</string>
 | 
			
		||||
 | 
			
		||||
    <string name="optionNicknameHint">Type Name Here</string>
 | 
			
		||||
 | 
			
		||||
    <string name="btnDeletePreferences">Delete High Scores and Reset Preferences</string>
 | 
			
		||||
    <string name="btnConfirmDeletePreferences">Are you seriously sure that you seriously want to seriously delete everything? If so, press here!</string>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <!-- Shared Preferences -->
 | 
			
		||||
    <string name="sharedPreferencesKey">HyperGames</string>
 | 
			
		||||
    <!-- Options -->
 | 
			
		||||
    <string name="adsKey">Ads</string>
 | 
			
		||||
    <string name="practiceRoundKey">Practice</string>
 | 
			
		||||
    <string name="higherQualityKey">HigherQuality</string>
 | 
			
		||||
    <string name="fpsKey">FPS</string>
 | 
			
		||||
    <string name="nicknameKey">Nickname</string>
 | 
			
		||||
    <string name="uploadKey">Upload</string>
 | 
			
		||||
    <!-- High Scores -->
 | 
			
		||||
    <string name="birdScoreKey">BirdScore009</string>
 | 
			
		||||
    <string name="cowScoreKey">CowScore</string>
 | 
			
		||||
    <string name="pigScoreKey">PigScore</string>
 | 
			
		||||
    <string name="chickenScoreKey">ChickenScore009</string>
 | 
			
		||||
    <string name="catScoreKey">CatScore</string>
 | 
			
		||||
 | 
			
		||||
    <!-- All Versions High Scores -->
 | 
			
		||||
    <string name="birdScoreHeader">Bird Game Scores</string>
 | 
			
		||||
    <string-array name="allBirdScoreKeys">
 | 
			
		||||
        <item>BirdScore009</item>
 | 
			
		||||
        <item>BirdScore008(Beta)</item>
 | 
			
		||||
        <item>BirdScore007</item>
 | 
			
		||||
        <item>BirdScore005</item>
 | 
			
		||||
        <item>BirdScore004</item>
 | 
			
		||||
        <item>BirdScore003</item>
 | 
			
		||||
    </string-array>
 | 
			
		||||
 | 
			
		||||
    <string name="chickenScoreHeader">Chicken Game Scores</string>
 | 
			
		||||
    <string-array name="allChickenScoreKeys">
 | 
			
		||||
        <item>ChickenScore009</item>
 | 
			
		||||
        <item>ChickenScore008(Alpha)</item>
 | 
			
		||||
    </string-array>
 | 
			
		||||
 | 
			
		||||
    <!-- -
 | 
			
		||||
        This is an ad unit ID for an interstitial test ad. Replace with your own interstitial ad unit id.
 | 
			
		||||
        For more information, see https://support.google.com/admob/answer/3052638
 | 
			
		||||
    <!- -->
 | 
			
		||||
    <string name="interstitial_ad_unit_id_main">ca-app-pub-9712416021907617/7877767281</string>
 | 
			
		||||
    <string name="interstitial_ad_unit_id_options">ca-app-pub-9712416021907617/3307966880</string>
 | 
			
		||||
    <string name="interstitial_ad_unit_id_high_score">ca-app-pub-9712416021907617/4784700088</string>
 | 
			
		||||
</resources>
 | 
			
		||||
							
								
								
									
										15
									
								
								app/src/main/res/values/styles.xml
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,15 @@
 | 
			
		||||
<resources>
 | 
			
		||||
 | 
			
		||||
    <!-- Base application theme. -->
 | 
			
		||||
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
 | 
			
		||||
        <!-- Customize your theme here. -->
 | 
			
		||||
        <item name="colorPrimary">@color/colorPrimary</item>
 | 
			
		||||
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
 | 
			
		||||
        <item name="colorAccent">@color/colorAccent</item>
 | 
			
		||||
 | 
			
		||||
        <item name="android:textAllCaps">false</item>
 | 
			
		||||
        <item name="android:textSize">18sp</item>
 | 
			
		||||
        <item name="android:textStyle">normal</item>
 | 
			
		||||
    </style>
 | 
			
		||||
 | 
			
		||||
</resources>
 | 
			
		||||
							
								
								
									
										17
									
								
								app/src/test/java/com/hyperling/apps/games/ExampleUnitTest.java
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,17 @@
 | 
			
		||||
package com.hyperling.apps.games;
 | 
			
		||||
 | 
			
		||||
import org.junit.Test;
 | 
			
		||||
 | 
			
		||||
import static org.junit.Assert.*;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Example local unit test, which will execute on the development machine (host).
 | 
			
		||||
 *
 | 
			
		||||
 * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
 | 
			
		||||
 */
 | 
			
		||||
public class ExampleUnitTest {
 | 
			
		||||
    @Test
 | 
			
		||||
    public void addition_isCorrect() throws Exception {
 | 
			
		||||
        assertEquals(4, 2 + 2);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										24
									
								
								build.gradle
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,24 @@
 | 
			
		||||
// Top-level build file where you can add configuration options common to all sub-projects/modules.
 | 
			
		||||
 | 
			
		||||
buildscript {
 | 
			
		||||
    repositories {
 | 
			
		||||
        jcenter()
 | 
			
		||||
        google()
 | 
			
		||||
    }
 | 
			
		||||
    dependencies {
 | 
			
		||||
        classpath 'com.android.tools.build:gradle:3.2.1'
 | 
			
		||||
 | 
			
		||||
        // NOTE: Do not place your application dependencies here; they belong
 | 
			
		||||
        // in the individual module build.gradle files
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
allprojects {
 | 
			
		||||
    repositories {
 | 
			
		||||
        jcenter()
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
task clean(type: Delete) {
 | 
			
		||||
    delete rootProject.buildDir
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										39
									
								
								changelog.txt
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,39 @@
 | 
			
		||||
-= v0.9.0 | 2017-02-05 =-
 | 
			
		||||
Added Enemies to Chicken Game
 | 
			
		||||
Began Work on High Score Uploads
 | 
			
		||||
 | 
			
		||||
-= v0.8.1 | 2017-01-02 =-
 | 
			
		||||
Fixed Clouds on Bird Game's Low Quality Background
 | 
			
		||||
 | 
			
		||||
-= v008 | 2017-01-02 =-
 | 
			
		||||
Moved Chicken Game to Alpha
 | 
			
		||||
Added FPS and Fancy Graphics Settings
 | 
			
		||||
 | 
			
		||||
-= v007 | 2016-12-28 =-
 | 
			
		||||
Modified Bird Game Level Scaling
 | 
			
		||||
Better Class Definitions and Code Cleanup (Increased Performance)
 | 
			
		||||
Started Chicken Game
 | 
			
		||||
 | 
			
		||||
-= v006 | 2016-12-26 =-
 | 
			
		||||
Fixed High Score Being Erased
 | 
			
		||||
 | 
			
		||||
-= v005 | 2016-12-26 =-
 | 
			
		||||
Bird Game:
 | 
			
		||||
    Added Lives
 | 
			
		||||
    Added Dynamic Scaling
 | 
			
		||||
    Added Instructions
 | 
			
		||||
General:
 | 
			
		||||
    Added Score Saving When Exiting Game
 | 
			
		||||
    Fixed New Icon
 | 
			
		||||
 | 
			
		||||
-= v004 | 2016-12-26 =-
 | 
			
		||||
Finished Bird Game
 | 
			
		||||
Added High Scores Menu
 | 
			
		||||
Added Reset Button in Options
 | 
			
		||||
Fixed Ads
 | 
			
		||||
 | 
			
		||||
-= v003 | 2016-12-24 =-
 | 
			
		||||
Fixed button not launching game correctly when high scores exist.
 | 
			
		||||
 | 
			
		||||
-= v002 | 2016-12-24 =-
 | 
			
		||||
Added High Score to Main Menu for Bird Game
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								gimp/BugByteBeach2.xcf
									
									
									
									
									
										Executable file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								gimp/background.xcf
									
									
									
									
									
										Executable file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								gimp/background_forest.png
									
									
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 122 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								gimp/background_forest.xcf
									
									
									
									
									
										Executable file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								gimp/background_forest_no_clouds.xcf
									
									
									
									
									
										Executable file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								gimp/background_forest_with_lava.png
									
									
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 147 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								gimp/background_forest_without_clouds.png
									
									
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 116 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								gimp/banner.png
									
									
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 32 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								gimp/banner.xcf
									
									
									
									
									
										Executable file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								gimp/bird.png
									
									
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 574 B  | 
							
								
								
									
										
											BIN
										
									
								
								gimp/bird.xcf
									
									
									
									
									
										Executable file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								gimp/bird_enemy.png
									
									
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 554 B  | 
							
								
								
									
										
											BIN
										
									
								
								gimp/bird_enemy.xcf
									
									
									
									
									
										Executable file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								gimp/bird_extra_life.png
									
									
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 347 B  | 
							
								
								
									
										
											BIN
										
									
								
								gimp/bird_extra_life.xcf
									
									
									
									
									
										Executable file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								gimp/chicken.png
									
									
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 995 B  | 
							
								
								
									
										
											BIN
										
									
								
								gimp/chicken.xcf
									
									
									
									
									
										Executable file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								gimp/clouds.png
									
									
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 7.5 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								gimp/enemy.png
									
									
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 178 B  | 
							
								
								
									
										
											BIN
										
									
								
								gimp/enemy.xcf
									
									
									
									
									
										Executable file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								gimp/extra_life.xcf
									
									
									
									
									
										Executable file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								gimp/icon.png
									
									
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 14 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								gimp/icon.xcf
									
									
									
									
									
										Executable file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								gimp/lava.png
									
									
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 42 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								gimp/lava.xcf
									
									
									
									
									
										Executable file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								gimp/normal_platform.png
									
									
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 427 B  | 
							
								
								
									
										
											BIN
										
									
								
								gimp/normal_platform.xcf
									
									
									
									
									
										Executable file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								gimp/player.xcf
									
									
									
									
									
										Executable file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								gimp/test_player.png
									
									
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 439 B  | 
							
								
								
									
										17
									
								
								gradle.properties
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,17 @@
 | 
			
		||||
# Project-wide Gradle settings.
 | 
			
		||||
 | 
			
		||||
# IDE (e.g. Android Studio) users:
 | 
			
		||||
# Gradle settings configured through the IDE *will override*
 | 
			
		||||
# any settings specified in this file.
 | 
			
		||||
 | 
			
		||||
# For more details on how to configure your build environment visit
 | 
			
		||||
# http://www.gradle.org/docs/current/userguide/build_environment.html
 | 
			
		||||
 | 
			
		||||
# Specifies the JVM arguments used for the daemon process.
 | 
			
		||||
# The setting is particularly useful for tweaking memory settings.
 | 
			
		||||
org.gradle.jvmargs=-Xmx1536m
 | 
			
		||||
 | 
			
		||||
# When configured, Gradle will run in incubating parallel mode.
 | 
			
		||||
# This option should only be used with decoupled projects. More details, visit
 | 
			
		||||
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
 | 
			
		||||
# org.gradle.parallel=true
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								gradle/wrapper/gradle-wrapper.jar
									
									
									
									
										vendored
									
									
										Executable file
									
								
							
							
						
						
							
								
								
									
										6
									
								
								gradle/wrapper/gradle-wrapper.properties
									
									
									
									
										vendored
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,6 @@
 | 
			
		||||
#Thu Jan 10 06:49:36 CST 2019
 | 
			
		||||
distributionBase=GRADLE_USER_HOME
 | 
			
		||||
distributionPath=wrapper/dists
 | 
			
		||||
zipStoreBase=GRADLE_USER_HOME
 | 
			
		||||
zipStorePath=wrapper/dists
 | 
			
		||||
distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip
 | 
			
		||||
							
								
								
									
										160
									
								
								gradlew
									
									
									
									
										vendored
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,160 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
##############################################################################
 | 
			
		||||
##
 | 
			
		||||
##  Gradle start up script for UN*X
 | 
			
		||||
##
 | 
			
		||||
##############################################################################
 | 
			
		||||
 | 
			
		||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
 | 
			
		||||
DEFAULT_JVM_OPTS=""
 | 
			
		||||
 | 
			
		||||
APP_NAME="Gradle"
 | 
			
		||||
APP_BASE_NAME=`basename "$0"`
 | 
			
		||||
 | 
			
		||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
 | 
			
		||||
MAX_FD="maximum"
 | 
			
		||||
 | 
			
		||||
warn ( ) {
 | 
			
		||||
    echo "$*"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
die ( ) {
 | 
			
		||||
    echo
 | 
			
		||||
    echo "$*"
 | 
			
		||||
    echo
 | 
			
		||||
    exit 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# OS specific support (must be 'true' or 'false').
 | 
			
		||||
cygwin=false
 | 
			
		||||
msys=false
 | 
			
		||||
darwin=false
 | 
			
		||||
case "`uname`" in
 | 
			
		||||
  CYGWIN* )
 | 
			
		||||
    cygwin=true
 | 
			
		||||
    ;;
 | 
			
		||||
  Darwin* )
 | 
			
		||||
    darwin=true
 | 
			
		||||
    ;;
 | 
			
		||||
  MINGW* )
 | 
			
		||||
    msys=true
 | 
			
		||||
    ;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
# Attempt to set APP_HOME
 | 
			
		||||
# Resolve links: $0 may be a link
 | 
			
		||||
PRG="$0"
 | 
			
		||||
# Need this for relative symlinks.
 | 
			
		||||
while [ -h "$PRG" ] ; do
 | 
			
		||||
    ls=`ls -ld "$PRG"`
 | 
			
		||||
    link=`expr "$ls" : '.*-> \(.*\)$'`
 | 
			
		||||
    if expr "$link" : '/.*' > /dev/null; then
 | 
			
		||||
        PRG="$link"
 | 
			
		||||
    else
 | 
			
		||||
        PRG=`dirname "$PRG"`"/$link"
 | 
			
		||||
    fi
 | 
			
		||||
done
 | 
			
		||||
SAVED="`pwd`"
 | 
			
		||||
cd "`dirname \"$PRG\"`/" >/dev/null
 | 
			
		||||
APP_HOME="`pwd -P`"
 | 
			
		||||
cd "$SAVED" >/dev/null
 | 
			
		||||
 | 
			
		||||
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
 | 
			
		||||
 | 
			
		||||
# Determine the Java command to use to start the JVM.
 | 
			
		||||
if [ -n "$JAVA_HOME" ] ; then
 | 
			
		||||
    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
 | 
			
		||||
        # IBM's JDK on AIX uses strange locations for the executables
 | 
			
		||||
        JAVACMD="$JAVA_HOME/jre/sh/java"
 | 
			
		||||
    else
 | 
			
		||||
        JAVACMD="$JAVA_HOME/bin/java"
 | 
			
		||||
    fi
 | 
			
		||||
    if [ ! -x "$JAVACMD" ] ; then
 | 
			
		||||
        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
 | 
			
		||||
 | 
			
		||||
Please set the JAVA_HOME variable in your environment to match the
 | 
			
		||||
location of your Java installation."
 | 
			
		||||
    fi
 | 
			
		||||
else
 | 
			
		||||
    JAVACMD="java"
 | 
			
		||||
    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
 | 
			
		||||
 | 
			
		||||
Please set the JAVA_HOME variable in your environment to match the
 | 
			
		||||
location of your Java installation."
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# Increase the maximum file descriptors if we can.
 | 
			
		||||
if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
 | 
			
		||||
    MAX_FD_LIMIT=`ulimit -H -n`
 | 
			
		||||
    if [ $? -eq 0 ] ; then
 | 
			
		||||
        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
 | 
			
		||||
            MAX_FD="$MAX_FD_LIMIT"
 | 
			
		||||
        fi
 | 
			
		||||
        ulimit -n $MAX_FD
 | 
			
		||||
        if [ $? -ne 0 ] ; then
 | 
			
		||||
            warn "Could not set maximum file descriptor limit: $MAX_FD"
 | 
			
		||||
        fi
 | 
			
		||||
    else
 | 
			
		||||
        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
 | 
			
		||||
    fi
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# For Darwin, add options to specify how the application appears in the dock
 | 
			
		||||
if $darwin; then
 | 
			
		||||
    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# For Cygwin, switch paths to Windows format before running java
 | 
			
		||||
if $cygwin ; then
 | 
			
		||||
    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
 | 
			
		||||
    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
 | 
			
		||||
    JAVACMD=`cygpath --unix "$JAVACMD"`
 | 
			
		||||
 | 
			
		||||
    # We build the pattern for arguments to be converted via cygpath
 | 
			
		||||
    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
 | 
			
		||||
    SEP=""
 | 
			
		||||
    for dir in $ROOTDIRSRAW ; do
 | 
			
		||||
        ROOTDIRS="$ROOTDIRS$SEP$dir"
 | 
			
		||||
        SEP="|"
 | 
			
		||||
    done
 | 
			
		||||
    OURCYGPATTERN="(^($ROOTDIRS))"
 | 
			
		||||
    # Add a user-defined pattern to the cygpath arguments
 | 
			
		||||
    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
 | 
			
		||||
        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
 | 
			
		||||
    fi
 | 
			
		||||
    # Now convert the arguments - kludge to limit ourselves to /bin/sh
 | 
			
		||||
    i=0
 | 
			
		||||
    for arg in "$@" ; do
 | 
			
		||||
        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
 | 
			
		||||
        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
 | 
			
		||||
 | 
			
		||||
        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
 | 
			
		||||
            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
 | 
			
		||||
        else
 | 
			
		||||
            eval `echo args$i`="\"$arg\""
 | 
			
		||||
        fi
 | 
			
		||||
        i=$((i+1))
 | 
			
		||||
    done
 | 
			
		||||
    case $i in
 | 
			
		||||
        (0) set -- ;;
 | 
			
		||||
        (1) set -- "$args0" ;;
 | 
			
		||||
        (2) set -- "$args0" "$args1" ;;
 | 
			
		||||
        (3) set -- "$args0" "$args1" "$args2" ;;
 | 
			
		||||
        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
 | 
			
		||||
        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
 | 
			
		||||
        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
 | 
			
		||||
        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
 | 
			
		||||
        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
 | 
			
		||||
        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
 | 
			
		||||
    esac
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
 | 
			
		||||
function splitJvmOpts() {
 | 
			
		||||
    JVM_OPTS=("$@")
 | 
			
		||||
}
 | 
			
		||||
eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
 | 
			
		||||
JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
 | 
			
		||||
 | 
			
		||||
exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
 | 
			
		||||
							
								
								
									
										90
									
								
								gradlew.bat
									
									
									
									
										vendored
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,90 @@
 | 
			
		||||
@if "%DEBUG%" == "" @echo off
 | 
			
		||||
@rem ##########################################################################
 | 
			
		||||
@rem
 | 
			
		||||
@rem  Gradle startup script for Windows
 | 
			
		||||
@rem
 | 
			
		||||
@rem ##########################################################################
 | 
			
		||||
 | 
			
		||||
@rem Set local scope for the variables with windows NT shell
 | 
			
		||||
if "%OS%"=="Windows_NT" setlocal
 | 
			
		||||
 | 
			
		||||
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
 | 
			
		||||
set DEFAULT_JVM_OPTS=
 | 
			
		||||
 | 
			
		||||
set DIRNAME=%~dp0
 | 
			
		||||
if "%DIRNAME%" == "" set DIRNAME=.
 | 
			
		||||
set APP_BASE_NAME=%~n0
 | 
			
		||||
set APP_HOME=%DIRNAME%
 | 
			
		||||
 | 
			
		||||
@rem Find java.exe
 | 
			
		||||
if defined JAVA_HOME goto findJavaFromJavaHome
 | 
			
		||||
 | 
			
		||||
set JAVA_EXE=java.exe
 | 
			
		||||
%JAVA_EXE% -version >NUL 2>&1
 | 
			
		||||
if "%ERRORLEVEL%" == "0" goto init
 | 
			
		||||
 | 
			
		||||
echo.
 | 
			
		||||
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
 | 
			
		||||
echo.
 | 
			
		||||
echo Please set the JAVA_HOME variable in your environment to match the
 | 
			
		||||
echo location of your Java installation.
 | 
			
		||||
 | 
			
		||||
goto fail
 | 
			
		||||
 | 
			
		||||
:findJavaFromJavaHome
 | 
			
		||||
set JAVA_HOME=%JAVA_HOME:"=%
 | 
			
		||||
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
 | 
			
		||||
 | 
			
		||||
if exist "%JAVA_EXE%" goto init
 | 
			
		||||
 | 
			
		||||
echo.
 | 
			
		||||
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
 | 
			
		||||
echo.
 | 
			
		||||
echo Please set the JAVA_HOME variable in your environment to match the
 | 
			
		||||
echo location of your Java installation.
 | 
			
		||||
 | 
			
		||||
goto fail
 | 
			
		||||
 | 
			
		||||
:init
 | 
			
		||||
@rem Get command-line arguments, handling Windowz variants
 | 
			
		||||
 | 
			
		||||
if not "%OS%" == "Windows_NT" goto win9xME_args
 | 
			
		||||
if "%@eval[2+2]" == "4" goto 4NT_args
 | 
			
		||||
 | 
			
		||||
:win9xME_args
 | 
			
		||||
@rem Slurp the command line arguments.
 | 
			
		||||
set CMD_LINE_ARGS=
 | 
			
		||||
set _SKIP=2
 | 
			
		||||
 | 
			
		||||
:win9xME_args_slurp
 | 
			
		||||
if "x%~1" == "x" goto execute
 | 
			
		||||
 | 
			
		||||
set CMD_LINE_ARGS=%*
 | 
			
		||||
goto execute
 | 
			
		||||
 | 
			
		||||
:4NT_args
 | 
			
		||||
@rem Get arguments from the 4NT Shell from JP Software
 | 
			
		||||
set CMD_LINE_ARGS=%$
 | 
			
		||||
 | 
			
		||||
:execute
 | 
			
		||||
@rem Setup the command line
 | 
			
		||||
 | 
			
		||||
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
 | 
			
		||||
 | 
			
		||||
@rem Execute Gradle
 | 
			
		||||
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
 | 
			
		||||
 | 
			
		||||
:end
 | 
			
		||||
@rem End local scope for the variables with windows NT shell
 | 
			
		||||
if "%ERRORLEVEL%"=="0" goto mainEnd
 | 
			
		||||
 | 
			
		||||
:fail
 | 
			
		||||
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
 | 
			
		||||
rem the _cmd.exe /c_ return code!
 | 
			
		||||
if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
 | 
			
		||||
exit /b 1
 | 
			
		||||
 | 
			
		||||
:mainEnd
 | 
			
		||||
if "%OS%"=="Windows_NT" endlocal
 | 
			
		||||
 | 
			
		||||
:omega
 | 
			
		||||
							
								
								
									
										1
									
								
								settings.gradle
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1 @@
 | 
			
		||||
include ':app'
 | 
			
		||||