Add original project.

This commit is contained in:
Hyperling 2025-01-04 12:39:38 -07:00
parent 9d735766a7
commit e4ab9ad7e2
72 changed files with 2853 additions and 0 deletions

38
.gitignore vendored Normal file
View File

@ -0,0 +1,38 @@
# 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

BIN
DesignMaterials/bullet_2.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 541 B

BIN
DesignMaterials/bullet_3.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

BIN
DesignMaterials/bullet_cc.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 335 B

BIN
DesignMaterials/bullet_cc2.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 332 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 327 B

BIN
DesignMaterials/cctd_bgimage.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

BIN
DesignMaterials/cctd_image.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

BIN
DesignMaterials/demon_king.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 458 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

1
app/_gitignore Executable file
View File

@ -0,0 +1 @@
/build

25
app/build.gradle Executable file
View File

@ -0,0 +1,25 @@
apply plugin: 'com.android.application'
android {
compileSdkVersion 21
buildToolsVersion "21.1.1"
defaultConfig {
applicationId "com.hyperling.examplegame_practice"
minSdkVersion 8
targetSdkVersion 21
versionCode 5
versionName "1.04"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:21.0.3'
}

View File

@ -0,0 +1,71 @@
-- Merging decision tree log ---
manifest
ADDED from AndroidManifest.xml:2:1
xmlns:android
ADDED from AndroidManifest.xml:2:11
package
ADDED from AndroidManifest.xml:3:5
INJECTED from AndroidManifest.xml:0:0
INJECTED from AndroidManifest.xml:0:0
android:versionName
INJECTED from AndroidManifest.xml:0:0
INJECTED from AndroidManifest.xml:0:0
android:versionCode
INJECTED from AndroidManifest.xml:0:0
INJECTED from AndroidManifest.xml:0:0
application
ADDED from AndroidManifest.xml:5:5
MERGED from com.android.support:appcompat-v7:21.0.3:16:5
MERGED from com.android.support:support-v4:21.0.3:16:5
android:label
ADDED from AndroidManifest.xml:8:9
android:allowBackup
ADDED from AndroidManifest.xml:6:9
android:icon
ADDED from AndroidManifest.xml:7:9
android:theme
ADDED from AndroidManifest.xml:9:9
activity#com.hyperling.examplegame_practice.MainActivity
ADDED from AndroidManifest.xml:11:9
android:screenOrientation
ADDED from AndroidManifest.xml:14:13
android:label
ADDED from AndroidManifest.xml:13:13
android:name
ADDED from AndroidManifest.xml:12:13
intent-filter#android.intent.action.MAIN+android.intent.category.LAUNCHER
ADDED from AndroidManifest.xml:15:13
action#android.intent.action.MAIN
ADDED from AndroidManifest.xml:16:17
android:name
ADDED from AndroidManifest.xml:16:25
category#android.intent.category.LAUNCHER
ADDED from AndroidManifest.xml:18:17
android:name
ADDED from AndroidManifest.xml:18:27
activity#com.hyperling.examplegame_practice.Help
ADDED from AndroidManifest.xml:22:9
android:screenOrientation
ADDED from AndroidManifest.xml:25:13
android:label
ADDED from AndroidManifest.xml:24:13
android:name
ADDED from AndroidManifest.xml:23:13
activity#com.hyperling.examplegame_practice.Game
ADDED from AndroidManifest.xml:28:9
android:screenOrientation
ADDED from AndroidManifest.xml:31:13
android:label
ADDED from AndroidManifest.xml:30:13
android:name
ADDED from AndroidManifest.xml:29:13
uses-sdk
INJECTED from AndroidManifest.xml:0:0 reason: use-sdk injection requested
MERGED from com.android.support:appcompat-v7:21.0.3:15:5
MERGED from com.android.support:support-v4:21.0.3:15:5
android:targetSdkVersion
INJECTED from AndroidManifest.xml:0:0
INJECTED from AndroidManifest.xml:0:0
android:minSdkVersion
INJECTED from AndroidManifest.xml:0:0
INJECTED from AndroidManifest.xml:0:0

17
app/proguard-rules.pro vendored Executable file
View 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/usb/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 *;
#}

View File

@ -0,0 +1,13 @@
package com.hyperling.examplegame_practice;
import android.app.Application;
import android.test.ApplicationTestCase;
/**
* <a href="http://d.android.com/tools/testing/testing_android.html">Testing Fundamentals</a>
*/
public class ApplicationTest extends ApplicationTestCase<Application> {
public ApplicationTest() {
super(Application.class);
}
}

View File

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.hyperling.examplegame_practice" >
<application
android:allowBackup="true"
android:icon="@drawable/cctd_image"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:screenOrientation="landscape" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".Help"
android:label="@string/app_name"
android:screenOrientation="landscape" >
</activity>
<activity
android:name=".Game"
android:label="@string/app_name"
android:screenOrientation="landscape" >
</activity>
</application>
</manifest>

View File

@ -0,0 +1,110 @@
package com.hyperling.examplegame_practice;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Rect;
/**
* Created by usb on 12/19/14.
*/
public class Bullet {
int speed = 100;
int pauseSpeed = 1;
int xSpeed, ySpeed;
int damage;
Bitmap bmp;
int width, height;
int centerX, centerY;
int startX, startY;
int x, y;
Minion minion;
boolean xLocked, yLocked;
boolean spent = false;
public Bullet(GameView gv, Bitmap bmp, int damage, int startX, int startY, Minion minion){
width = bmp.getWidth();
height = bmp.getHeight();
centerX = startX;
centerY = startY;
this.startX = centerX - width/2;
this.startY = centerY - height/2;
x = this.startX;
y = this.startY;
this.minion = minion;
this.bmp = bmp;
this.damage = damage;
xSpeed = gv.getWidth()/speed;
ySpeed = gv.getHeight()/speed;
xLocked = false;
yLocked = false;
}
public void update(){
// Minion location towards minion
int x2 = minion.centerX;
int y2 = minion.centerY;
// Which direction do we need to move?
// Find the sign on the direction, then multiply by the speed
if(xLocked){
x = minion.centerX - width/2;
}
else {
try {
x = x + (((x2 - centerX) / Math.abs(x2 - centerX)) * xSpeed * pauseSpeed);
} catch (Exception e) {
e.printStackTrace();
}
}
if(yLocked) {
y = minion.centerY - height / 2;
}
else {
try {
y = y + (((y2 - centerY) / Math.abs(y2 - centerY)) * ySpeed * pauseSpeed);
} catch (Exception e) {
e.printStackTrace();
}
}
centerX = x + width/2;
centerY = y + height/2;
}
public void onDraw(Canvas canvas){
update();
Rect src = new Rect(startX, startY, startX + width, startY + height);
Rect dest = new Rect(x, y, x + width, y + height);
canvas.drawBitmap(bmp, src, dest, null);
}
public boolean isCollision(){
boolean collide = false;
if((x + width >= minion.x || x < minion.x + minion.width) && (y + height > y || y <= minion.y + minion.height)){
collide = true;
}
return collide;
}
}

View File

@ -0,0 +1,13 @@
v1.04
Got onto git!
v1.03
v1.02
Fixed pause button
Added Help menu
Added graphics to start menu
Note: Do not hit the back button while in game
v1.01
Added the icon!

View File

@ -0,0 +1,112 @@
package com.hyperling.examplegame_practice;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
public class Game extends ActionBarActivity {
public String filename = "/data/data/com.hyperling.examplegame_practice/savedata";
public SAL sal;
public boolean contin = true;
public boolean exists = false;
public boolean mainPause = false;
public static GameView gameview;
public Game(){
//Empty
}
public Game(boolean bool){
this.contin = bool;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_load);
gameview = new GameView(Game.this);
sal = new SAL(filename);
if(contin){
//try{
// exists = sal.check();
//} catch(Exception e){System.out.println("Error checking in file exists in Continue Game");}
//if(exists){
System.out.println("Loading continue..");
//sal.load(gameview);
onRestart();
//}
}
setContentView(gameview);
}
public void onStart(){
super.onStart();
}
protected void onStop(){
super.onStop();
sal.save(gameview);
//gameview.stopThreads();
}
protected void onRestart(){
super.onRestart();
sal.load(gameview);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_game, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_reset) {
gameview = new GameView(Game.this);
setContentView(gameview);
return true;
}
else if (id == R.id.action_pause) {
mainPause = !mainPause;
if(mainPause){
//gameview.stopThreads();
item.setTitle("Resume");
}
else{
//gameview.startThreads();
item.setTitle("Pause");
}
try {
gameview.setMainPause(mainPause);
}
catch(Exception e){
e.printStackTrace();
System.out.println(e.toString());
System.out.println(mainPause);
}
return true;
}
return super.onOptionsItemSelected(item);
}
}

