滑动不进行数据交互

来源:2-3 缺口方块与点击方块的数据交换

慕粉4140763

2016-10-21 15:48

我最后demo的时候,点击空方块旁边有图案的方块时,有图案的方块进行了滑动的动画,但是却没有和空方块进行交换,而是直接消失了,这就造成了我点击的有图的方块也变成空的,而之前空方块依旧是空方块。。是真的消失了,如果我把一列按顺序点下来,这一列就都消失了,后一列就自动补充到这一列来,请问这是什么原因造成的?我的代码和老师写的应该是一样的,检查了好几遍,都没有发现哪里错误。ps.我用的是AndroidStudio,不知道和这有没有关系。

写回答 关注

5回答

  • 阿旭_
    2016-10-25 09:08:53
    已采纳

    找到原因了,少了一句话。所以动画结束后要交换图片的时候,打印发现绑定的bm都是空的因此设置显示的图片也都是空白的。

    this.bm = bm;

    http://img.mukewang.com/580eb06a0001779c06770531.jpg

    慕粉4140...

    老师,我修改过后发现游戏结束时,我的Toast也没有弹出来,麻烦您再帮我看一下是哪里的问题,谢谢。

    2016-10-25 09:28:05

    共 2 条回复 >

  • 阿旭_
    2016-10-25 10:19:51

    是判断结束的方法,默认应该是true,逻辑是默认认为就是游戏结束了,当遍历所有方块发现有一个位置不对的时候都再改为false(这种方法叫开关变量方法,比如求一个数是不是素数就用了这种方法)

    boolean isGameOver = true;

    http://img.mukewang.com/580ec14200014b7406250350.jpg

    慕粉4140...

    噢,明白啦,谢谢老师!

    2016-10-25 10:37:34

    共 1 条回复 >

  • 阿旭_
    2016-10-21 18:01:14

    和AndroidStudio没关系,把整个Activity代码贴上来,我帮你找原因

    慕粉4140...

    老师,我贴好了,麻烦您看一下

    2016-10-24 09:54:35

    共 1 条回复 >

  • 慕粉4140763
    2016-10-24 09:54:09


           /**利用动画结束之后,交换两个方块的数据
            * @param mImageView
            *                    点击的方块
            * @param isAnim
            *                true:有动画,false:无动画
            */
       public void changeDataByImageView(final ImageView mImageView,boolean isAnim){
           if (!isAnim){
               GameData mGameData = (GameData) mImageView.getTag();
               iv_null_ImageView.setImageBitmap(mGameData.bm);
               GameData mNullGameData = (GameData) iv_null_ImageView.getTag();
               mNullGameData.bm = mGameData.bm;
               mNullGameData.p_x = mGameData.p_x;
               mNullGameData.p_y = mGameData.p_y;
               setNullImageView(mImageView);//设置当前点击的方块变为空方块
               if (isGameStart){
                   isGameOver();//成功时,会弹出一个Toast
               }
               return;
           }
           //创建一个动画,设置的方向,以及移动的距离
           TranslateAnimation translateAnimation = null;
           if(mImageView.getX() > iv_null_ImageView.getX()){//当前点击的方块在空方块的下边
               //往上移动
               translateAnimation = new TranslateAnimation(0.1f,-mImageView.getWidth(),0.1f,0.1f);
           }else if (mImageView.getX() < iv_null_ImageView.getX()){
               //往下移动
               translateAnimation = new TranslateAnimation(0.1f,mImageView.getWidth(),0.1f,0.1f);
           }else if (mImageView.getY() > iv_null_ImageView.getY()){
               //往左移动
               translateAnimation = new TranslateAnimation(0.1f,0.1f,0.1f,-mImageView.getWidth());
           }else if (mImageView.getY() < iv_null_ImageView.getY()){
               //往右移动
               translateAnimation = new TranslateAnimation(0.1f,0.1f,0.1f,mImageView.getWidth());
           }

           //设置动画的时长
           translateAnimation.setDuration(70);
           //设置动画结束之后是否停留
           translateAnimation.setFillAfter(true);
           //设置动画结束之后,要真正的把数据交换了
           translateAnimation.setAnimationListener(new Animation.AnimationListener() {
               @Override
               public void onAnimationStart(Animation animation) {
               }
               @Override
               public void onAnimationRepeat(Animation animation) {
               }
               @Override
               public void onAnimationEnd(Animation animation) {
                   mImageView.clearAnimation();
                   GameData mGameData = (GameData) mImageView.getTag();
                   iv_null_ImageView.setImageBitmap(mGameData.bm);
                   GameData mNullGameData = (GameData) iv_null_ImageView.getTag();
                   mNullGameData.bm = mGameData.bm;
                   mNullGameData.p_x = mGameData.p_x;
                   mNullGameData.p_y = mGameData.p_y;
                   setNullImageView(mImageView);//设置当前点击的方块变为空方块
                   if (isGameStart){
                       isGameOver();//成功时,会弹出一个Toast
                   }
               }
           });
           //执行动画
           mImageView.startAnimation(translateAnimation);
       }

       /** 设置某个方块为空方块
        *
        * @param mImageView  当前要设置为空的方块的实例
        */
       public void setNullImageView(ImageView mImageView){
           mImageView.setImageBitmap(null);
           iv_null_ImageView = mImageView;
       }
       /*  判断当前点击的方块,是否与空方块的位置关系是相邻关系
        *  @param  mImageView 所点击的方块
        *  @return  true:相邻,false:不相邻
        */
       public boolean isHasByNullImageView(ImageView mImageView){
          //分别获取当前空方块的位置与点击空方块的位置,通过x y两边都差1的
           GameData mNullGameData = (GameData) iv_null_ImageView.getTag();
           GameData mGameData = (GameData) mImageView.getTag();
           if(mNullGameData.y==mGameData.y&&mGameData.x+1==mNullGameData.x){//当前点击的方块在空方块的上边
               return true;
           }else if (mNullGameData.y==mGameData.y&&mGameData.x-1==mNullGameData.x){//当前点击的方块在空方块的下边
               return true;
           }else if (mNullGameData.y==mGameData.y+1&&mGameData.x==mNullGameData.x){//当前点击的方块在空方块的左边
               return true;
           }else if (mNullGameData.y==mGameData.y-1&&mGameData.x==mNullGameData.x){//当前点击的方块在空方块的右边
               return true;
           }
           return false;
       }
       /*每个游戏小方块上要绑定的数据*/
       class GameData{
           /*每个游戏小方块的实际位置x*/
           public int x = 0;
           /*每个游戏小方块的实际位置y*/
           public int y =0;
           /*每个游戏小方块的图片*/
           public Bitmap bm;
           /*每个游戏小方块的图片的位置x*/
           public int p_x = 0;
           /*每个游戏小方块的图片的位置i*/
           public int p_y = 0;
           public GameData(int x,int y,Bitmap bm) {
               super();
               this.x = x;
               this.y = y;
               this.p_x = x;
               this.p_y = y;
           }
           /*每个小方块的位置,是否是正确的*/
           public boolean isTrue() {
               if (x == p_x && y == p_y){
                   return true;
               }
               return false;
           }
       }
    }

  • 慕粉4140763
    2016-10-24 09:53:49

    package imooc.a01_pintu;

    public class MainActivity extends AppCompatActivity {
    //    判断游戏是否开始
       private boolean isGameStart = false;

    //    利用二维数组创建若干个游戏小方块
       private ImageView[][] iv_game_arr = new ImageView[3][5];
    //    游戏主界面
       private GridLayout gl_main_game;
    //    当前空方块的实例的保存
       private ImageView iv_null_ImageView;
       /*当前手势*/
       private GestureDetector mDetector;

       @Override
       public boolean onTouchEvent(MotionEvent event) {
           mDetector.onTouchEvent(event);
           return mDetector.onTouchEvent(event);
       }


       @Override
       protected void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           mDetector = new GestureDetector(this, new GestureDetector.OnGestureListener() {
               @Override
               public boolean onDown(MotionEvent e) {
                   return false;
               }
               @Override
               public void onShowPress(MotionEvent e) {
               }
               @Override
               public boolean onSingleTapUp(MotionEvent e) {
                   return false;
               }
               @Override
               public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
                   return false;
               }
               @Override
               public void onLongPress(MotionEvent e) {
               }

               @Override
               public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
                   int type = getDirByGes(e1.getX(),e1.getY(),e2.getX(),e2.getY());
    //                Toast.makeText(MainActivity.this,""+type,Toast.LENGTH_SHORT).show();
                   changeByDir(type);
                   return false;
               }
           });
           setContentView(R.layout.activity_main);
    //        初始化游戏的若干个小方块
            Bitmap bigBm = ((BitmapDrawable)getResources().getDrawable(R.drawable.kb)).getBitmap();//获取一张大图
           int tuWandH = bigBm.getWidth() / 5;//每个游戏小方块的宽和高
           for (int i = 0; i <iv_game_arr.length ; i++) {
               for (int j = 0; j < iv_game_arr[0].length ; j++){
                   Bitmap bm = Bitmap.createBitmap(bigBm, j * tuWandH, i * tuWandH, tuWandH, tuWandH);  //根据行和列来切成若干个游戏小图片

                   iv_game_arr[i][j] = new ImageView(this);
                   iv_game_arr[i][j].setImageBitmap(bm);//设置每一个小方块的图案
                   iv_game_arr[i][j].setPadding(2, 2, 2, 2);//设置方块之间的间距
                   iv_game_arr[i][j].setTag(new GameData(i,j,bm));//绑定自定义的数据
                   iv_game_arr[i][j].setOnClickListener(new View.OnClickListener() {
                       @Override
                       public void onClick(View v) {
                           boolean flag = isHasByNullImageView((ImageView) v );
    //                        Toast.makeText(MainActivity.this,"位置关系是否存在:" + flag,Toast.LENGTH_SHORT).show();
                           if (flag){
                               changeDataByImageView((ImageView) v );
                           }
                       }
                   });
               }
           }

    //        初始化游戏主界面,并添加若干个小方块
           gl_main_game = (GridLayout) findViewById(R.id.gl_main_game);
           for (int i = 0; i < iv_game_arr.length ; i++) {
               for (int j = 0 ; j < iv_game_arr[0].length ; j++){
                   gl_main_game.addView(iv_game_arr[i][j]);
               }
           }
    //            设置最后一个方块是空的
               setNullImageView(iv_game_arr[2][4]);
          //初始化随机打乱顺序方块

           randowMove();
           isGameStart = true;
       }

       /**根据手势的方向,获取空方块响应的相邻位置如果存在方块,那么进行数据交换
        * type  1:上    2:下    3:左   4:右
        */
       public void changeByDir(int type){
           changeByDir(type,true);
       }


       /**根据手势的方向,获取空方块响应的相邻位置如果存在方块,那么进行数据交换
        * @param  type  1:上    2:下    3:左   4:右
        * @param  isAnim  true:有动画,false:没有动画
        */
       public void changeByDir(int type,boolean isAnim){
           //获取当前空方块的位置
           GameData mNullGameData = (GameData) iv_null_ImageView.getTag();
           //根据方向,设置响应的相邻的位置的坐标
           int new_x = mNullGameData.x;
           int new_y = mNullGameData.y;
           if (type == 1){//要移动的方块在当前空方块的下边
               new_x++;
           }else if (type == 2){//要移动的方块在当前空方块的上边
               new_x--;
           }else if (type == 3){//要移动的方块在当前空方块的左边
               new_y++;
           }else if (type == 4){//要移动的方块在当前空方块的右边
               new_y--;
           }
           //判断这个新坐标,是否存在
           if (new_x >=0 && new_x < iv_game_arr.length&&new_y >= 0&&new_y < iv_game_arr[0].length){
               //存在的话,开始移动。
               if (isAnim){
                   changeDataByImageView(iv_game_arr[new_x][new_y]);
               }else{
                   changeDataByImageView(iv_game_arr[new_x][new_y],isAnim);

               }
           }else{
               //什么也不做
           }
       }
       //判断游戏结束的方法
       public void isGameOver(){
           boolean isGameOver = false;
           //要遍历每个游戏小方块
           for (int i = 0; i < iv_game_arr.length; i++) {
               for (int j = 0; j < iv_game_arr[0].length; j ++){
                   //为空的方块数据不判断跳过
                   if(iv_game_arr[i][j]==iv_null_ImageView){
                       continue;
                   }
                   GameData mGameData = (GameData) iv_game_arr[i][j].getTag();
                   if(!mGameData.isTrue()){
                       isGameOver = false;
                       break;
                   }
               }

           }

           //根据一个开关变量决定游戏是否结束,结束时给提示
           if (isGameOver){
               Toast.makeText(this,"游戏结束",Toast.LENGTH_SHORT).show();
           }
       }

       /**手势判断,是向左滑,还是向右滑
        * @param start_x  手势的起始点x
        * @param start_y  手势的起始点y
        * @param end_x    手势的中止点x
        * @param end_y    手势的中止点y
        * @return   1:上    2:下    3:左   4:右
        */
       public int getDirByGes(float start_x,float start_y,float end_x,float end_y) {
           boolean isLeftOrRight = (Math.abs(start_x-end_x)>Math.abs(start_y-end_y)) ? true:false;//是否是左右
           if(isLeftOrRight){//左右
               boolean isLeft = start_x - end_x>0?true:false;
               if (isLeft){
                   return 3;
               }else {
                   return 4;
               }

           }else{//上下
               boolean isUp = start_y - end_y>0?true:false;
               if (isUp){
                   return 1;
               }else {
                   return 2;
               }
           }
       }
       //随机打乱顺序
       public void randowMove(){
           //打乱的次数
           for (int i = 0; i < 10 ; i++) {
               //根据手势开始交换,无动画
               int type = (int) (Math.random() * 4)+1;
               changeByDir(type,false);
           }
       }

       /**利用动画结束之后,交换两个方块的数据
        * @param mImageView  点击的方块
        */
       public void changeDataByImageView(final ImageView mImageView) {
           changeDataByImageView(mImageView,true);
       }

快速实现不一样的移动拼图

实现一个支持手势的移动拼图小游戏,手把手带你开发小游戏

15576 学习 · 67 问题

查看课程

相似问题