First commit
@@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<classpath>
|
||||||
|
<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
|
||||||
|
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
|
||||||
|
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>
|
||||||
|
<classpathentry kind="src" path="src"/>
|
||||||
|
<classpathentry kind="src" path="gen"/>
|
||||||
|
<classpathentry kind="output" path="bin/classes"/>
|
||||||
|
</classpath>
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<projectDescription>
|
||||||
|
<name>Pong</name>
|
||||||
|
<comment></comment>
|
||||||
|
<projects>
|
||||||
|
</projects>
|
||||||
|
<buildSpec>
|
||||||
|
<buildCommand>
|
||||||
|
<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
<buildCommand>
|
||||||
|
<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
<buildCommand>
|
||||||
|
<name>com.android.ide.eclipse.adt.ApkBuilder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
</buildSpec>
|
||||||
|
<natures>
|
||||||
|
<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
|
||||||
|
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||||
|
</natures>
|
||||||
|
</projectDescription>
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
eclipse.preferences.version=1
|
||||||
|
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
|
||||||
|
org.eclipse.jdt.core.compiler.compliance=1.6
|
||||||
|
org.eclipse.jdt.core.compiler.source=1.6
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
package="mangavalk.canvasfirsttry"
|
||||||
|
android:versionCode="1"
|
||||||
|
android:versionName="1.0" >
|
||||||
|
|
||||||
|
<uses-sdk
|
||||||
|
android:minSdkVersion="11"
|
||||||
|
android:targetSdkVersion="18" />
|
||||||
|
|
||||||
|
<application
|
||||||
|
android:allowBackup="true"
|
||||||
|
android:icon="@drawable/ic_launcher"
|
||||||
|
android:label="@string/app_name"
|
||||||
|
android:theme="@android:style/Theme.NoTitleBar.Fullscreen">
|
||||||
|
<activity
|
||||||
|
android:name="mangavalk.canvasfirsttry.MainActivity"
|
||||||
|
android:label="@string/app_name"
|
||||||
|
android:screenOrientation="landscape"
|
||||||
|
android:configChanges="keyboardHidden|orientation|screenSize">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
|
||||||
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
</application>
|
||||||
|
|
||||||
|
</manifest>
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
package="mangavalk.canvasfirsttry"
|
||||||
|
android:versionCode="1"
|
||||||
|
android:versionName="1.0" >
|
||||||
|
|
||||||
|
<uses-sdk
|
||||||
|
android:minSdkVersion="11"
|
||||||
|
android:targetSdkVersion="18" />
|
||||||
|
|
||||||
|
<application
|
||||||
|
android:allowBackup="true"
|
||||||
|
android:icon="@drawable/ic_launcher"
|
||||||
|
android:label="@string/app_name"
|
||||||
|
android:theme="@android:style/Theme.NoTitleBar.Fullscreen">
|
||||||
|
<activity
|
||||||
|
android:name="mangavalk.canvasfirsttry.MainActivity"
|
||||||
|
android:label="@string/app_name"
|
||||||
|
android:screenOrientation="landscape"
|
||||||
|
android:configChanges="keyboardHidden|orientation|screenSize">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
|
||||||
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
</application>
|
||||||
|
|
||||||
|
</manifest>
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
# cache for current jar dependency. DO NOT EDIT.
|
||||||
|
# format is <lastModified> <length> <SHA-1> <path>
|
||||||
|
# Encoding is UTF-8
|
||||||
|
After Width: | Height: | Size: 5.8 KiB |
|
After Width: | Height: | Size: 68 KiB |
|
After Width: | Height: | Size: 3.0 KiB |
|
After Width: | Height: | Size: 3.0 KiB |
|
After Width: | Height: | Size: 3.1 KiB |
|
After Width: | Height: | Size: 9.1 KiB |
|
After Width: | Height: | Size: 18 KiB |
@@ -0,0 +1,218 @@
|
|||||||
|
package mangavalk.canvasfirsttry;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.res.Resources;
|
||||||
|
import android.graphics.Bitmap;
|
||||||
|
import android.graphics.BitmapFactory;
|
||||||
|
import android.graphics.Canvas;
|
||||||
|
import android.graphics.Color;
|
||||||
|
import android.graphics.Matrix;
|
||||||
|
import android.graphics.Paint;
|
||||||
|
import android.graphics.Paint.Style;
|
||||||
|
import android.graphics.RectF;
|
||||||
|
import android.util.DisplayMetrics;
|
||||||
|
import android.util.TypedValue;
|
||||||
|
import android.view.Display;
|
||||||
|
import android.view.View;
|
||||||
|
|
||||||
|
public class CanvasView extends View {
|
||||||
|
Resources r ;
|
||||||
|
float dpHeight;
|
||||||
|
float dpWidth;
|
||||||
|
float Height;
|
||||||
|
float Width;
|
||||||
|
float moveX1,moveX2;
|
||||||
|
float moveY1,moveY2;
|
||||||
|
|
||||||
|
long oldTime;
|
||||||
|
|
||||||
|
public CanvasView(Context context) {
|
||||||
|
super(context);
|
||||||
|
|
||||||
|
super.setBackgroundColor(Color.WHITE);
|
||||||
|
oldTime = System.currentTimeMillis();
|
||||||
|
|
||||||
|
this.postInvalidate();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetActivity(Activity activity)
|
||||||
|
{
|
||||||
|
Display display = activity.getWindowManager().getDefaultDisplay();
|
||||||
|
DisplayMetrics outMetrics = new DisplayMetrics ();
|
||||||
|
display.getMetrics(outMetrics);
|
||||||
|
|
||||||
|
r = getResources();
|
||||||
|
float density = getResources().getDisplayMetrics().density;
|
||||||
|
dpHeight = outMetrics.heightPixels / density;
|
||||||
|
dpWidth = outMetrics.widthPixels / density;
|
||||||
|
Height = outMetrics.heightPixels;
|
||||||
|
Width = outMetrics.widthPixels;
|
||||||
|
|
||||||
|
moveY1 = 50;
|
||||||
|
moveY2 = 50;
|
||||||
|
}
|
||||||
|
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onDraw(Canvas canvas) {
|
||||||
|
count++;
|
||||||
|
|
||||||
|
long newTime = System.currentTimeMillis();
|
||||||
|
|
||||||
|
//drawText(canvas, count);
|
||||||
|
DrawFps(canvas, newTime);
|
||||||
|
drawPeddleRight(canvas, moveY1);
|
||||||
|
drawPeddleLeft(canvas, moveY2);
|
||||||
|
|
||||||
|
oldTime = newTime;
|
||||||
|
|
||||||
|
//this.postInvalidateDelayed( 100 );
|
||||||
|
this.postInvalidate();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void drawRoundedRectangle(Canvas canvas) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
Paint paint = new Paint();
|
||||||
|
paint.setAntiAlias(true);
|
||||||
|
paint.setColor(Color.MAGENTA);
|
||||||
|
paint.setStyle(Style.FILL);
|
||||||
|
int xPosition = 10;
|
||||||
|
int yPosition = 350;
|
||||||
|
int rectangleWidth = 100;
|
||||||
|
int rectangleHeight = 50;
|
||||||
|
RectF rect=new RectF(xPosition, yPosition, xPosition + rectangleWidth,
|
||||||
|
yPosition + rectangleHeight);
|
||||||
|
canvas.drawRoundRect(rect, 10,10, paint);
|
||||||
|
paint.setStyle(Style.STROKE);
|
||||||
|
xPosition = 150;
|
||||||
|
rect=new RectF(xPosition, yPosition, xPosition + rectangleWidth,
|
||||||
|
yPosition + rectangleHeight);
|
||||||
|
canvas.drawRoundRect(rect, 10,10, paint);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void drawRotatedImage(Canvas canvas) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
|
||||||
|
R.drawable.ic_launcher);
|
||||||
|
bitmap = Bitmap.createScaledBitmap(bitmap, 100, 100, false);
|
||||||
|
Matrix matrix = new Matrix();
|
||||||
|
matrix.postRotate(60);// angle to rotate in clockwise direction
|
||||||
|
matrix.postTranslate(200, 180);
|
||||||
|
|
||||||
|
canvas.drawBitmap(bitmap, matrix, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void DrawFps(Canvas canvas, long newTime)
|
||||||
|
{
|
||||||
|
Paint paint = new Paint();
|
||||||
|
paint.setColor(Color.BLACK);
|
||||||
|
paint.setTextSize(30);
|
||||||
|
String text = "FPS: " + (1000/(newTime-oldTime));
|
||||||
|
canvas.drawText(text, GetRealPixelSize(dpWidth, 5), GetRealPixelSize(dpHeight, 5), paint);
|
||||||
|
}
|
||||||
|
|
||||||
|
float map(float x, float in_min, float in_max, float out_min, float out_max)
|
||||||
|
{
|
||||||
|
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void drawPeddleRight(Canvas canvas, float i) {
|
||||||
|
Paint paint = new Paint();
|
||||||
|
paint.setAntiAlias(true);
|
||||||
|
paint.setColor(Color.BLACK);
|
||||||
|
paint.setStyle(Style.FILL);
|
||||||
|
|
||||||
|
float rectangleWidth = 2;
|
||||||
|
float rectangleHeight = 20;
|
||||||
|
|
||||||
|
float xPosition = 97;
|
||||||
|
float yPosition = i;
|
||||||
|
yPosition = yPosition <= (100-(rectangleHeight / 2))?yPosition:(100-(rectangleHeight / 2));
|
||||||
|
yPosition = yPosition >= (rectangleHeight / 2)?yPosition:(rectangleHeight / 2);
|
||||||
|
|
||||||
|
canvas.drawRect(
|
||||||
|
GetRealPixelSize(dpWidth, xPosition),
|
||||||
|
GetRealPixelSize(dpHeight, yPosition - (rectangleHeight / 2)),
|
||||||
|
GetRealPixelSize(dpWidth, xPosition + (rectangleWidth)),
|
||||||
|
GetRealPixelSize(dpHeight, yPosition + (rectangleHeight / 2)), paint);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void drawPeddleLeft(Canvas canvas, float i) {
|
||||||
|
Paint paint = new Paint();
|
||||||
|
paint.setAntiAlias(true);
|
||||||
|
paint.setColor(Color.BLACK);
|
||||||
|
paint.setStyle(Style.FILL);
|
||||||
|
|
||||||
|
float rectangleWidth = 2;
|
||||||
|
float rectangleHeight = 20;
|
||||||
|
|
||||||
|
float xPosition = 3;
|
||||||
|
float yPosition = i;
|
||||||
|
yPosition = yPosition <= (100-(rectangleHeight / 2))?yPosition:(100-(rectangleHeight / 2));
|
||||||
|
yPosition = yPosition >= (rectangleHeight / 2)?yPosition:(rectangleHeight / 2);
|
||||||
|
|
||||||
|
canvas.drawRect(
|
||||||
|
GetRealPixelSize(dpWidth, xPosition - (rectangleWidth)),
|
||||||
|
GetRealPixelSize(dpHeight, yPosition - (rectangleHeight / 2)),
|
||||||
|
GetRealPixelSize(dpWidth, xPosition),
|
||||||
|
GetRealPixelSize(dpHeight, yPosition + (rectangleHeight / 2)), paint);
|
||||||
|
}
|
||||||
|
|
||||||
|
private float GetRealPixelSize(float dpWH, float DIP)
|
||||||
|
{
|
||||||
|
return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, (dpWH * ( DIP / 100 )), r.getDisplayMetrics());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void drawImage(Canvas canvas) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
|
||||||
|
R.drawable.ic_launcher);
|
||||||
|
bitmap = Bitmap.createScaledBitmap(bitmap, 100, 100, false);
|
||||||
|
canvas.drawBitmap(bitmap, 10, 200, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void drawRectangle(Canvas canvas) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
Paint paint = new Paint();
|
||||||
|
paint.setAntiAlias(true);
|
||||||
|
paint.setColor(Color.RED);
|
||||||
|
paint.setStyle(Style.FILL);
|
||||||
|
int xPosition = 10;
|
||||||
|
int yPosition = 150;
|
||||||
|
int rectangleWidth = 100;
|
||||||
|
int rectangleHeight = 50;
|
||||||
|
canvas.drawRect(xPosition, yPosition, xPosition + rectangleWidth,
|
||||||
|
yPosition + rectangleHeight, paint);
|
||||||
|
paint.setStyle(Style.STROKE);
|
||||||
|
xPosition = 150;
|
||||||
|
canvas.drawRect(xPosition, yPosition, xPosition + rectangleWidth,
|
||||||
|
yPosition + rectangleHeight, paint);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void drawCircle(Canvas canvas) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
Paint paint = new Paint();
|
||||||
|
paint.setAntiAlias(true);
|
||||||
|
paint.setColor(Color.BLUE);
|
||||||
|
paint.setStyle(Style.FILL);
|
||||||
|
canvas.drawCircle(50, 60, 50, paint);
|
||||||
|
paint.setStyle(Style.STROKE);
|
||||||
|
canvas.drawCircle(200, 60, 50, paint);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendMove(float x, float y) {
|
||||||
|
if (x / Width >= 0.6f)
|
||||||
|
{
|
||||||
|
moveX1 = (x / Width) * 100;
|
||||||
|
moveY1 = (y / Height) * 100;
|
||||||
|
}
|
||||||
|
else if (x / Width <= 0.4f)
|
||||||
|
{
|
||||||
|
moveX2 = (x / Width) * 100;
|
||||||
|
moveY2 = (y / Height) * 100;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
/** Automatically generated file. DO NOT MODIFY */
|
||||||
|
package mangavalk.canvasfirsttry;
|
||||||
|
|
||||||
|
public final class BuildConfig {
|
||||||
|
public final static boolean DEBUG = true;
|
||||||
|
}
|
||||||
@@ -0,0 +1,76 @@
|
|||||||
|
/* AUTO-GENERATED FILE. DO NOT MODIFY.
|
||||||
|
*
|
||||||
|
* This class was automatically generated by the
|
||||||
|
* aapt tool from the resource data it found. It
|
||||||
|
* should not be modified by hand.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package mangavalk.canvasfirsttry;
|
||||||
|
|
||||||
|
public final class R {
|
||||||
|
public static final class attr {
|
||||||
|
}
|
||||||
|
public static final class dimen {
|
||||||
|
/** Default screen margins, per the Android Design guidelines.
|
||||||
|
|
||||||
|
Customize dimensions originally defined in res/values/dimens.xml (such as
|
||||||
|
screen margins) for sw720dp devices (e.g. 10" tablets) in landscape here.
|
||||||
|
|
||||||
|
*/
|
||||||
|
public static final int activity_horizontal_margin=0x7f050000;
|
||||||
|
public static final int activity_vertical_margin=0x7f050001;
|
||||||
|
}
|
||||||
|
public static final class drawable {
|
||||||
|
public static final int gameover=0x7f020000;
|
||||||
|
public static final int ic_launcher=0x7f020001;
|
||||||
|
public static final int player1=0x7f020002;
|
||||||
|
public static final int player2=0x7f020003;
|
||||||
|
}
|
||||||
|
public static final class id {
|
||||||
|
public static final int action_settings=0x7f090000;
|
||||||
|
}
|
||||||
|
public static final class layout {
|
||||||
|
public static final int activity_main=0x7f030000;
|
||||||
|
}
|
||||||
|
public static final class menu {
|
||||||
|
public static final int main=0x7f080000;
|
||||||
|
}
|
||||||
|
public static final class raw {
|
||||||
|
public static final int bat_cat=0x7f040000;
|
||||||
|
public static final int gameover=0x7f040001;
|
||||||
|
public static final int pling=0x7f040002;
|
||||||
|
}
|
||||||
|
public static final class string {
|
||||||
|
public static final int action_settings=0x7f060001;
|
||||||
|
public static final int app_name=0x7f060000;
|
||||||
|
public static final int hello_world=0x7f060002;
|
||||||
|
}
|
||||||
|
public static final class style {
|
||||||
|
/**
|
||||||
|
Base application theme, dependent on API level. This theme is replaced
|
||||||
|
by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
|
||||||
|
|
||||||
|
|
||||||
|
Theme customizations available in newer API levels can go in
|
||||||
|
res/values-vXX/styles.xml, while customizations related to
|
||||||
|
backward-compatibility can go here.
|
||||||
|
|
||||||
|
|
||||||
|
Base application theme for API 11+. This theme completely replaces
|
||||||
|
AppBaseTheme from res/values/styles.xml on API 11+ devices.
|
||||||
|
|
||||||
|
API 11 theme customizations can go here.
|
||||||
|
|
||||||
|
Base application theme for API 14+. This theme completely replaces
|
||||||
|
AppBaseTheme from BOTH res/values/styles.xml and
|
||||||
|
res/values-v11/styles.xml on API 14+ devices.
|
||||||
|
|
||||||
|
API 14 theme customizations can go here.
|
||||||
|
*/
|
||||||
|
public static final int AppBaseTheme=0x7f070000;
|
||||||
|
/** Application theme.
|
||||||
|
All customizations that are NOT specific to a particular API-level can go here.
|
||||||
|
*/
|
||||||
|
public static final int AppTheme=0x7f070001;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
After Width: | Height: | Size: 50 KiB |
@@ -0,0 +1,20 @@
|
|||||||
|
# To enable ProGuard in your project, edit project.properties
|
||||||
|
# to define the proguard.config property as described in that file.
|
||||||
|
#
|
||||||
|
# Add project specific ProGuard rules here.
|
||||||
|
# By default, the flags in this file are appended to flags specified
|
||||||
|
# in ${sdk.dir}/tools/proguard/proguard-android.txt
|
||||||
|
# You can edit the include path and order by changing the ProGuard
|
||||||
|
# include property in project.properties.
|
||||||
|
#
|
||||||
|
# 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,14 @@
|
|||||||
|
# This file is automatically generated by Android Tools.
|
||||||
|
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
|
||||||
|
#
|
||||||
|
# This file must be checked in Version Control Systems.
|
||||||
|
#
|
||||||
|
# To customize properties used by the Ant build system edit
|
||||||
|
# "ant.properties", and override values to adapt the script to your
|
||||||
|
# project structure.
|
||||||
|
#
|
||||||
|
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
|
||||||
|
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
|
||||||
|
|
||||||
|
# Project target.
|
||||||
|
target=android-19
|
||||||
|
After Width: | Height: | Size: 7.5 KiB |
|
After Width: | Height: | Size: 70 KiB |
|
After Width: | Height: | Size: 3.7 KiB |
|
After Width: | Height: | Size: 9.2 KiB |
|
After Width: | Height: | Size: 9.6 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 24 KiB |
@@ -0,0 +1,16 @@
|
|||||||
|
<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"
|
||||||
|
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=".MainActivity" >
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/hello_world" />
|
||||||
|
|
||||||
|
</RelativeLayout>
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
|
||||||
|
|
||||||
|
<item
|
||||||
|
android:id="@+id/action_settings"
|
||||||
|
android:orderInCategory="100"
|
||||||
|
android:showAsAction="never"
|
||||||
|
android:title="@string/action_settings"/>
|
||||||
|
|
||||||
|
</menu>
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
<resources>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Customize dimensions originally defined in res/values/dimens.xml (such as
|
||||||
|
screen margins) for sw600dp devices (e.g. 7" tablets) here.
|
||||||
|
-->
|
||||||
|
|
||||||
|
</resources>
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
<resources>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Customize dimensions originally defined in res/values/dimens.xml (such as
|
||||||
|
screen margins) for sw720dp devices (e.g. 10" tablets) in landscape here.
|
||||||
|
-->
|
||||||
|
<dimen name="activity_horizontal_margin">128dp</dimen>
|
||||||
|
|
||||||
|
</resources>
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
<resources>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Base application theme for API 11+. This theme completely replaces
|
||||||
|
AppBaseTheme from res/values/styles.xml on API 11+ devices.
|
||||||
|
-->
|
||||||
|
<style name="AppBaseTheme" parent="android:Theme.Holo.Light">
|
||||||
|
<!-- API 11 theme customizations can go here. -->
|
||||||
|
</style>
|
||||||
|
|
||||||
|
</resources>
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
<resources>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Base application theme for API 14+. This theme completely replaces
|
||||||
|
AppBaseTheme from BOTH res/values/styles.xml and
|
||||||
|
res/values-v11/styles.xml on API 14+ devices.
|
||||||
|
-->
|
||||||
|
<style name="AppBaseTheme" parent="android:Theme.Holo.Light.DarkActionBar">
|
||||||
|
<!-- API 14 theme customizations can go here. -->
|
||||||
|
</style>
|
||||||
|
|
||||||
|
</resources>
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
<resources>
|
||||||
|
|
||||||
|
<!-- Default screen margins, per the Android Design guidelines. -->
|
||||||
|
<dimen name="activity_horizontal_margin">16dp</dimen>
|
||||||
|
<dimen name="activity_vertical_margin">16dp</dimen>
|
||||||
|
|
||||||
|
</resources>
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
|
||||||
|
<string name="app_name">CanvasFirstTry</string>
|
||||||
|
<string name="action_settings">Settings</string>
|
||||||
|
<string name="hello_world">Hello world!</string>
|
||||||
|
|
||||||
|
</resources>
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
<resources>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Base application theme, dependent on API level. This theme is replaced
|
||||||
|
by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
|
||||||
|
-->
|
||||||
|
<style name="AppBaseTheme" parent="android:Theme.Light">
|
||||||
|
<!--
|
||||||
|
Theme customizations available in newer API levels can go in
|
||||||
|
res/values-vXX/styles.xml, while customizations related to
|
||||||
|
backward-compatibility can go here.
|
||||||
|
-->
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<!-- Application theme. -->
|
||||||
|
<style name="AppTheme" parent="AppBaseTheme">
|
||||||
|
<!-- All customizations that are NOT specific to a particular API-level can go here. -->
|
||||||
|
</style>
|
||||||
|
|
||||||
|
</resources>
|
||||||
@@ -0,0 +1,675 @@
|
|||||||
|
package mangavalk.canvasfirsttry;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.res.Resources;
|
||||||
|
import android.graphics.Bitmap;
|
||||||
|
import android.graphics.BitmapFactory;
|
||||||
|
import android.graphics.Canvas;
|
||||||
|
import android.graphics.Color;
|
||||||
|
import android.graphics.Paint;
|
||||||
|
import android.graphics.Paint.Style;
|
||||||
|
import android.graphics.RectF;
|
||||||
|
import android.media.AudioManager;
|
||||||
|
import android.media.SoundPool;
|
||||||
|
import android.util.DisplayMetrics;
|
||||||
|
import android.util.TypedValue;
|
||||||
|
import android.view.Display;
|
||||||
|
import android.view.View;
|
||||||
|
|
||||||
|
public class CanvasView extends View
|
||||||
|
{
|
||||||
|
//region Variabelen
|
||||||
|
Resources r;
|
||||||
|
|
||||||
|
// Sizes
|
||||||
|
float dpHeight;
|
||||||
|
float dpWidth;
|
||||||
|
|
||||||
|
float Height;
|
||||||
|
float Width;
|
||||||
|
|
||||||
|
// Screen Boundary's
|
||||||
|
float boundaryTop = 10;
|
||||||
|
float boundaryBottom = 95;
|
||||||
|
|
||||||
|
// Pointers
|
||||||
|
float moveX1,moveX2;
|
||||||
|
float moveY1,moveY2;
|
||||||
|
|
||||||
|
// Ball
|
||||||
|
boolean bounceXdirection, bounceYdirection;
|
||||||
|
float bounceX, bounceY;
|
||||||
|
float speedX, speedY;
|
||||||
|
|
||||||
|
// Pedles
|
||||||
|
float rectangleHeight1 = 20;
|
||||||
|
float rectangleHeight2 = 20;
|
||||||
|
|
||||||
|
// Score
|
||||||
|
int score;
|
||||||
|
int Player1Life = 3;
|
||||||
|
int Player2Life = 3;
|
||||||
|
|
||||||
|
// Fps
|
||||||
|
long oldTime;
|
||||||
|
|
||||||
|
// Sound
|
||||||
|
boolean musicisplaying = false;
|
||||||
|
private SoundPool soundPool,soundPool2;
|
||||||
|
private int Sound_Pling,Sound_GameOver,Sound_Music;
|
||||||
|
|
||||||
|
// Game Status
|
||||||
|
boolean gamePlaying = false;
|
||||||
|
boolean gameover = false;
|
||||||
|
|
||||||
|
// Difficulty
|
||||||
|
int BotDif = 0;
|
||||||
|
|
||||||
|
// Style
|
||||||
|
int selectedStyle = 0;
|
||||||
|
boolean StyleRound = true;
|
||||||
|
|
||||||
|
int Color_PedleLeft = Color.WHITE;
|
||||||
|
int Color_PedleRight = Color.WHITE;
|
||||||
|
int Color_Ball = Color.RED;
|
||||||
|
int Color_ScoreBar = Color.GRAY;
|
||||||
|
int Color_Footer = Color.GRAY;
|
||||||
|
int Color_Background = Color.BLACK;
|
||||||
|
int Color_Score = Color.WHITE;
|
||||||
|
|
||||||
|
//endregion Variabelen
|
||||||
|
|
||||||
|
public CanvasView(Context context) {
|
||||||
|
super(context);
|
||||||
|
|
||||||
|
super.setBackgroundColor(Color_Background);
|
||||||
|
oldTime = System.currentTimeMillis();
|
||||||
|
|
||||||
|
this.postInvalidate();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetActivity(Activity activity)
|
||||||
|
{
|
||||||
|
Display display = activity.getWindowManager().getDefaultDisplay();
|
||||||
|
DisplayMetrics outMetrics = new DisplayMetrics ();
|
||||||
|
display.getMetrics(outMetrics);
|
||||||
|
|
||||||
|
r = getResources();
|
||||||
|
float density = getResources().getDisplayMetrics().density;
|
||||||
|
dpHeight = outMetrics.heightPixels / density;
|
||||||
|
dpWidth = outMetrics.widthPixels / density;
|
||||||
|
Height = outMetrics.heightPixels;
|
||||||
|
Width = outMetrics.widthPixels;
|
||||||
|
|
||||||
|
// Set Basic Score And Pedle Position
|
||||||
|
moveY1 = 50;
|
||||||
|
moveY2 = 50;
|
||||||
|
|
||||||
|
bounceX = bounceY = 40 + (int)(Math.random() * ((60 - 40) + 1));
|
||||||
|
bounceY = bounceY = 0 + (int)(Math.random() * ((100 - 0) + 1));
|
||||||
|
|
||||||
|
speedX = 1;
|
||||||
|
speedY = 1.1f;
|
||||||
|
|
||||||
|
// Load the sound
|
||||||
|
soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
|
||||||
|
soundPool2 = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
|
||||||
|
|
||||||
|
Sound_Pling = soundPool.load(activity, R.raw.pling, 1);
|
||||||
|
Sound_GameOver = soundPool.load(activity, R.raw.gameover, 1);
|
||||||
|
Sound_Music = soundPool2.load(activity, R.raw.bat_cat, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onDraw(Canvas canvas)
|
||||||
|
{
|
||||||
|
if (musicisplaying == false)
|
||||||
|
{
|
||||||
|
soundPool2.play(Sound_Music, 1, 1, 0, -1, 1);
|
||||||
|
musicisplaying = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gamePlaying)
|
||||||
|
{
|
||||||
|
Bot();
|
||||||
|
|
||||||
|
drawPeddleRight(canvas);
|
||||||
|
drawPeddleLeft(canvas);
|
||||||
|
|
||||||
|
Bal();
|
||||||
|
drawCircle(canvas, bounceX, bounceY);
|
||||||
|
|
||||||
|
// Draw Score Bar
|
||||||
|
ScoreBar(canvas, boundaryTop);
|
||||||
|
Footer(canvas, boundaryBottom);
|
||||||
|
|
||||||
|
// Fps
|
||||||
|
long newTime = System.currentTimeMillis();
|
||||||
|
DrawFps(canvas, newTime);
|
||||||
|
|
||||||
|
// Score
|
||||||
|
DrawText(canvas, "Life: " + Player1Life, 15);
|
||||||
|
DrawText(canvas, "Score: " + score, 45);
|
||||||
|
DrawText(canvas, "Life: " + Player2Life, 85);
|
||||||
|
|
||||||
|
oldTime = newTime;
|
||||||
|
|
||||||
|
if (gameover)
|
||||||
|
{
|
||||||
|
gameover = false;
|
||||||
|
|
||||||
|
// Sound
|
||||||
|
soundPool.play(Sound_GameOver, .5f, .5f, 0, 0, 1);
|
||||||
|
|
||||||
|
// Show GameOver message
|
||||||
|
if ((Player1Life < 0) || (Player2Life < 0))
|
||||||
|
{
|
||||||
|
DrawGameOver(canvas);
|
||||||
|
|
||||||
|
gamePlaying = false;
|
||||||
|
|
||||||
|
// New Life
|
||||||
|
Player1Life = 3;
|
||||||
|
Player2Life = 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
// New Ball
|
||||||
|
|
||||||
|
// Position
|
||||||
|
bounceX = 40 + (int)(Math.random() * ((60 - 40) + 1));
|
||||||
|
bounceY = 0 + (int)(Math.random() * ((100 - 0) + 1));
|
||||||
|
|
||||||
|
// Direction
|
||||||
|
bounceXdirection = Math.random() >= 0.5f ? true : false;
|
||||||
|
|
||||||
|
// Speed
|
||||||
|
speedX = 1f;
|
||||||
|
speedY = 1f;
|
||||||
|
|
||||||
|
// Respawn time
|
||||||
|
this.postInvalidateDelayed( 5000 );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
this.postInvalidate();
|
||||||
|
}
|
||||||
|
else // Show Start Menu
|
||||||
|
{
|
||||||
|
// Uhem
|
||||||
|
SetStyle(0);
|
||||||
|
|
||||||
|
Rect(canvas, 15, 25, 10, 25, Color.GRAY);
|
||||||
|
DrawText(canvas, "Start", 15, 20, 50);
|
||||||
|
|
||||||
|
Rect(canvas, 15+2, 25+2, 65, 80, Color.GRAY);
|
||||||
|
DrawText(canvas, "Style:", 70, 20+2, 50);
|
||||||
|
|
||||||
|
|
||||||
|
Rect(canvas, 25+4, 35+4, 65, 80, selectedStyle == 0 ? Color.RED : Color.GRAY);
|
||||||
|
DrawText(canvas, "Retro", 70, 30+4, 50);
|
||||||
|
|
||||||
|
if ((moveX1 >= 65 && moveX1 <= 80) && (moveY1 >= 25+4 && moveY1 <= 35+4))
|
||||||
|
selectedStyle = 0;
|
||||||
|
|
||||||
|
|
||||||
|
Rect(canvas, 35+6, 45+6, 65, 80, selectedStyle == 1 ? Color.RED : Color.GRAY);
|
||||||
|
DrawText(canvas, "Neon", 70, 40+6, 50);
|
||||||
|
|
||||||
|
if ((moveX1 >= 65 && moveX1 <= 80) && (moveY1 >= 35+6 && moveY1 <= 45+6))
|
||||||
|
selectedStyle = 1;
|
||||||
|
|
||||||
|
|
||||||
|
Rect(canvas, 45+8, 55+8, 65, 80, selectedStyle == 2 ? Color.RED : Color.GRAY);
|
||||||
|
DrawText(canvas, "Red", 70, 50+8, 50);
|
||||||
|
|
||||||
|
if ((moveX1 >= 65 && moveX1 <= 80) && (moveY1 >= 45+8 && moveY1 <= 55+8))
|
||||||
|
selectedStyle = 2;
|
||||||
|
|
||||||
|
|
||||||
|
Rect(canvas, 15+2, 25+2, 45, 60, Color.GRAY);
|
||||||
|
DrawText(canvas, "Bot:", 50, 20+2, 50);
|
||||||
|
|
||||||
|
Rect(canvas, 25+4, 35+4, 45, 60, BotDif == 0 ? Color.RED : Color.GRAY);
|
||||||
|
DrawText(canvas, "Hard", 50, 30+4, 50);
|
||||||
|
|
||||||
|
if ((moveX1 >= 45 && moveX1 <= 60) && (moveY1 >= 25+4 && moveY1 <= 35+4))
|
||||||
|
BotDif = 0;
|
||||||
|
|
||||||
|
|
||||||
|
Rect(canvas, 35+6, 45+6, 45, 60, BotDif == 1 ? Color.RED : Color.GRAY);
|
||||||
|
DrawText(canvas, "Normal", 50, 40+6, 50);
|
||||||
|
|
||||||
|
if ((moveX1 >= 45 && moveX1 <= 60) && (moveY1 >= 35+6 && moveY1 <= 45+6))
|
||||||
|
BotDif = 1;
|
||||||
|
|
||||||
|
|
||||||
|
Rect(canvas, 45+8, 55+8, 45, 60, BotDif == 2 ? Color.RED : Color.GRAY);
|
||||||
|
DrawText(canvas, "Easy", 50, 50+8, 50);
|
||||||
|
|
||||||
|
if ((moveX1 >= 45 && moveX1 <= 60) && (moveY1 >= 45+8 && moveY1 <= 55+8))
|
||||||
|
BotDif = 2;
|
||||||
|
|
||||||
|
Rect(canvas, 55+10, 65+10, 45, 60, BotDif == 3 ? Color.RED : Color.GRAY);
|
||||||
|
DrawText(canvas, "Novice", 50, 60+10, 50);
|
||||||
|
|
||||||
|
if ((moveX1 >= 45 && moveX1 <= 60) && (moveY1 >= 55+10 && moveY1 <= 65+10))
|
||||||
|
BotDif = 3;
|
||||||
|
|
||||||
|
|
||||||
|
Rect(canvas, 65+12, 75+12, 45, 60, BotDif == 4 ? Color.RED : Color.GRAY);
|
||||||
|
DrawText(canvas, "Off", 50, 70+12, 50);
|
||||||
|
|
||||||
|
if ((moveX1 >= 45 && moveX1 <= 60) && (moveY1 >= 65+12 && moveY1 <= 75+12))
|
||||||
|
BotDif = 4;
|
||||||
|
|
||||||
|
|
||||||
|
if ((moveX1 >= 15 && moveX1 <= 25) && (moveY1 >= 10 && moveY1 <= 25))// Start Pressed
|
||||||
|
{
|
||||||
|
// Set Style
|
||||||
|
SetStyle(selectedStyle);
|
||||||
|
|
||||||
|
// Set Basic Score And Padle Position
|
||||||
|
moveY1 = 50;
|
||||||
|
moveY2 = 50;
|
||||||
|
|
||||||
|
bounceX = bounceY = 40 + (int)(Math.random() * ((60 - 40) + 1));
|
||||||
|
bounceY = bounceY = 0 + (int)(Math.random() * ((100 - 0) + 1));
|
||||||
|
|
||||||
|
speedX = 1;
|
||||||
|
speedY = 1.1f;
|
||||||
|
|
||||||
|
Player1Life = 3;
|
||||||
|
Player2Life = 3;
|
||||||
|
|
||||||
|
gamePlaying = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.postInvalidate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SetStyle(int i)
|
||||||
|
{
|
||||||
|
// Set Style
|
||||||
|
switch (i)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
Color_PedleLeft = Color.WHITE;
|
||||||
|
Color_PedleRight = Color.WHITE;
|
||||||
|
Color_Ball = Color.RED;
|
||||||
|
Color_ScoreBar = Color.GRAY;
|
||||||
|
Color_Footer = Color.GRAY;
|
||||||
|
Color_Background = Color.BLACK;
|
||||||
|
Color_Score = Color.WHITE;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
Color_PedleLeft = Color.MAGENTA;
|
||||||
|
Color_PedleRight = Color.MAGENTA;
|
||||||
|
Color_Ball = Color.BLUE;
|
||||||
|
Color_ScoreBar = Color.YELLOW;
|
||||||
|
Color_Footer = Color.YELLOW;
|
||||||
|
Color_Background = Color.CYAN;
|
||||||
|
Color_Score = Color.RED;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
Color_PedleLeft = Color.RED;
|
||||||
|
Color_PedleRight = Color.RED;
|
||||||
|
Color_Ball = Color.RED;
|
||||||
|
Color_ScoreBar = Color.RED;
|
||||||
|
Color_Footer = Color.RED;
|
||||||
|
Color_Background = Color.LTGRAY;
|
||||||
|
Color_Score = Color.BLACK;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
super.setBackgroundColor(Color_Background);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void Bal()
|
||||||
|
{
|
||||||
|
if (bounceXdirection)
|
||||||
|
if (bounceX >= 96 & bounceY >= (moveY1 - (rectangleHeight1/2)) & bounceY <= (moveY1 + (rectangleHeight1/2)))
|
||||||
|
{
|
||||||
|
bounceXdirection = !bounceXdirection;
|
||||||
|
score++;
|
||||||
|
|
||||||
|
// check angle;
|
||||||
|
//change speed y;
|
||||||
|
speedY = map( (bounceY - moveY1), -(rectangleHeight2/2), (rectangleHeight2/2), -2f, 2f);
|
||||||
|
if (speedY <= 0)
|
||||||
|
{
|
||||||
|
bounceYdirection = false;
|
||||||
|
speedY = Math.abs(speedY);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
bounceYdirection = true;
|
||||||
|
speedX = 3f - speedY;
|
||||||
|
soundPool.play(Sound_Pling, .5f, .5f, 0, 0, 1);
|
||||||
|
}
|
||||||
|
else if (bounceX <= 96)
|
||||||
|
bounceX += speedX;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//dead
|
||||||
|
Player2Life--;
|
||||||
|
|
||||||
|
gameover = true;
|
||||||
|
}
|
||||||
|
else if (!bounceXdirection)
|
||||||
|
if (bounceX <= 4 & bounceY >= (moveY2 - (rectangleHeight2/2)) & bounceY <= (moveY2 + (rectangleHeight2/2)))
|
||||||
|
{
|
||||||
|
bounceXdirection = !bounceXdirection;
|
||||||
|
score++;
|
||||||
|
// check angle;
|
||||||
|
//change speed y;
|
||||||
|
speedY = map( (bounceY - moveY2), -(rectangleHeight2/2), (rectangleHeight2/2), -2f, 2f);
|
||||||
|
if (speedY <= 0)
|
||||||
|
{
|
||||||
|
bounceYdirection = false;
|
||||||
|
speedY = Math.abs(speedY);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
bounceYdirection = true;
|
||||||
|
speedX = 3f - speedY;
|
||||||
|
soundPool.play(Sound_Pling, .5f, .5f, 0, 0, 1);
|
||||||
|
}
|
||||||
|
else if (bounceX >= 4)
|
||||||
|
bounceX -= speedX;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//dead
|
||||||
|
Player1Life--;
|
||||||
|
|
||||||
|
gameover = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Y movement
|
||||||
|
if (bounceYdirection)
|
||||||
|
if (bounceY < boundaryBottom - 1.5f)
|
||||||
|
bounceY += speedY;
|
||||||
|
else
|
||||||
|
bounceYdirection = !bounceYdirection;
|
||||||
|
else if (!bounceYdirection)
|
||||||
|
{
|
||||||
|
if (bounceY > boundaryTop + 1.5f)
|
||||||
|
bounceY -= speedY;
|
||||||
|
else
|
||||||
|
bounceYdirection = !bounceYdirection;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Bot()
|
||||||
|
{
|
||||||
|
// Bot - hard
|
||||||
|
|
||||||
|
switch (BotDif)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
if (bounceX <= 40) // Left
|
||||||
|
if (bounceY > moveY2 + .1f + (int)(Math.random() * ((7 - .1f) + 1)))
|
||||||
|
moveY2 += 1f + (int)(Math.random() * ((5 - 1f) + 1));
|
||||||
|
else if (bounceY < moveY2 - .1f + (int)(Math.random() * ((7 - .1f) + 1)))
|
||||||
|
moveY2 -= 1f + (int)(Math.random() * ((5 - 1f) + 1));
|
||||||
|
|
||||||
|
if (bounceX >= 60) // Right
|
||||||
|
if (bounceY > moveY1 + .1f + (int)(Math.random() * ((7 - .1f) + 1)))
|
||||||
|
moveY1 += 1f + (int)(Math.random() * ((5 - 1f) + 1));
|
||||||
|
else if (bounceY < moveY1 - .1f + (int)(Math.random() * ((7 - .1f) + 1)))
|
||||||
|
moveY1 -= 1f + (int)(Math.random() * ((5 - 1f) + 1));
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
// Bot - normal
|
||||||
|
case 1:
|
||||||
|
if (bounceX <= 40) // Left
|
||||||
|
if (bounceY > moveY2 + .1f + (int)(Math.random() * ((10 - .1f) + 1)))
|
||||||
|
moveY2 += 1f + (int)(Math.random() * ((3 - 1f) + 1));
|
||||||
|
else if (bounceY < moveY2 - .1f + (int)(Math.random() * ((10 - .1f) + 1)))
|
||||||
|
moveY2 -= 1f + (int)(Math.random() * ((3 - 1f) + 1));
|
||||||
|
|
||||||
|
if (bounceX >= 60) // Right
|
||||||
|
if (bounceY > moveY1 + .1f + (int)(Math.random() * ((10 - .1f) + 1)))
|
||||||
|
moveY1 += 1f + (int)(Math.random() * ((3 - 1f) + 1));
|
||||||
|
else if (bounceY < moveY1 - .1f + (int)(Math.random() * ((10 - .1f) + 1)))
|
||||||
|
moveY1 -= 1f + (int)(Math.random() * ((3 - 1f) + 1));
|
||||||
|
break;
|
||||||
|
// Bot - easy
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
if (bounceX <= 40) // Left
|
||||||
|
if (bounceY > moveY2 + .1f + (int)(Math.random() * ((10 - .1f) + 1)))
|
||||||
|
moveY2 += .1f + (int)(Math.random() * ((3 - .1f) + 1));
|
||||||
|
else if (bounceY < moveY2 - .1f + (int)(Math.random() * ((10 - .1f) + 1)))
|
||||||
|
moveY2 -= .1f + (int)(Math.random() * ((3 - .1f) + 1));
|
||||||
|
|
||||||
|
if (bounceX >= 60) // Right
|
||||||
|
if (bounceY > moveY1 + .1f + (int)(Math.random() * ((10 - .1f) + 1)))
|
||||||
|
moveY1 += .1f + (int)(Math.random() * ((3 - .1f) + 1));
|
||||||
|
else if (bounceY < moveY1 - .1f + (int)(Math.random() * ((10 - .1f) + 1)))
|
||||||
|
moveY1 -= .1f + (int)(Math.random() * ((3 - .1f) + 1));
|
||||||
|
break;
|
||||||
|
|
||||||
|
// Bot - novice
|
||||||
|
|
||||||
|
case 3:
|
||||||
|
if (bounceX <= 40) // Left
|
||||||
|
if (bounceY > moveY2 + .1f + (int)(Math.random() * ((10 - .1f) + 1)))
|
||||||
|
moveY2++;
|
||||||
|
else if (bounceY < moveY2 - .1f + (int)(Math.random() * ((10 - .1f) + 1)))
|
||||||
|
moveY2--;
|
||||||
|
|
||||||
|
if (bounceX >= 60) // Right
|
||||||
|
if (bounceY > moveY1 + .1f + (int)(Math.random() * ((10 - .1f) + 1)))
|
||||||
|
moveY1++;
|
||||||
|
else if (bounceY < moveY1 - .1f + (int)(Math.random() * ((10 - .1f) + 1)))
|
||||||
|
moveY1--;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void DrawFps(Canvas canvas, long newTime)
|
||||||
|
{
|
||||||
|
Paint paint = new Paint();
|
||||||
|
paint.setColor(Color_Score);
|
||||||
|
paint.setTextSize(30);
|
||||||
|
String text = "FPS: " + (1000/(newTime-oldTime));
|
||||||
|
canvas.drawText(text, GetRealPixelSize(dpWidth, 5), GetRealPixelSize(dpHeight, 5), paint);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void DrawText(Canvas canvas, String text, int x)
|
||||||
|
{
|
||||||
|
Paint paint = new Paint();
|
||||||
|
paint.setColor(Color_Score);
|
||||||
|
paint.setTextSize(30);
|
||||||
|
canvas.drawText(text, GetRealPixelSize(dpWidth, x), GetRealPixelSize(dpHeight, 5), paint);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void DrawText(Canvas canvas, String text, int x, int y, int size)
|
||||||
|
{
|
||||||
|
Paint paint = new Paint();
|
||||||
|
paint.setColor(Color_Score);
|
||||||
|
paint.setTextSize(size);
|
||||||
|
canvas.drawText(text, GetRealPixelSize(dpWidth, x), GetRealPixelSize(dpHeight, y), paint);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void DrawGameOver(Canvas canvas)
|
||||||
|
{
|
||||||
|
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
|
||||||
|
R.drawable.gameover);
|
||||||
|
bitmap = Bitmap.createScaledBitmap(bitmap, (int)GetRealPixelSize(dpWidth, 40), (int)GetRealPixelSize(dpHeight, 20), false);
|
||||||
|
canvas.drawBitmap(bitmap, (int)GetRealPixelSize(dpWidth, 30), (int)GetRealPixelSize(dpHeight, 40), null);
|
||||||
|
|
||||||
|
// Which Player Won? Player1Life
|
||||||
|
if (Player1Life < 0)
|
||||||
|
{
|
||||||
|
bitmap = BitmapFactory.decodeResource(getResources(),
|
||||||
|
R.drawable.player2);
|
||||||
|
bitmap = Bitmap.createScaledBitmap(bitmap, (int)GetRealPixelSize(dpWidth, 40), (int)GetRealPixelSize(dpHeight, 20), false);
|
||||||
|
canvas.drawBitmap(bitmap, (int)GetRealPixelSize(dpWidth, 30), (int)GetRealPixelSize(dpHeight, 55), null);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
bitmap = BitmapFactory.decodeResource(getResources(),
|
||||||
|
R.drawable.player1);
|
||||||
|
bitmap = Bitmap.createScaledBitmap(bitmap, (int)GetRealPixelSize(dpWidth, 40), (int)GetRealPixelSize(dpHeight, 20), false);
|
||||||
|
canvas.drawBitmap(bitmap, (int)GetRealPixelSize(dpWidth, 30), (int)GetRealPixelSize(dpHeight, 55), null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
float map(float x, float in_min, float in_max, float out_min, float out_max)
|
||||||
|
{
|
||||||
|
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ScoreBar(Canvas canvas, float Bottom)
|
||||||
|
{
|
||||||
|
Paint paint = new Paint();
|
||||||
|
paint.setAntiAlias(true);
|
||||||
|
paint.setColor(Color_ScoreBar);
|
||||||
|
paint.setStyle(Style.FILL);
|
||||||
|
|
||||||
|
// Style Square
|
||||||
|
canvas.drawRect(
|
||||||
|
GetRealPixelSize(dpWidth, 0),
|
||||||
|
GetRealPixelSize(dpHeight, 0),
|
||||||
|
GetRealPixelSize(dpWidth, 100),
|
||||||
|
GetRealPixelSize(dpHeight, Bottom), paint);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Footer(Canvas canvas, float Top)
|
||||||
|
{
|
||||||
|
Paint paint = new Paint();
|
||||||
|
paint.setAntiAlias(true);
|
||||||
|
paint.setColor(Color_Footer);
|
||||||
|
paint.setStyle(Style.FILL);
|
||||||
|
|
||||||
|
// Style Square
|
||||||
|
canvas.drawRect(
|
||||||
|
GetRealPixelSize(dpWidth, 0),
|
||||||
|
GetRealPixelSize(dpHeight, Top),
|
||||||
|
GetRealPixelSize(dpWidth, 100),
|
||||||
|
GetRealPixelSize(dpHeight, 100), paint);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void drawPeddleRight(Canvas canvas) {
|
||||||
|
Paint paint = new Paint();
|
||||||
|
paint.setAntiAlias(true);
|
||||||
|
paint.setColor(Color_PedleRight);
|
||||||
|
paint.setStyle(Style.FILL);
|
||||||
|
|
||||||
|
float rectangleWidth = 2;
|
||||||
|
rectangleHeight1 = 20;
|
||||||
|
|
||||||
|
moveY1 = moveY1 <= (boundaryBottom - (rectangleHeight1 / 2)) ? moveY1 : (boundaryBottom - (rectangleHeight1 / 2));
|
||||||
|
moveY1 = moveY1 >= (rectangleHeight1 / 2) + boundaryTop ? moveY1 : (rectangleHeight1 / 2) + boundaryTop;
|
||||||
|
|
||||||
|
float xPosition = 97;
|
||||||
|
float yPosition = moveY1;
|
||||||
|
|
||||||
|
// Style Square/Round
|
||||||
|
if (!StyleRound)
|
||||||
|
canvas.drawRect(
|
||||||
|
GetRealPixelSize(dpWidth, xPosition),
|
||||||
|
GetRealPixelSize(dpHeight, yPosition - (rectangleHeight1 / 2)),
|
||||||
|
GetRealPixelSize(dpWidth, xPosition + (rectangleWidth)),
|
||||||
|
GetRealPixelSize(dpHeight, yPosition + (rectangleHeight1 / 2)), paint);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
RectF rect=new RectF(
|
||||||
|
GetRealPixelSize(dpWidth, xPosition),
|
||||||
|
GetRealPixelSize(dpHeight, yPosition - (rectangleHeight1 / 2)),
|
||||||
|
GetRealPixelSize(dpWidth, xPosition + (rectangleWidth)),
|
||||||
|
GetRealPixelSize(dpHeight, yPosition + (rectangleHeight1 / 2)));
|
||||||
|
|
||||||
|
canvas.drawRoundRect(rect, 20,20, paint);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Rect(Canvas canvas, float Top, float Bottom, float Left, float Right, int Color)
|
||||||
|
{
|
||||||
|
Paint paint = new Paint();
|
||||||
|
paint.setAntiAlias(true);
|
||||||
|
paint.setColor(Color);
|
||||||
|
paint.setStyle(Style.FILL);
|
||||||
|
|
||||||
|
// Style Square
|
||||||
|
canvas.drawRect(
|
||||||
|
GetRealPixelSize(dpWidth, Left),
|
||||||
|
GetRealPixelSize(dpHeight, Top),
|
||||||
|
GetRealPixelSize(dpWidth, Right),
|
||||||
|
GetRealPixelSize(dpHeight, Bottom), paint);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void drawPeddleLeft(Canvas canvas) {
|
||||||
|
Paint paint = new Paint();
|
||||||
|
paint.setAntiAlias(true);
|
||||||
|
paint.setColor(Color_PedleLeft);
|
||||||
|
paint.setStyle(Style.FILL);
|
||||||
|
|
||||||
|
float rectangleWidth = 2;
|
||||||
|
rectangleHeight2 = 20;
|
||||||
|
|
||||||
|
moveY2 = moveY2 <= (boundaryBottom - (rectangleHeight2 / 2)) ? moveY2 : (boundaryBottom - (rectangleHeight2 / 2));
|
||||||
|
moveY2 = moveY2 >= (rectangleHeight2 / 2) + boundaryTop ? moveY2 : (rectangleHeight2 / 2) + boundaryTop;
|
||||||
|
|
||||||
|
float xPosition = 3;
|
||||||
|
float yPosition = moveY2;
|
||||||
|
|
||||||
|
// Style Square/Round
|
||||||
|
if (!StyleRound)
|
||||||
|
canvas.drawRect(
|
||||||
|
GetRealPixelSize(dpWidth, xPosition - (rectangleWidth)),
|
||||||
|
GetRealPixelSize(dpHeight, yPosition - (rectangleHeight2 / 2)),
|
||||||
|
GetRealPixelSize(dpWidth, xPosition),
|
||||||
|
GetRealPixelSize(dpHeight, yPosition + (rectangleHeight2 / 2)), paint);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
RectF rect=new RectF(
|
||||||
|
GetRealPixelSize(dpWidth, xPosition - (rectangleWidth)),
|
||||||
|
GetRealPixelSize(dpHeight, yPosition - (rectangleHeight2 / 2)),
|
||||||
|
GetRealPixelSize(dpWidth, xPosition),
|
||||||
|
GetRealPixelSize(dpHeight, yPosition + (rectangleHeight2 / 2)));
|
||||||
|
|
||||||
|
canvas.drawRoundRect(rect, 20,20, paint);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void drawCircle(Canvas canvas, float xPosition, float yPosition) {
|
||||||
|
Paint paint = new Paint();
|
||||||
|
paint.setAntiAlias(true);
|
||||||
|
paint.setColor(Color_Ball);
|
||||||
|
paint.setStyle(Style.FILL);
|
||||||
|
canvas.drawCircle(GetRealPixelSize(dpWidth, xPosition), GetRealPixelSize(dpHeight, yPosition), GetRealPixelSize(dpWidth, 1), paint);
|
||||||
|
}
|
||||||
|
|
||||||
|
private float GetRealPixelSize(float dpWH, float DIP)
|
||||||
|
{
|
||||||
|
return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, (dpWH * ( DIP / 100 )), r.getDisplayMetrics());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendMove(float x, float y)
|
||||||
|
{
|
||||||
|
if (!gamePlaying)
|
||||||
|
{
|
||||||
|
moveX1 = (x / Width) * 100;
|
||||||
|
moveY1 = (y / Height) * 100;
|
||||||
|
}
|
||||||
|
else if (x / Width >= 0.6f)
|
||||||
|
{
|
||||||
|
moveX1 = (x / Width) * 100;
|
||||||
|
moveY1 = (y / Height) * 100;
|
||||||
|
}
|
||||||
|
else if (x / Width <= 0.4f)
|
||||||
|
{
|
||||||
|
moveX2 = (x / Width) * 100;
|
||||||
|
moveY2 = (y / Height) * 100;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetGameState(boolean b)
|
||||||
|
{
|
||||||
|
gamePlaying = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,92 @@
|
|||||||
|
|
||||||
|
package mangavalk.canvasfirsttry;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.graphics.PointF;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.util.SparseArray;
|
||||||
|
import android.view.MotionEvent;
|
||||||
|
|
||||||
|
public class MainActivity extends Activity
|
||||||
|
{
|
||||||
|
CanvasView canvasClass;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
canvasClass = new CanvasView(this);
|
||||||
|
setContentView(canvasClass);
|
||||||
|
mActivePointers = new SparseArray<PointF>();
|
||||||
|
canvasClass.SetActivity(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
private SparseArray<PointF> mActivePointers;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onTouchEvent(MotionEvent e) {
|
||||||
|
// MotionEvent reports input details from the touch screen
|
||||||
|
// and other input controls. In this case, you are only
|
||||||
|
// interested in events where the touch position changed.
|
||||||
|
|
||||||
|
// get pointer index from the event object
|
||||||
|
int pointerIndex = e.getActionIndex();
|
||||||
|
|
||||||
|
// get pointer ID
|
||||||
|
int pointerId = e.getPointerId(pointerIndex);
|
||||||
|
|
||||||
|
// get masked (not specific to a pointer) action
|
||||||
|
int maskedAction = e.getActionMasked();
|
||||||
|
|
||||||
|
switch (maskedAction) {
|
||||||
|
|
||||||
|
case MotionEvent.ACTION_DOWN:
|
||||||
|
case MotionEvent.ACTION_POINTER_DOWN: {
|
||||||
|
// We have a new pointer. Lets add it to the list of pointers
|
||||||
|
|
||||||
|
PointF f = new PointF();
|
||||||
|
f.x = e.getX(pointerIndex);
|
||||||
|
f.y = e.getY(pointerIndex);
|
||||||
|
mActivePointers.put(pointerId, f);
|
||||||
|
|
||||||
|
for (int size = e.getPointerCount(), i = 0; i < size; i++) {
|
||||||
|
PointF point = mActivePointers.get(e.getPointerId(i));
|
||||||
|
if (point != null) {
|
||||||
|
point.x = e.getX(i);
|
||||||
|
point.y = e.getY(i);
|
||||||
|
canvasClass.sendMove(point.x, point.y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MotionEvent.ACTION_MOVE: { // a pointer was moved
|
||||||
|
for (int size = e.getPointerCount(), i = 0; i < size; i++) {
|
||||||
|
PointF point = mActivePointers.get(e.getPointerId(i));
|
||||||
|
if (point != null) {
|
||||||
|
point.x = e.getX(i);
|
||||||
|
point.y = e.getY(i);
|
||||||
|
canvasClass.sendMove(point.x, point.y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MotionEvent.ACTION_UP:
|
||||||
|
break;
|
||||||
|
case MotionEvent.ACTION_POINTER_UP:
|
||||||
|
break;
|
||||||
|
case MotionEvent.ACTION_CANCEL: {
|
||||||
|
// TODO use data
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onBackPressed()
|
||||||
|
{
|
||||||
|
canvasClass.SetGameState(false);
|
||||||
|
}
|
||||||
|
}
|
||||||