View File

@ -0,0 +1,262 @@
package com.hyperling.examplegame_practice;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import java.util.ArrayList;
/**
* Created by usb on 11/9/14.
*/
public class GameGrid {
GameView gv;
Paint paint = new Paint();
static int ROWS;
static int COLUMNS;
static GridCell[][] CELL;
public GridCell startCell;
public GridCell endCell;
public GridCell basicUpgradeCell = new GridCell();
public GridCell slowUpgradeCell = new GridCell();
ArrayList<GridCell> buildCells = new ArrayList<GridCell>();
ArrayList<GridCell> towers = new ArrayList<GridCell>();
//ArrayList<GridCell> pauseButton = new ArrayList<GridCell>();
static int CELL_COUNT;
static int CELL_WIDTH;
static int CELL_HEIGHT;
boolean showUpgrades;
public GameGrid(int numRows, int numColumns, GameView gameView){
paint.setStrokeWidth(0);
ROWS = numRows;
COLUMNS = numColumns;
CELL = new GridCell[ROWS][COLUMNS];
gv = gameView;
CELL_COUNT = ROWS*COLUMNS;
CELL_WIDTH = gv.getWidth()/COLUMNS;
CELL_HEIGHT = gv.getHeight()/ROWS;
int q = 0;
for(int i = 0; i < ROWS; i++){
for(int j = 0; j < COLUMNS; j++){
int[] id = {j,i}; // Need to be switched for some reason
CELL[i][j] = new GridCell(id, CELL_WIDTH, CELL_HEIGHT);
++q;
if(q == CELL_COUNT){
System.out.println("All cells created!");
}
}
}
}
public void onDraw(Canvas canvas){
paintCells(canvas);
paintBuildableBorders(canvas);
paintTowers(canvas);
paintTowerInfo(canvas);
if(showUpgrades){
paintUpgradeChoices(canvas);
}
else{
basicUpgradeCell.color = new GridCell().color;
slowUpgradeCell.color = new GridCell().color;
basicUpgradeCell = new GridCell();
slowUpgradeCell = new GridCell();
}
}
private void paintCells(Canvas canvas){
for(int i = 0; i < ROWS; i++){
for(int j = 0; j < COLUMNS; j++){
paint.setColor(CELL[i][j].getColor());
int side[] = CELL[i][j].getSides();
if (side[0] < 0) {
side[0] = 0;
}
if (side[1] < 0) {
side[1] = 0;
}
if (side[2] > gv.getWidth()) {
side[2] = gv.getWidth();
}
if (side[3] > gv.getHeight()) {
side[3] = gv.getHeight();
}
canvas.drawRect(side[0], side[1], side[2], side[3], paint);
//} catch(Exception e){
//System.out.println("GameGrid.paintCells() threw an error at cell[" + i + "][" + j + "]: " + e.toString());
//System.out.println("(int)Color is " + tempC);
//}
}
}
}
public void paintBuildableBorders(Canvas canvas){
for(GridCell buildCell : buildCells){
paint.setColor(buildCell.buildableInterior);
/*
int[] temp = buildCell.id;
int i = temp[0];
int j = temp[1];
*/
int[]side = buildCell.side;
int xSpace = buildCell.width/10;
int ySpace = buildCell.height/10;
canvas.drawRect(side[0] + xSpace, side[1] + ySpace, side[2] - xSpace, side[3] - ySpace, paint);
}
}
public void paintTowers(Canvas canvas){
String slow = "";
for(GridCell tower : towers){
paint.setColor(tower.innerColor);
/*
int[] temp = tower.id;
int i = temp[0];
int j = temp[1];
*/
int[]side = tower.side;
int xSpace = tower.width/4;
int ySpace = tower.height/4;
canvas.drawRect(side[0] + xSpace, side[1] + ySpace, side[2] - xSpace, side[3] - ySpace, paint);
paint.setColor(tower.buildableInterior);
if(tower.isSlowTower){
slow = "S";
} else {
slow = "";
}
canvas.drawText(tower.towerType + slow, tower.centerForTextX, tower.centerForTextY, paint);
}
}
public void paintTowerInfo(Canvas canvas){
GridCell fakeTower = new GridCell();
fakeTower.setTower();
int firstcost = 2;
int cost = firstcost;
int upgradecost;
int spent;
GridCell printCell = CELL[ROWS-2][0];
paint.setColor(Color.YELLOW);
canvas.drawText("Tower build costs:", printCell.centerForTextX, printCell.centerForTextY, paint);
for(int i = 0; i < COLUMNS/2; i++){
printCell = CELL[ROWS-1][i];
printCell.color = Color.WHITE;
upgradecost = fakeTower.towerUpgradeCost;
paint.setColor(fakeTower.innerColor);
canvas.drawText("" + cost, printCell.centerForTextX, printCell.centerForTextY, paint);
fakeTower.upgrade();
cost = upgradecost;
}
}
public void paintUpgradeChoices(Canvas canvas){
GridCell printCell = CELL[ROWS-2][COLUMNS-4];
paint.setColor(Color.YELLOW);
canvas.drawText("Upgrade choices:", printCell.centerForTextX, printCell.centerForTextY, paint);
int choice = 0;
for(int i = COLUMNS-1; i >= COLUMNS - printCell.towerChoices; i--){
printCell = CELL[ROWS-1][i];
if(choice == 0){
printCell.color = Color.RED;
canvas.drawText("Basic", printCell.centerForTextX, printCell.centerForTextY, paint);
basicUpgradeCell = printCell;
}
else if(choice == 1){
printCell.color = Color.BLUE;
canvas.drawText("Slow", printCell.centerForTextX, printCell.centerForTextY, paint);
slowUpgradeCell = printCell;
}
choice = choice + 1;
}
}
public void setStartCell(int[] id){
CELL[id[0]][id[1]].setStart();
startCell = CELL[id[0]][id[1]];
}
public void setEndCell(int[] id){
CELL[id[0]][id[1]].setEnd();
endCell = CELL[id[0]][id[1]];
}
public void setPathCell(int[] id){
CELL[id[0]][id[1]].setPath();
}
public void setBuildableCell(int[] id){
CELL[id[0]][id[1]].setBuildable();
buildCells.add(CELL[id[0]][id[1]]);
}
public void setTowerCell(int[] id){
CELL[id[0]][id[1]].setTower();
towers.add(CELL[id[0]][id[1]]);
//System.out.println("Tower added: " + id[0] + ", " + id[1]);
}
/*
public void setPausableCell(int[] id){
pauseButton.add(CELL[id[0]][id[1]]);
}
*/
public void setNullCell(int[] id){
CELL[id[0]][id[1]].setNull();
}
}

