安卓游戏 收集钱袋(自制)

本人对游戏这一块很有兴趣,刚好 又兼着学安卓,所以就学着做了下安卓的 游戏

源码位置

链接: 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();
        }  
    }
}

基本代码已经给出,也没什么素材,代码本人亲测成功的,后期有打算完善的可能性,当然还是得需要一个美工得协助

posted on   手撕高达的村长  阅读(391)  评论(0编辑  收藏  举报

导航

< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5
点击右上角即可分享
微信分享提示