安卓游戏 收集钱袋(自制)
本人对游戏这一块很有兴趣,刚好 又兼着学安卓,所以就学着做了下安卓的 游戏
源码位置
链接: http://pan.baidu.com/s/1eQ4gdI6 密码: g58e
本文章是自己学习和记录用,喜欢的人可以阅读,写的不好的勿喷
开始,安卓基本的东西和环境的搭建就不细说了,先进行游戏的基本分析:
需要的元素:钱 钱袋 画板
小游戏,仅仅是机能的一些测试,所以没有做的很好,
个人喜欢做游戏的原因就是因为游戏和现实的世界非常的贴近,能够用现实的想法去思考游戏
比如本游戏:首先,钱肯定是默认的情况下就不停的运动的,然后钱袋,由玩家去控制,也能进行移动,当钱和钱袋接触,进行加分,并且钱消失,就是这么一段简单的想法
主Activity
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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 )); } } |
钱这个类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | 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; } } |
这里加入了一个摇杆系统,没特别作用,好看罢了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | 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; } } |
主要调用类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 | 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(); } } } |
基本代码已经给出,也没什么素材,代码本人亲测成功的,后期有打算完善的可能性,当然还是得需要一个美工得协助
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步