View File

@ -0,0 +1,57 @@
package com.hyperling.examplegame_practice;
import android.annotation.SuppressLint;
import android.graphics.Canvas;
/**
* Created by usb on 10/23/14.
*/
public class GameLoopThread extends Thread{
private GameView gameView;
private boolean running = false;
static final long FPS = 10;
public GameLoopThread(GameView gv){
gameView = gv;
}
public void setRunning(boolean run){
running = run;
}
@SuppressLint("WrongCall")
@Override
public void run(){
long tick = 1000 / FPS;
long startTime;
long sleepTime;
while(running){
Canvas c = null;
startTime = System.currentTimeMillis();
try {
c = gameView.getHolder().lockCanvas();
synchronized (gameView.getHolder()) {
gameView.onDraw(c);
}
} finally {
if (c != null) {
gameView.getHolder().unlockCanvasAndPost(c);
}
}
sleepTime = tick - (System.currentTimeMillis() - startTime);
try {
if (sleepTime > 0) {
sleep(sleepTime);
}
else {
sleep(10);
}
} catch (Exception e) {}
}
}
}

View File

@ -0,0 +1,938 @@
package com.hyperling.examplegame_practice;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Looper;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Timer;
import java.util.TimerTask;
/**
* Created by usb on 10/16/14.
*
*
*/
public class GameView extends SurfaceView implements Serializable {
private SurfaceHolder holder;
private ArrayList<Minion> minions = new ArrayList<Minion>();
private ArrayList<Bullet> bullets = new ArrayList<Bullet>();
//private int [][] minionTypes = new int [3][20]; // {amount, drawable, role}
private GameLoopThread gameLoopThread;
private Context baseContext;
Paint paint = new Paint();
Timer timer = new Timer();
TimerTask startGameTask;
TimerTask startNextLevelTask;
GameGrid gameGrid;
// Map specs
int numRows = 9;
int numColumns = 16;
int[] startCoords = {4, 0};
int[] endCoords = {4, 15};
int[] pathCoordsX = {4,4,4,4,4,4,4,4,4,4 ,4 ,4, 4, 4 ,-666}; // Row
int[] pathCoordsY = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,-666};// Column
int[] buildableCoordsX = {5,5,5,5,5,5,5,5,5, 5, 5, 5, 3,3,3,3,3,3,3,3,3, 3, 3, 3, -666};
int[] buildableCoordsY = {2,3,4,5,6,7,8,9,10,11,12,13,2,3,4,5,6,7,8,9,10,11,12,13,-666};
/*
int[] pausableCoordsX = { 1, 1, 1, 1, 2, 2, 2, 2,-666};
int[] pausableCoordsY = {11,12,13,14,11,12,13,14,-666};
*/
int startX, startY, endX, endY;
int[] startSides, endSides;
int defaultLives = 10;
int lives = defaultLives;
//boolean spawn = true;
int defaultExtraSpawn = 3;
int spawnNum = defaultExtraSpawn;
int spawnMore = spawnNum;
int spawnMoreBosses = 0;
int defaultRole = 1;
int role = defaultRole;
int defaultSpeed = 250;
int speed = defaultSpeed;
boolean remove;
int livesLost;
GridCell selectedTower;
boolean gridCreated = false;
boolean shoot;
int shootMinion;
int shootTower;
boolean gameOver = false;
boolean paused = false;
private Boolean mainPause = false;
public long mainPauseTime = 0;
public long mainUnPauseTime = 0;
private int minionPauseSpeed = 0;
int startTime = 2000;
int round = 1;
int wave = 0;
int killCount = 0;
int defaultMoney = 4;
int money = defaultMoney;
private long lastClick;
@SuppressLint("WrongCall")
public GameView(Context context) {
super(context);
baseContext = context;
gameLoopThread = new GameLoopThread(this);
holder = getHolder();
holder.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
boolean retry = true;
gameLoopThread.setRunning(false);
while (retry) {
try {
gameLoopThread.join();
retry = false;
} catch (InterruptedException e) {
}
gameLoopThread = new GameLoopThread(GameView.this);
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
/*
Canvas c = holder.lockCanvas(null);
onDraw(c);
holder.unlockCanvasAndPost(c);
*/
paint.setColor(Color.YELLOW);
paint.setStrokeWidth(0);
/*
timer = new Timer();
startGameTask = new TimerTask() {
@Override
public void run() {
createMinions();
gameLoopThread.setRunning(true);
gameLoopThread.start();
}
};
startNextLevelTask = new TimerTask() {
@Override
public void run() {
createMinions();
}
};
*/
createGrid();
paused = true;
startGameTask = new TimerTask() {
@Override
public void run() {
paused = false;
if(wave == 0){
startNextLevel();
}
startTime = 0;
}
};
gameLoopThread.setRunning(true);
gameLoopThread.start();
//System.out.println("Game will start in 5 seconds...");
timer.schedule(startGameTask, startTime);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format,
int width, int height) {
}
});
}
@Override
protected void onDraw(Canvas canvas) {
try {
canvas.drawColor(Color.BLACK);
// Display stats
canvas.drawText("Level: Round " + round + " wave " + wave, gameGrid.CELL[0][0].x, gameGrid.CELL[0][0].centerY, paint);
canvas.drawText("Money: " + money, gameGrid.CELL[1][0].x, gameGrid.CELL[1][0].y, paint);
canvas.drawText("Lives left: " + lives, gameGrid.CELL[1][0].x, gameGrid.CELL[1][0].centerY, paint);
if (!gameOver) {
gameGrid.onDraw(canvas);
shootMinion = 0;
for (GridCell tower : gameGrid.towers) {
tower.isReloading(mainPauseTime, mainUnPauseTime);
gameGrid.paintTowers(canvas);
}
if (mainPause) {
for (Minion minion : minions) {
if (minion.xSpeed > 0) {
minionPauseSpeed = minion.xSpeed;
minion.xSpeed = 0;
}
minion.onDraw(canvas);
}
for(Bullet bullet : bullets){
if(bullet.pauseSpeed == 1){
bullet.pauseSpeed = 0;
}
bullet.onDraw(canvas);
}
} else {
for (Minion minion : minions) {
if (minion.xSpeed == 0) {
minion.xSpeed = minionPauseSpeed;
}
}
for (Bullet bullet : bullets){
if(bullet.pauseSpeed == 0){
bullet.pauseSpeed = 1;
}
}
if (!paused) {
/*
// Paint the track!
paintSquare(canvas, startX, startY, Color.GREEN);
paintSquare(canvas, endX, endY, Color.RED);
paintRect(canvas, startX + trackSize / 2, startY + trackSize / 2, endX - startX - trackSize, trackSize, Color.YELLOW);
*/
if (wave == 6) {
//Spawn more bosses
if (minions.size() == 0 && spawnMoreBosses > 0) {
createBosses();
--spawnMoreBosses;
}
} else {
// Check if able to spawn
if (minions.size() == 0 && spawnMore > 0) {
createMinions();
--spawnMore;
}
}
// Move the bullets
for(Bullet bullet : bullets){
bullet.onDraw(canvas);
System.out.println("Drawing bullet for minion " + minions.indexOf(bullet.minion));
}
// See if bullet is hitting minion
/*
for(Bullet bullet : bullets){
if (!bullet.spent) {
if (bullet.minion.health > 0 && bullet.minion.isCollision(bullet.centerX, bullet.centerY)) {
damageMinion(bullet.minion, bullet.damage);
bullet.spent = true;
}
}
}
*/
for(Bullet bullet : bullets){
if (!bullet.spent) {
if (bullet.minion.health > 0 && bullet.isCollision()) {
damageMinion(bullet.minion, bullet.damage);
bullet.spent = true;
}
}
}
//for (int n = minions.size() - 1; n >= 0; n--) {
for (Minion minion : minions) {
//Minion minion = minions.get(n);
minion.onDraw(canvas);
/*
// Check if able to spawn
if(minion.isCollision(startSides)){
spawn = false;
} else {
spawn = true;
}
*/
if (wave == 6) {
//Spawn more bosses
if ((!minions.get(minions.size() - 1).isCollision(startSides)) && spawnMoreBosses > 0) {
createBosses();
--spawnMoreBosses;
}
} else {
// Check if able to spawn
if ((!minions.get(minions.size() - 1).isCollision(startSides)) && spawnMore > 0) {
createMinions();
--spawnMore;
}
}
/*
// Check if under tower fire
int[] minionCell = minion.getCellLocation(numRows, numColumns);
int i = minionCell[0];
int j = minionCell[1];
GridCell testTower;
// Test left cell
if(i > 1) {
testTower = gameGrid.CELL[i - 1][j];
if (testTower.isTower && System.currentTimeMillis() - testTower.lastShot > 500) {
shootMinion(testTower, minion);
break;
}
}
// Test top cell
if(j > 1) {
testTower = gameGrid.CELL[i][j - 1];
if (testTower.isTower && System.currentTimeMillis() - testTower.lastShot > 500) {
shootMinion(testTower, minion);
break;
}
}
// Test right cell
if(i < numRows) {
testTower = gameGrid.CELL[i + 1][j];
if (testTower.isTower && System.currentTimeMillis() - testTower.lastShot > 500) {
shootMinion(testTower, minion);
break;
}
}
// Test bottom cell
if(j < numColumns) {
testTower = gameGrid.CELL[i][j + 1];
if (testTower.isTower && System.currentTimeMillis() - testTower.lastShot > 500) {
shootMinion(testTower, minion);
break;
}
}
*/
/*
for(GridCell towerCell: gameGrid.towers){
shoot = !towerCell.isReloading();
//System.out.println("Tower " + towerCell.id[0] + ", " + towerCell.id[1] + "is in range: " + towerCell.isInRange(minion.x, minion.y));
if(shoot) {
if(towerCell.isInRange(minion.x, minion.y)){
shootMinion(towerCell, minion);
break;
}
}
}
*/
for (GridCell towerCell : gameGrid.towers) {
//System.out.println("Tower " + towerCell.id[0] + ", " + towerCell.id[1] + "is in range: " + towerCell.isInRange(minion.x, minion.y));
if (!towerCell.isReloading(mainPauseTime, mainUnPauseTime)) {
if (towerCell.isInRange(minion.x, minion.y)) {
if (minion.x >= minions.get(shootMinion).x) {
shoot = true;
shootMinion = minions.indexOf(minion);
shootTower = gameGrid.towers.indexOf(towerCell);
//shootMinion(towerCell, minion);
//break;
} else {
shoot = true;
}
}
}
}
/*
// Check if minion has reached end
if(minion.isCollision(endSides)){
--lives;
remove = true;
}
*/
// Check if minion has reached end
if (minion.isCollision(endSides)) {
remove = true;
livesLost = 1;
}
}
for(Bullet bullet : bullets){
if(bullet.spent){
bullets.remove(bullet);
}
}
if (shoot) {
if (minions.get(shootMinion).health <= gameGrid.towers.get(shootTower).damage) { // && shootMinion == 0) {
remove = false;
}
shootMinion(gameGrid.towers.get(shootTower), minions.get(shootMinion));
shoot = false;
}
// Remove minion if needed
if (remove) {
for(Bullet bullet : bullets){
if(minions.indexOf(bullet.minion) == 0){
bullet.spent = true;
}
}
minions.remove(minions.get(0));
lives = lives - livesLost;
//money = money + livesLost;
remove = false;
}
/*
// Spawn more if needed
if(spawnMore > 0 && spawn){
createMinions();
--spawnMore;
}
// Remove minion if needed
if(remove){
minions.remove(minions.get(0));
remove = false;
}
*/
// If minions have been defeated, advance levels!
if (spawnMore == 0 && spawnMoreBosses == 0 && minions.size() == 0) {
startNextLevel();
}
// If all lives have been lost, it's game over!
if (lives <= 0) {
gameOver = true;
}
/*
// Update the runners
try {
for (Minion minion : minions) {
minion.onDraw(canvas);
canvas.drawText("" + minion.health, minion.x + minion.width / 8, minion.y - trackSize / 2, paint);
//Spawn minion after last leaves spawn
if (minion.x > startX + trackSize / 2 && spawnMore > 0) {
spawn = true;
}
else {
spawn = false;
}
// If a minion reaches the end, remove him and a life
if (minion.isCollision(endX, endY)) {
minions.remove(minion);
--lives;
// If out of lives, game over!
if (lives <= 0) {
gameOver = true;
}
}
}
}
catch(Exception e){
System.out.println(e.toString());
}
if(spawn){
minions.add(createMinion(R.drawable.sprite_green01, 5));
--spawnMore;
spawn = false;
}
*/
}
}
} else {
canvas.drawText("GAME OVER", getWidth() / 2, getHeight() / 2, paint);
canvas.drawText("Round " + round + " wave " + wave, getWidth() / 2, getHeight() / 2 + 20, paint);
}
}
catch(Exception e){
System.out.println("Error in onDraw!");
e.printStackTrace();
System.out.println("Error in onDraw!");
}
}
private void createBosses(){
minions.add(createMinion(R.drawable.demon_king, round*10, speed*2));
}
private void createMinions(){
//bmp = BitmapFactory.decodeResource(getResources(), R.drawable.sprite_green01);
/* */
minions.add(createMinion(R.drawable.sprite_green01, role, speed));
// */
/*
for(; minionTypes[0][level] >= 0; --minionTypes[0][level]){
minions.add(createMinion(minionTypes[1][level], minionTypes[2][level]));
}
// */
}
private Minion createMinion(int resource, int role, int speed) {
Bitmap bmp = BitmapFactory.decodeResource(getResources(), resource);
return new Minion(this, bmp, role, speed, startX, startY);
}
private Bullet createBullet(int bulletresource, int damage, int startX, int startY, Minion minion){
Bitmap bulletbmp = BitmapFactory.decodeResource(getResources(), bulletresource);
return new Bullet(this, bulletbmp, damage, startX, startY, minion);
}
private void createGrid(){
if(!gridCreated) {
gameGrid = new GameGrid(numRows, numColumns, GameView.this);
gameGrid.setStartCell(startCoords);
gameGrid.setEndCell(endCoords);
for (int i = 0; true; i++) {
if (pathCoordsX[i] == -666) {
break;
}
int[] tempID = {pathCoordsX[i], pathCoordsY[i]};
gameGrid.setPathCell(tempID);
}
for (int i = 0; true; i++) {
if (buildableCoordsX[i] == -666) {
break;
}
int[] tempID = {buildableCoordsX[i], buildableCoordsY[i]};
gameGrid.setBuildableCell(tempID);
}
/*
for(int i = 0; true; i++){
if(pausableCoordsX[i] == -666){
break;
}
int[] tempID = {pausableCoordsX[i], pausableCoordsY[i]};
gameGrid.setPausableCell(tempID);
}
*/
startX = gameGrid.startCell.centerX;
startY = gameGrid.startCell.centerY;
startSides = gameGrid.startCell.getSides();
endX = gameGrid.endCell.centerX;
endY = gameGrid.endCell.centerY;
endSides = gameGrid.endCell.getSides();
gridCreated = true;
}
}
/*
private void paintSquare(Canvas canvas, int x, int y, int color){
paint.setColor(color);
paint.setStrokeWidth(0);
int side[] = new int[4];
side[0] = x - trackSize/2;//left
side[1] = y + trackSize/2;//top
side[2] = x + trackSize/2;//right
side[3] = y - trackSize/2;//bottom
if(side[0] < 0) {
side[0] = 0;
}
if(side[1] < 0) {
side[1] = 0;
}
if(side[2] > getWidth()) {
side[2] = getWidth();
}
if(side[3] > getHeight()) {
side[3] = getHeight();
}
canvas.drawRect(side[0], side[1], side[2], side[3], paint);
}
private void paintRect(Canvas canvas, int x, int y, int width, int height, int color){
paint.setColor(color);
paint.setStrokeWidth(0);
int side[] = new int[4];
side[0] = x;//left
side[1] = y;//top
side[2] = x + width;//right
side[3] = y - height;//bottom
if(side[0] < 0) {
side[0] = 0;
}
if(side[1] < 0) {
side[1] = 0;
}
if(side[2] > getWidth()) {
side[2] = getWidth();
}
if(side[3] > getHeight()) {
side[3] = getHeight();
}
canvas.drawRect(side[0], side[1], side[2], side[3], paint);
}
*/
@Override
public boolean onTouchEvent(MotionEvent event){
if (System.currentTimeMillis() - lastClick > 250) {
lastClick = System.currentTimeMillis();
float x = event.getX();
float y = event.getY();
synchronized (getHolder()) {
/*
for (int i = minions.size() - 1; i >= 0; i--) {
Minion minion = minions.get(i);
if (minion.isCollision(x, y)) {
damageMinion(minion);
if (minions.size() == 0) {
startNextLevel();
}
break;
}
}
*/
/*
for(GridCell pause : gameGrid.pauseButton){
if(pause.isCollision(x,y) && !paused){
paused = true;
pauseTime = System.currentTimeMillis();
}
else if(pause.isCollision(x,y) && paused){
paused = false;
unPauseTime = System.currentTimeMillis();
}
}
*/
for(GridCell tower: gameGrid.towers){
if(tower.isCollision(x,y)){ //) && money >= tower.towerUpgradeCost){
/*
money = money - tower.towerUpgradeCost;
tower.upgrade();
*/
gameGrid.showUpgrades = true;
selectedTower = tower;
}
}
if(gameGrid.showUpgrades){
if(!selectedTower.isSlowTower){
if(gameGrid.basicUpgradeCell.isCollision(x,y) && money >= selectedTower.towerUpgradeCost){
money = money - selectedTower.towerUpgradeCost;
selectedTower.upgrade();
gameGrid.showUpgrades = false;
}
else if(gameGrid.slowUpgradeCell.isCollision(x,y)){
selectedTower.setSlowTower();
gameGrid.showUpgrades = false;
}
}
else if(selectedTower.isSlowTower){
if(gameGrid.basicUpgradeCell.isCollision(x,y)){
selectedTower.setBasicTower();
gameGrid.showUpgrades = false;
}
else if(gameGrid.slowUpgradeCell.isCollision(x,y) && money >= selectedTower.towerUpgradeCost){
money = money - selectedTower.towerUpgradeCost;
selectedTower.upgrade();
gameGrid.showUpgrades = false;
}
}
}
for(int i = 0; true; i++){
if(buildableCoordsX[i] == -666){
break;
}
if(gameGrid.CELL[buildableCoordsX[i]][buildableCoordsY[i]].isCollision(x,y) && !gameGrid.CELL[buildableCoordsX[i]][buildableCoordsY[i]].isTower){
if(money >= gameGrid.CELL[buildableCoordsX[i]][buildableCoordsY[i]].defaultTowerCost) {
int[] temp = {buildableCoordsX[i], buildableCoordsY[i]};
gameGrid.setTowerCell(temp);
money = money - gameGrid.CELL[buildableCoordsX[i]][buildableCoordsY[i]].defaultTowerCost;
}
}
}
}
}
return true;
}
private void startNextLevel(){
//long pauseTime = System.currentTimeMillis();
// Pause for 5 seconds
//while(System.currentTimeMillis() - pauseTime < 5000){};
/*
while(killCount >= 5){
money = money + round;
killCount = killCount - 5;
}
*/
//money = money + round;
++wave;
if(wave > 6){
//money = money + round;
++round;
wave = 1;
++lives;
defaultSpeed = defaultSpeed - 5;
role = role + round-1;
money = money + role;
spawnMore = spawnNum - spawnNum/3;
//spawnNum = defaultExtraSpawn + (round-1);
}
++spawnNum;
speed = defaultSpeed - wave*wave;
startNextLevelTask = new TimerTask() {
@Override
public void run() {
paused = false;
if (wave == 6){
spawnMoreBosses = round -1;
createBosses();
} else {
spawnMore = spawnNum;
createMinions();
}
}
};
paused = true;
timer.schedule(startNextLevelTask, 3000);
}
/*
private void startNewGame(){
AlertDialog.Builder builder = new AlertDialog.Builder(baseContext);
builder.setMessage("Game over, try again?");
builder.setNegativeButton("No", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
android.os.Process.killProcess(android.os.Process.myPid());
dialogInterface.cancel();
}
});
builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
lives = defaultLives;
level = 0;
gameGrid = new GameGrid(numRows, numColumns, GameView.this);
createMinions();
dialogInterface.cancel();
}
});
AlertDialog alertDialog = builder.create();
alertDialog.show();
}
*/
public void shootMinion(GridCell tower, Minion minion){
tower.lastShot = System.currentTimeMillis();
tower.isReloading(mainPauseTime, mainUnPauseTime);
if(tower.isSlowTower){
slowMinion(minion);
}
bullets.add(createBullet(R.drawable.bullet_cc2, tower.damage, tower.centerX, tower.centerY, minion));
// Now called on collision with bullet
//damageMinion(minion, tower.damage);
}
public void damageMinion(Minion minion, int damage){
minion.health = minion.health - damage;
if(minion.health <= 0) {
for(Bullet bullet : bullets){
if(bullet.minion.health <= 0){
bullets.remove(bullet);
}
}
System.out.println("Dying minion health = " + minion.health);
minions.remove(minion);
++killCount;
// Award for kill count
if(wave == 6){
++money;
} else {
while (killCount >= 5) {
++money;
killCount = killCount - 5;
}
}
}
}
public void slowMinion(Minion minion){
minion.slowedTime = System.currentTimeMillis();
minion.isSlowed = true;
}
public void setMainPause(Boolean pause){
mainPause = pause;
if(mainPause){
mainPauseTime = System.currentTimeMillis();
} else {
mainUnPauseTime = System.currentTimeMillis();
}
}
/*
public void stopThreads(){
gameLoopThread.setRunning(false);
try {
//gameLoopThread.join();
gameLoopThread.suspend();
} catch (Exception e) {
System.out.println(e.toString());
e.printStackTrace();
}
}
public void startThreads(){
gameLoopThread.setRunning(true);
//gameLoopThread.start();
}
*/
/*
public void loadData(){
}
public String saveData(){
String save;
save = "";
return save;
}
*/
}

