标签:
本人对游戏这一块很有兴趣,刚好 又兼着学安卓,所以就学着做了下安卓的 游戏
源码位置
链接: http://pan.baidu.com/s/1eQ4gdI6 密码: g58e
本文章是自己学习和记录用,喜欢的人可以阅读,写的不好的勿喷
开始,安卓基本的东西和环境的搭建就不细说了,先进行游戏的基本分析:
需要的元素:钱 钱袋 画板
小游戏,仅仅是机能的一些测试,所以没有做的很好,
个人喜欢做游戏的原因就是因为游戏和现实的世界非常的贴近,能够用现实的想法去思考游戏
比如本游戏:首先,钱肯定是默认的情况下就不停的运动的,然后钱袋,由玩家去控制,也能进行移动,当钱和钱袋接触,进行加分,并且钱消失,就是这么一段简单的想法
主Activity
package com.rp;
import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//设置全屏
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
requestWindowFeature(Window.FEATURE_NO_TITLE);
//显示自定义的SurfaceView视图
setContentView(new MySurfaceView(this));
}
}
钱这个类
package com.rp;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
public class Money {
//定义钱币
private Rect money;
public int moneyX=0,moneyY=0; //钱包的坐标
public int speed=2;//钱币的下落速度
public int height;
private boolean isdeath=false;
private int cnt;//分数
public Money(int moneyX,int speed,int height){
this.moneyX = moneyX;
this.speed = speed;
this.height = height;
this.cnt = speed;
}
public void DrawMoney(Canvas canvas,Paint paint){
money = new Rect(moneyX, moneyY, moneyX+10, moneyY+20);
canvas.drawRect(money, paint);
}
//钱的逻辑
/***
* 自由下落 当过界的时候重新运动
*/
public void logic(){
if(isdeath()){
moneyY =0;
}else{
moneyY +=speed;
}
}
/***
* 死亡函数
* 当钱过界,或者遇到钱袋即死亡
*/
public boolean isdeath(){
if(this.moneyY>=this.height){
isdeath = true;
}else{
isdeath = false;
}
return isdeath;
}
public int getCnt() {
return cnt;
}
public void setCnt(int cnt) {
this.cnt = cnt;
}
}
这里加入了一个摇杆系统,没特别作用,好看罢了
package com.rp;
import android.graphics.Canvas;
import android.graphics.Paint;
public class Yaogan {
//定义两个圆形的中心点坐标与半径
public float smallCenterX = 40, smallCenterY = 490, smallCenterR = 20;
public float BigCenterX = 40, BigCenterY = 490, BigCenterR = 40;
public void DrawYaogan(Canvas canvas,Paint paint){
//绘制大圆
canvas.drawCircle(BigCenterX, BigCenterY, BigCenterR, paint);
//绘制小圆
canvas.drawCircle(smallCenterX, smallCenterY, smallCenterR, paint);
}
/**
* 小圆针对于大圆做圆周运动时,设置小圆中心点的坐标位置
* @param centerX
* 围绕的圆形(大圆)中心点X坐标
* @param centerY
* 围绕的圆形(大圆)中心点Y坐标
* @param R
* 围绕的圆形(大圆)半径
* @param rad
* 旋转的弧度
*/
public void setSmallCircleXY(float centerX, float centerY, float R, double rad) {
//获取圆周运动的X坐标
smallCenterX = (float) (R * Math.cos(rad)) + centerX;
//获取圆周运动的Y坐标
smallCenterY = (float) (R * Math.sin(rad)) + centerY;
}
/**
* 得到两点之间的弧度
* @param px1 第一个点的X坐标
* @param py1 第一个点的Y坐标
* @param px2 第二个点的X坐标
* @param py2 第二个点的Y坐标
* @return
*/
public double getRad(float px1, float py1, float px2, float py2) {
//得到两点X的距离
float x = px2 - px1;
//得到两点Y的距离
float y = py1 - py2;
//算出斜边长
float Hypotenuse = (float) Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));
//得到这个角度的余弦值(通过三角函数中的定理 :邻边/斜边=角度余弦值)
float cosAngle = x / Hypotenuse;
//通过反余弦定理获取到其角度的弧度
float rad = (float) Math.acos(cosAngle);
//当触屏的位置Y坐标<摇杆的Y坐标我们要取反值-0~-180
if (py2 < py1) {
rad = -rad;
}
return rad;
}
}
主要调用类
package com.rp;
import java.util.ArrayList;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.Region;
import android.media.MediaPlayer;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
/**
*
* @author sunzhiyan
* @version 0.1
*
*/
public class MySurfaceView extends SurfaceView implements Callback, Runnable {
private SurfaceHolder sfh;
private Paint paint;
private Thread th;
private boolean flag;
private Canvas canvas;
private int screenW, screenH=532;
private int x=100,y=400;//手指触屏的坐标
private Yaogan yaogan;
//定义一个音乐播放器
private MediaPlayer mediaplay;
//**********************************************
private Rect rect;
private Money money;
private Region reg;
//定义一个主角
//定义一套钱币
private ArrayList<Money> arrayList = new ArrayList<Money>();;
private int mx=0,my=0;
private int count;
/**
* SurfaceView初始化函数
*/
public MySurfaceView(Context context) {
super(context);
sfh = this.getHolder();
sfh.addCallback(this);
paint = new Paint();
paint.setColor(Color.RED);
paint.setAntiAlias(true);
//调用游戏初始化
initGame(context);
setFocusable(true);
}
//初始化游戏函数
public void initGame(Context context){
//实例化一个遥杆
yaogan = new Yaogan();
//调用一个音乐文件
mediaplay = MediaPlayer.create(context, R.raw.bgmusic);
//设置循环播放
mediaplay.setLooping(true);
//音乐的再次接着播放
mediaplay.start();
//定义一套钱币
Money money01 = new Money((mx+0)*50,5,screenH);
Money money02 = new Money((mx+1)*50,15,screenH);
Money money03 = new Money((mx+2)*50,10,screenH);
Money money04 = new Money((mx+4)*50,5,screenH);
Money money05 = new Money((mx+5)*50,5,screenH);
Money money06 = new Money((mx+6)*50,5,screenH);
arrayList.add(money01);
arrayList.add(money02);
arrayList.add(money03);
arrayList.add(money04);
arrayList.add(money05);
arrayList.add(money06);
}
/**
* SurfaceView视图创建,响应此函数
*/
@Override
public void surfaceCreated(SurfaceHolder holder) {
flag = true;
//实例线程
th = new Thread(this);
//启动线程
th.start();
}
/**
* 游戏绘图
*/
public void myDraw() {
try {
canvas = sfh.lockCanvas();
if (canvas != null) {
canvas.drawColor(Color.WHITE);
//绘制背景
//Bitmap background = BitmapFactory.decodeResource(this.getResources(), R.drawable.background);
//canvas.drawBitmap(background,0,0, paint);
paint.setAlpha(0x77);
//绘制一个钱币
//取得鼠标的中心点 绘制主角
rect = new Rect(x-20, y-20, x+20, y+20);
reg = new Region(rect);
for (int i = 0; i < arrayList.size(); i++) {
//money.logic();
arrayList.get(i).DrawMoney(canvas, paint);
if(reg.contains(arrayList.get(i).moneyX, arrayList.get(i).moneyY)){
count = count+arrayList.get(i).getCnt();
//目标死亡
arrayList.get(i).moneyY = 0;
paint.setColor(Color.BLUE);
}
}
/* for (int i = 0; i < 7; i++) {
money = new Money();
money.DrawMoney(canvas, paint,(mx+i)*50,i+2);
arrayList.add(money);
} */
/* if(reg.contains(moneyX, moneyY)){
paint.setColor(Color.BLUE);
}else{
}*/
//判断碰撞
canvas.drawRect(rect, paint);
//遥感
yaogan.DrawYaogan(canvas,paint);
//不停的对坐标进行监控
canvas.drawText("x="+x+"y="+y, 100, 480, paint);
//
canvas.drawText("您的积分是"+count, 230, 500, paint);
}
} catch (Exception e) {
// TODO: handle exception
} finally {
if (canvas != null)
sfh.unlockCanvasAndPost(canvas);
}
}
/**
* 触屏事件监听
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
//当用户手指抬起,应该恢复小圆到初始位置
if (event.getAction() == MotionEvent.ACTION_UP) {
yaogan.smallCenterX = yaogan.BigCenterX;
yaogan.smallCenterY = yaogan.BigCenterY;
} else {
int pointX = (int) event.getX();
int pointY = (int) event.getY();
x = pointX;
y = pointY;
//判断用户点击的位置是否在大圆内
if (Math.sqrt(Math.pow((yaogan.BigCenterX - (int) event.getX()), 2) + Math.pow((yaogan.BigCenterY - (int) event.getY()), 2)) <= yaogan.BigCenterR) {
//让小圆跟随用户触点位置移动
yaogan.smallCenterX = pointX;
yaogan.smallCenterY = pointY;
} else {
yaogan.setSmallCircleXY(yaogan.BigCenterX, yaogan.BigCenterY,yaogan.BigCenterR, yaogan.getRad(yaogan.BigCenterX, yaogan.BigCenterY, pointX, pointY));
}
}
return true;
}
/**
* 按键事件监听
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
return super.onKeyDown(keyCode, event);
}
@Override
public void run() {
while (flag) {
long start = System.currentTimeMillis();
myDraw();
logic();
long end = System.currentTimeMillis();
try {
if (end - start < 50) {
Thread.sleep(50 - (end - start));
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/**
* SurfaceView视图状态发生改变,响应此函数
*/
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
/**
* SurfaceView视图消亡时,响应此函数
*/
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
flag = false;
}
/**
* 游戏逻辑
*/
private void logic() {
for (int i = 0; i < arrayList.size(); i++) {
//money.logic();
arrayList.get(i).logic();
}
}
}
基本代码已经给出,也没什么素材,代码本人亲测成功的,后期有打算完善的可能性,当然还是得需要一个美工得协助
标签:
原文地址:http://www.cnblogs.com/sunxun/p/4679252.html