带你开发个转盘抽奖小游戏【附源码】
1效果图
小时候有没有玩过老虎机抽奖游戏?今天一起来用代码编程实现个简单抽奖的小游戏!首先,先带大家看看实现的效果图是怎么样的:
2分析如何实现
看了上面的效果图,头脑里有没有立刻想到用什么知识点来自己做一个呢?如果有想到,说明你非常不错,可以对知识点举一反三了!
如果没有任何想法,可以继续看本文详细分析。
1、为什么会看到旋转的效果?
这个其实简单,就是对一张图片,外围包裹一层边框,然后让其先隐藏掉,这样每次轮转到这张图片的时候,就让外边框显示出来,其他的图片隐藏。
代码如下:
//定义一个方法,用来显示指定位置的图片框背景
//不管怎么变化,最终一定会调用该方法,并传入position参数,这个参数就是中奖结果
public void showBg(int position) {
//如果遍历到的ImageView的位置正好是position,就显示选中的背景图片,
//其他都不显示背景
valuse = position;
for (int i = 0; i < imgs.length; i++) {
if (i == position) {
imgs[i].setBackgroundResource(R.drawable.img_bg);
} else {
//其他的,背景都去掉
imgs[i].setBackgroundResource(0);
}
}
}
2、怎么让其旋转起来,实现游戏效果?
这个如果你可以想到Android中的Handler,想必要实现这个效果,那不是so easy的一件事。
具体代码如下:
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 100: {
//表示显示下一个图片的背景
//取出当前显示背景图片的位置
int current = msg.arg1;
//++
current++;
//再创建一个Message,设置其arg1
Message msgNew = Message.obtain();
//标识
msgNew.what = 100;
//参数
msgNew.arg1 = current;
//延时发送
handler.sendMessageDelayed(msgNew, current * 10);
//切换显示图片背景
showBg(current % imgs.length);
}
break;
case 200: {
//收到停止的消息
//移除msg.what=100的所有消息
handler.removeMessages(100);
//读取最终结果
Toast.makeText(MainActivity.this, "恭喜你,中了:" + valuse, Toast.LENGTH_LONG).show();
}
break;
}
}
};
3、如何让每次转到的位置都不一样?
这个就需要我们用一个随机数,来控制Handle的消息的随机发送时间长短。具体的代码如下:
public void start(View view) {
//查看消息队列
if (handler.hasMessages(100)) {
//表示消息队列中含有该消息,也就是说已经启动过
Toast.makeText(this, "游戏已经启动,请稍候~~~~", Toast.LENGTH_LONG).show();
return;
}
//让Handler玩起来
Message msg = handler.obtainMessage();
msg.what = 100;
msg.arg1 = 0;
msg.sendToTarget();
//生成一个随机数:5~10秒之间
Random rd = new Random();
int time = rd.nextInt(5) + 5;
//延时发送停止消失
Message msg_stop = Message.obtain();
msg_stop.what = 200;
handler.sendMessageDelayed(msg_stop, time * 1000);
}
想明白了以上三点,实现这个小游戏,应该不成问题了!
3本文源码
1. public class MainActivity extends AppCompatActivity {
2. //八个ImageView数组
3. ImageView[] imgs = new ImageView[8];
4. //id数组
5. int[] ids = {
6. R.id.iv1, R.id.iv2, R.id.iv3, R.id.iv4, R.id.iv5, R.id.iv6, R.id.iv7, R.id.iv8, };
15. @Override
16. protected void onCreate(Bundle savedInstanceState) {
17. super.onCreate(savedInstanceState);
18. setContentView(R.layout.activity_main);
19. //初始化ImageView
20. initImgs();
21. }
22. /**
23. * 找到所有的图片控件
24. */
25. private void initImgs() {
26. for (int i = 0; i < imgs.length; i++) {
27. imgs[i] = (ImageView) findViewById(ids[i]);
28. }
29. }
30. //记录最终中奖位置
31. int values = 0;
32. //定义一个方法,用来显示指定位置的图片框背景
33. public void showBg(int position) {
34. //如果遍历到的ImageView的位置正好是position,就显示选中的背景图片,
35. //其他都不显示背景
36. values = position;
37. for (int i = 0; i < imgs.length; i++) {
38. if (i == position) {
39. imgs[i].setBackgroundResource(R.drawable.img_bg);
40. } else {
41. //其他的,背景都去掉
42. imgs[i].setBackgroundResource(0);
43. }
44. }
45. }
46. Handler handler = new Handler() {
47. @Override
48. public void handleMessage(Message msg) {
49. super.handleMessage(msg);
50. switch (msg.what) {
51. case 100: {
52. //表示显示下一个图片的背景
53. //取出当前显示背景图片的位置
54. int current = msg.arg1;
55. //++
56. current++;
57. //再创建一个Message,设置其arg1
58. Message msgNew = Message.obtain();
59. //标识
60. msgNew.what = 100;
61. //参数
62. msgNew.arg1 = current;
63. //延时发送
64. handler.sendMessageDelayed(msgNew, current * 10);
65. //切换显示图片背景
66. showBg(current % imgs.length);
67. }
68. break;
69. case 200: {
70. //收到停止的消息
71. //移除msg.what=100的所有消息
72. handler.removeMessages(100);
73. //读取最终结果
74. Toast.makeText(MainActivity.this, "恭喜你中奖了" + values, Toast.LENGTH_SHORT).show();
75. }
76. break;
77. }
78. }
79. };
80. //点击开始,动起来
81. //重复点击,多次启动
82. /*
83. * 1.点击时,判断消息队列是否有what=100的消息时,如果有,说明已经启动
84. *
85. * 2.点击后,设置按钮不可用,当handler收到消息,重新设置可点击
86. *
87. * */
88. public void start(View view) {
89. if (handler.hasMessages(100)) {
90. //表示该队列含有该消息,说明已经启动
91. Toast.makeText(MainActivity.this, "游戏已经启动", Toast.LENGTH_SHORT).show();
92. return;
93. }
94. //让Handler玩起来
95. Message msg = Message.obtain();
96. msg.what = 100;
97. msg.arg1 = 0;
98. handler.sendMessage(msg);
99. //生成一个随机数:5~10秒之间
100. Random rd = new Random();
101. int time = rd.nextInt(5) + 5;
102. //延时发送停止消失
103. Message msg_stop = Message.obtain();
104. msg_stop.what = 200;
105. handler.sendMessageDelayed(msg_stop, time * 1000);
106. }
107. }
最后,提前祝大家元旦快乐!
赞 (0)