View File

@ -0,0 +1,271 @@
package com.hyperling.examplegame_practice;
import android.graphics.Color;
/**
* Created by usb on 11/9/14.
*/
public class GridCell {
int[] id; // x,y == row,column
int x,y; // coordinates
int height;
int width;
int side[] = new int[4]; // Left, Top, Right, Bottom
int centerX; // center coordinates
int centerY; // center coordinates
int centerForTextX;
int centerForTextY;
int startC = Color.GREEN;
int endC = Color.RED;
int pathC = Color.YELLOW;
int buildableC = Color.DKGRAY;
int buildableInterior = Color.CYAN;
int towerC = Color.BLUE;
int reloadingC = Color.WHITE;
int nullC = Color.TRANSPARENT;
int color = nullC;
int innerColor = color;
int towerType = 1;
int defaultTowerCost = 2;
int towerCost = defaultTowerCost;
int towerUpgradeCost;
int towerChoices = 2;
boolean isStart;
boolean isEnd;
boolean isPath;
boolean isBuildable;
boolean isTower;
boolean isSlowTower = false;
private boolean isReloading = false;
boolean isNull = true;
long lastShot = 0;
int defaultReload = 2500;
int reload = defaultReload;
int damage = 1;
public GridCell(){
findTowerCost();
}
public GridCell(int[] id, int width, int height){
this.id = id;
x = id[0] * width;
y = id[1] * height;
this.height = height;
this.width = width;
side[0] = x;//left
side[1] = y;//top
side[2] = x + width;//right
side[3] = y + height;//bottom
centerX = (side[0]+side[2])/2;
centerY = (side[1]+side[3])/2;
centerForTextX = centerX - width/24;
centerForTextY = centerY + height/16;
findTowerCost();
/*
if(side[0] < 0) {
side[0] = 0;
}
if(side[1] < 0) {
side[1] = 0;
}
if(side[2] > getWidth()) {
side[2] = getWidth();
}
if(side[3] > getHeight()) {
side[3] = getHeight();
}
*/
}
public int getColor(){
return color;
}
public int[] getSides(){
return side;
}
private void setAllFalse(){
isStart = false;
isEnd = false;
isPath = false;
isBuildable = false;
isTower = false;
isNull = true;
}
public void setStart(){
color = startC;
setAllFalse();
isStart = true;
}
public void setEnd(){
color = endC;
setAllFalse();
isEnd = true;
}
public void setPath(){
color = pathC;
setAllFalse();
isPath = true;
}
public void setBuildable(){
color = buildableC;
setAllFalse();
isBuildable = true;
}
public void setTower(){
color = buildableC;
innerColor = towerC;
setAllFalse();
isTower = true;
}
public void setBasicTower(){
isSlowTower = false;
damage = damage * 2;
if(damage == 0) {
damage = 1;
}
}
public void setSlowTower(){
isSlowTower = true;
damage = damage / 2;
}
public void setTowerReloading(){
innerColor = reloadingC;
isReloading = true;
}
public void setTowerReloaded(){
innerColor = towerC;
isReloading = false;
}
public void setNull(){
color = nullC;
setAllFalse();
isNull = true;
}
public void upgrade(){
towerCost = towerCost + towerUpgradeCost;
++towerType;
//if(!isSlowTower) {
switch (towerType) {
case 2:
towerC = Color.RED;
//towerUpgradeCost = 8;
break;
case 3:
towerC = Color.MAGENTA;
//towerUpgradeCost = 16;
break;
case 4:
towerC = Color.BLACK;
break;
}
innerColor = towerC;
//}
damage = damage * 2;
reload = defaultReload / towerType;
findTowerCost();
}
public boolean isCollision(float x2, float y2){
boolean collision = false;
if(x2 > side[0] && x2 < side[2] && y2 > side[1] && y2 < side[3]){
collision = true;
}
return collision;
}
public boolean isInRange(int x2, int y2){
boolean inRange = false;
if(x2 > side[0] - width && x2 < side[2] + width && y2 > side[1] - height && y2 < side[3] + height){
inRange = true;
}
return inRange;
}
/*
public boolean isReloading(){
if(System.currentTimeMillis() - lastShot > reload){
setTowerReloaded();
} else {
setTowerReloading();
}
return isReloading;
}
*/
public boolean isReloading(long pauseTime, long unPauseTime){
if(lastShot > pauseTime) {
if (System.currentTimeMillis() - lastShot > reload) {
setTowerReloaded();
} else {
setTowerReloading();
}
}
else if(unPauseTime > pauseTime){
if ((System.currentTimeMillis() - (unPauseTime - pauseTime))- lastShot > reload) {
setTowerReloaded();
} else {
setTowerReloading();
}
}
return isReloading;
}
private void findTowerCost(){
int nextTowerType = towerType + 1;
towerUpgradeCost = (defaultTowerCost * (damage * 2 ) * nextTowerType) - towerCost;
if(isSlowTower){
towerUpgradeCost = towerUpgradeCost*2;
}
}
}

