疯狂猜歌实现(10)—— 实现提示、删除按键之事件处理以及金币逻辑
来源:互联网 发布:手机淘宝改好评怎么改 编辑:程序博客网 时间:2024/05/18 01:32
这一节我们将上一节添加的两个按钮:删除一个干扰文字按钮,提示一个正确答案按钮添加上逻辑,并同时处理两个按钮对应的金币逻辑。
首先我们来看删除一个干扰文字按钮需要实现的逻辑,当用户点击此按钮时应该完成的动作分为以下几个部分,
1. 待选框中随机找出一个不是正确答案的按钮,并设置他不可见
2. 减去消耗金币的数量
需求确定后,我们来看第一个逻辑实现的代码,
//当前金币数量 private int mCurrentCoins; /** * 处理删除干扰选项事件 */ private void handleDeleteWordEvent() { ImageButton mButtonDelete = (ImageButton) findViewById(R.id.float_button_delete); mButtonDelete.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { int needCoins = getDeleteOneWordCoins(); if (consumeCoins(needCoins)) { //删除一个文字,1. 金币数量减少,2. 对应的WordButton消失 mTextCurrentCoins.setText(mCurrentCoins + ""); setWordButtonInVisible(); } else { //TODO: 金币不够减,弹出对话框 } } }); }可以看到此方法中,首先先初始化了删除错误答案的控件,在getDeleteOneWordCoins方法表示,获取删除一个错误所需要的金币数,代码如下,
private int getDeleteOneWordCoins(){ return getResources().getInteger(R.integer.delete_value); }方法consumeCoins表示消耗金币的操作,代码如下
/** * 减去金币 * @param coins 删除一个字需要金币 * @return */ private boolean consumeCoins(int coins) { mCurrentCoins = Integer.valueOf(mTextCurrentCoins.getText() + ""); //金币不够减 if(mCurrentCoins - coins < 0){ return false; }else{ //金币够减 mCurrentCoins -= coins; return true; } }方法setWordButtonInvisable表示将待选框中选中的button设置为不可见,代码如下
/** * 使一个WordButton消失 */ private void setWordButtonInVisible(){ //找出当前文字是否为答案,如果不是答案则将其WordButton隐藏,否则继续需要下一个 WordButton buf = getNoAnswerWordButton(); buf.mVisable = false; buf.mButton.setVisibility(View.INVISIBLE); }这里又有一个getNoAnswerWordButton的方法,表示获取一个不是答案的WordButton
/** * 获取一个非正确答案的WordButton * @return */ private WordButton getNoAnswerWordButton() { WordButton deleteButton ; char[] answer = mCurrentSong.getSongName().toCharArray(); while(true){ for(int i=0;i<mWordButtons.size();i++){ Random random = new Random(); int index = random.nextInt(OPTIONS_WORDS_SIZE); for(int j=0;j<answer.length;j++){ //选中的文字依次与歌曲名称比较且当前文字可见 if(!mCurrentSong.getSongName().contains(mWordButtons.get(index).mWordText) && mWordButtons.get(index).mVisable == true){ deleteButton = mWordButtons.get(index); return deleteButton; } } } } }实现的效果如下,我们可以看到右上角的金币数量在点击了去掉一个错误答案的按钮时,金币数量减少了(此处金币的初始值为2000),并且一个不是答案的随机文字消失。
在实现了删除错误答案的逻辑后,我们接着来实现提示一个正确答案的逻辑,首先来分析下需求,点击提示一个正确答案时需要,
1. 待选框答案文字按照顺序消失一个
2. 已选框中显示一个正确答案(按照当前已选框中的位置)
3. 金币数量减少
我们先来看看第一步的实现,
/** * 处理提示一个答案事件 */ private void handleTipWordEvent(){ ImageButton mButtonTip = (ImageButton) findViewById(R.id.float_button_tip); mButtonTip.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { int needCoins = getTipOneWordCoins(); mCurrentCoins = getCurrentCoins(); if(mCurrentCoins-needCoins>0){ //已选框中是否被占满 if(!checkSelectionWordsIsFull()){ //待选框中,答案对应的按钮消失 WordButton buf = findOneAnswerButton(); if(buf == null){ //后面的答案在前面的已选框中,清除已选框,重新提示一个答案 Toast.makeText(MainActivity.this,"一个答案已被选中",Toast.LENGTH_LONG).show(); return; } buf.mVisable = false; buf.mButton.setVisibility(View.INVISIBLE); //已选框中,答案对应按钮出现 for(int i=0;i<SELECTED_WORDS_SIZE;i++){ WordButton answerButton = mSelectButtons.get(i); if(answerButton.mVisable == false){ answerButton.mWordText = buf.mWordText; answerButton.mVisable = true; answerButton.mIndex = buf.mIndex; answerButton.mButton.setText(buf.mWordText); answerButton.mButton.setTextColor(Color.WHITE); break; } } //减去金币 consumeCoins(needCoins); mTextCurrentCoins.setText(mCurrentCoins + ""); } //已选框被占满,检查答案 handleTheAnswer(); }else{ //TODO: 金币不够减,显示提示对话框 } } }); }其中checkSelectionWordIsFull方法,用于检验当前选择框是否已经满了,满了则直接去检测当前选择框中的答案是否正确,否则填入一个正确答案
/** * 检查已选框是否被占满 * @return */ private boolean checkSelectionWordsIsFull() { for(int i=0;i<mSelectButtons.size();i++){ if(mSelectButtons.get(i).mVisable == false){ return false; } } return true; }另外一个方法是findOneWordButton,用于找出一个正确答案WordButton并返回,值得注意的是,这里的答案是按照歌曲名的先后进行返回的,比如“征服”,是按照“征”,“服”返回,而不是“服”,“征”。
/** * 从待选框里找出一个正确答案 * @return */ private WordButton findOneAnswerButton() { char[] answer = mCurrentSong.getSongName().toCharArray(); String answerWord = ""; for(int i=0;i<mSelectButtons.size();i++){ if(mSelectButtons.get(i).mWordText.length() == 0){ answerWord = String.valueOf(answer[i]); break; } } for(int j=0;j<OPTIONS_WORDS_SIZE;j++){ if(answerWord.equals(mWordButtons.get(j).mWordText) && mWordButtons.get(j).mVisable == true){ return mWordButtons.get(j); } } return null; }实现后,点击提示一个正确答案,可以正确的显示在相应位置,并检测当前是否通关的情况。
源码下载
0 0
- 疯狂猜歌实现(10)—— 实现提示、删除按键之事件处理以及金币逻辑
- 疯狂猜歌实现(5)—— 实现待选文字框动画以及点击事件
- 疯狂猜歌实现(8)—— 实现答案判断逻辑
- 疯狂猜歌实现(11)—— 过关、通关界面及相关逻辑实现
- 疯狂猜歌实现(12)——实现主界面的提示对话框
- 疯狂猜歌实现(2)—— 实现唱片布局以及播放动画
- Android面面观——Android事件处理下(按键、触摸屏和滚动球的一些实现细节)
- Android面面观——Android事件处理下(按键、触摸屏和滚动球的一些实现细节)
- 疯狂猜歌实现(6)—— 生成待选文字框随机文字以及动态生成已选框
- 疯狂猜歌实现(1)—— 实现顶部布局
- 疯狂猜歌实现(3)—— 实现播放相关动画
- Android面面观——Android事件处理下(按键、触摸屏和滚动球的一些实现细节
- Android事件处理(按键、触摸屏和滚动球的一些实现细节)
- 超级玛丽之吃金币UI实现
- MiniGUI 体系结构之三——逻辑字体以及多字体和多字符集实现
- Cocos2dx事件处理机制之按键事件
- 自定义Dialog,实现按键事件
- div实现绑定按键事件
- WebRTC VideoEngine超详细教程(一)——视频通话的基本流程
- 初识Git
- 明明添加引用了,但还是提示:未能找到类型或命名空间名称xxx,这是怎么回事?
- 【Android】图片操作之 —— Bitmap,byte[],Drawable,InputStream相互转化工具类
- Linux电源管理(6)_Generic PM之Suspend功能
- 疯狂猜歌实现(10)—— 实现提示、删除按键之事件处理以及金币逻辑
- POJ 3276 Face The Right Way 反转问题 常用技巧
- socket编程[1]
- Java中-----HTML(网页)的设计
- 单例模式
- 详解4字节对齐
- bindAppWidgetIdIfAllowed 老是返回false的原因
- linux下NFS共享与开机自动挂在硬盘
- SqlBulkCopy批量插入数据