View File

@ -0,0 +1,29 @@
package com.hyperling.examplegame_practice;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
/**
* Created by usb on 12/20/14.
*/
public class Help extends Activity{
Button btnBTS;
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_help);
btnBTS = (Button) findViewById(R.id.btnBackToStart);
btnBTS.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startActivity(new Intent(Help.this, MainActivity.class));
}
});
}
}

View File

@ -0,0 +1,114 @@
package com.hyperling.examplegame_practice;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends Activity {
public Game game;
Button btnStart, btnContinue, btnHelp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Deletes any old save files
//getBaseContext().deleteFile("savedata");
btnStart = (Button) findViewById(R.id.btnStart);
btnContinue = (Button) findViewById(R.id.btnContinue);
btnHelp = (Button) findViewById(R.id.btnHelp);
btnStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
game = new Game(false);
startActivity(new Intent(MainActivity.this, game.getClass()));
}
});
btnContinue.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
game = new Game(true);
startActivity(new Intent(MainActivity.this, game.getClass()));
}
});
btnHelp.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startActivity(new Intent(MainActivity.this, Help.class));
}
});
}
/*
protected void onPause(){
super.onPause();
// Stop threads
gameview.stopThreads();
}
protected void onResume(){
super.onResume();
// Restore previous session
//setContentView(gameview);
//gameview.startThreads();
}
*/
/*
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_reset) {
gameview = new GameView(MainActivity.this);
setContentView(gameview);
return true;
}
else if (id == R.id.action_pause) {
mainPause = !mainPause;
if(mainPause){
//gameview.stopThreads();
item.setTitle("Resume");
}
else{
//gameview.startThreads();
item.setTitle("Pause");
}
try {
gameview.setMainPause(mainPause);
}
catch(Exception e){
e.printStackTrace();
System.out.println(e.toString());
System.out.println(mainPause);
}
return true;
}
return super.onOptionsItemSelected(item);
}
*/
}

View File

@ -0,0 +1,207 @@
package com.hyperling.examplegame_practice;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Rect;
/**
* Created by usb on 10/23/14.
*/
public class Minion {
// How many rows and columns? Must find the little guy
private static final int BMP_ROWS = 4;
private static final int BMP_COLUMNS = 3;
// Direction the guy moves according to quadrants
String directions[] = {"down", "left", "right", "up"};
// Default speed
private final int SPEED_PER_STEP;
// Variables
int x, y, xSpeed, ySpeed, currentFrame, width, height;
int centerX, centerY;
GameView gameView;
Bitmap bmp;
//int role; //determines speed and health
int health;
long slowedTime;
boolean isSlowed;
int slow = 1;
public Minion(GameView gv, Bitmap bm, int role, int speed, int startX, int startY){
gameView = gv;
bmp = bm;
health = role;
this.SPEED_PER_STEP = speed;
xSpeed = SPEED_PER_STEP;
ySpeed = 0;
//Find size of individual character, not entire bitmap
width = bmp.getWidth() / BMP_COLUMNS;
height = bmp.getHeight() / BMP_ROWS;
x = startX;
y = startY - (height/2);
}
private void update(){
/*
//Turn around if hitting x walls
if(x > gameView.getWidth() - width - xSpeed){
xSpeed = -xSpeed;
}
if(x + xSpeed < 0){
xSpeed = Math.abs(xSpeed);
}
*/
int movement;
if(isSlowed){
slow = 3;
}
if(xSpeed > 0) {
movement = (gameView.getWidth() / (xSpeed));
} else {
movement = 0;
}
x = x + movement/slow;
centerX = x + width/2;
/*
//Turn around if hitting y walls
if(y > gameView.getWidth() - height - ySpeed){
ySpeed = -ySpeed;
}
if(y + ySpeed < 0){
ySpeed = Math.abs(ySpeed);
}
*/
if(ySpeed > 0) {
movement = (gameView.getHeight() / ySpeed);
} else {
movement = 0;
}
y = y + movement/slow;
centerY = y + height/2;
// Make him look like he's walking
// %BMP_COLUMNS makes it stay withing bounds
currentFrame = ++currentFrame % BMP_COLUMNS;
if(isSlowed){
if(System.currentTimeMillis() - slowedTime > 1000){
isSlowed = false;
slow = 1;
}
}
}
public void onDraw(Canvas canvas) {
// Move the guy
update();
int srcX = currentFrame * width;
int srcY = getAnimationRow() * height;
Rect src = new Rect(srcX, srcY, srcX + width, srcY + height);
Rect dest = new Rect(x, y, x + width, y + height);
canvas.drawBitmap(bmp, src, dest, null);
}
private int getAnimationRow() {
String dir = "";
String xdir = "";
String ydir = "";
int i;
// If stationary, look down
if(xSpeed == 0 && ySpeed == 0){
dir = "down";
}
else {
// Find x direction
if(xSpeed > 0) {
xdir = "right";
} else {
xdir = "left";
}
// Find y direction
if(ySpeed > 0){
ydir = "down";
}
else{
ydir = "up";
}
// Use whichever is stronger
if(Math.abs(xSpeed) > Math.abs(ySpeed)){
dir = xdir;
}
else{
dir = ydir;
}
}
// Match i for the direction
for(i = 0; i < 4; i++){
//System.out.println("dir is " + dir);
//System.out.println("x + xSpeed are " + (x+xSpeed));
//System.out.println("i says " + directions[i]);
if(directions[i].equals(dir)){
break;
}
}
//System.out.println(i);
return i;
}
public boolean isCollision(int x2, int y2) {
return x2 > x && x2 < x + width && y2 > y && y2 < y + height;
}
public boolean isCollision(int[] side) {
boolean isInside = false;
if(x > side[0] && x < side[2] && y > side[1] && y < side[3]){
isInside = true;
}
return isInside;
//return x2 > x && x2 < x + width && y2 > y && y2 < y + height;
}
/*
public int getRole() {
return role;
}
*/
public int[] getCellLocation(int numRows, int numColumns){
int i = gameView.getHeight()/numRows;
int j = gameView.getWidth()/numColumns;
int[] a = {i,j};
return a;
}
}

View File

@ -0,0 +1,78 @@
package com.hyperling.examplegame_practice;
import android.content.Context;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
/**
* Created by usb on 12/12/14.
*/
// Save and Load
public class SAL {
//GameView gv;
String filename;
public SAL(String fn){
//gv = gameView;
filename = fn;
}
/*
public SAL(GameView gameView, String fn){
gv = gameView;
filename = fn;
}
*/
public void save(GameView gv){
try{
FileOutputStream fileOutputStream = new FileOutputStream(filename);
ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
objectOutputStream.writeObject(gv);
objectOutputStream.close();
}
catch(Exception e){
System.out.println(e.toString());
e.printStackTrace();
System.out.println(e.toString());
}
}
public void load(GameView gv){
try{
FileInputStream fileInputStream = new FileInputStream(filename);
ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
gv = (GameView) objectInputStream.readObject();
objectInputStream.close();
}
catch(Exception e){
System.out.println(e.toString());
e.printStackTrace();
System.out.println(e.toString());
}
//return gv;
}
/*
public boolean check(){
boolean fileExists = false;
try
{
File file = new File(filename);
fileExists = file.exists();
}
catch(Exception e){System.out.println("Error checking in file exists in SAL");}
return fileExists;
}
*/
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 541 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 335 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 332 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 327 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 458 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

View File

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/btnBackToStart"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Back to Start"
android:textSize="18sp"
android:background="@drawable/startmenu_button_20141221_1148"/>
<!--
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Help"
android:textSize="32sp"
android:layout_gravity="center" />
-->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=" - To build a tower, click on a cyan square."
android:textSize="20sp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=" - To upgrade or convert a tower, click on the tower then choose an option in the lower right hand corner."
android:textSize="20sp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=" - The costs of the upgrades are in the lower left hand corner."
android:textSize="20sp"/>
</LinearLayout>

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<Spinner
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/spinner"
android:layout_centerInParent="true"/>
</RelativeLayout>
</LinearLayout>

View File

@ -0,0 +1,64 @@
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<!-- android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" -->
<RelativeLayout
android:id="@+id/rlMenu"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/startmenu_empty_20141221_1148"
android:layout_centerInParent="true"
android:orientation="vertical"
android:layout_margin="30dp"
android:padding="30dp">
<Button
android:id="@+id/btnStart"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/startmenu_button_20141221_1148"
android:text="Start New Game"
android:textSize="18sp"
android:layout_centerHorizontal="true"
android:layout_alignParentTop="true"
android:gravity="center"/>
<Button
android:id="@+id/btnContinue"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/startmenu_button_20141221_1148"
android:text="Continue Game"
android:textSize="18sp"
android:layout_gravity="center"
android:layout_centerInParent="true"
android:enabled="true"/>
<LinearLayout
android:id="@+id/HelpButtonWorkaround"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true">
<Button
android:id="@+id/btnHelp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/startmenu_button_20141221_1148"
android:text="Help"
android:textSize="18sp"/>
<!-- Fuck Relative layouts, margin bottom doesn't work in them?? What the fuck? Fuck that, man... Fuck.-->
</LinearLayout>
</RelativeLayout>
</RelativeLayout>

View File

@ -0,0 +1,16 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".MainActivity" >
<item android:id="@+id/action_pause"
android:title="Pause"
android:orderInCategory="100"
app:showAsAction="ifRoom"/>
<item android:id="@+id/action_reset"
android:title="Reset"
android:orderInCategory="100"
app:showAsAction="ifRoom" />
</menu>

View 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>

View File

@ -0,0 +1,5 @@
<resources>
<!-- Default screen margins, per the Android Design guidelines. -->
<dimen name="activity_horizontal_margin">16dp</dimen>
<dimen name="activity_vertical_margin">16dp</dimen>
</resources>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">C+C Tower Defense</string>
<string name="action_settings">Settings</string>
</resources>

View File

@ -0,0 +1,8 @@
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
</style>
</resources>

19
build.gradle Executable file
View File

@ -0,0 +1,19 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.0.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
}
}

18
gradle.properties Executable file
View File

@ -0,0 +1,18 @@
# 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.
# Default value: -Xmx10248m -XX:MaxPermSize=256m
# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
# 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

Binary file not shown.

6
gradle/wrapper/gradle-wrapper.properties vendored Executable file
View File

@ -0,0 +1,6 @@
#Wed Apr 10 15:27:10 PDT 2013
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip

164
gradlew vendored Executable file
View File

@ -0,0 +1,164 @@
#!/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
# For Cygwin, ensure paths are in UNIX format before anything is touched.
if $cygwin ; then
[ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
fi
# 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\"`/" >&-
APP_HOME="`pwd -P`"
cd "$SAVED" >&-
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"`
# 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
View 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
View File

@ -0,0 +1 @@
include ':app'