为了账号安全,请及时绑定邮箱和手机立即绑定

如果要设计成关卡,进入下一关,只改变图片,要怎么设计

感觉要改变很多代码,弄了很久都不行

正在回答

7 回答

关键代码,在//加载关卡数据的下面追加

				/* ======实现下一关效果======= */
				// 初始化游戏小方块
				Bitmap bigBm = ((BitmapDrawable) getResources().getDrawable(R.drawable.b)).getBitmap();
				int tuWandH = bigBm.getWidth() / 3;// 每个小方块的宽和高
				// 重新设置对应的要展示的图片
				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].setImageBitmap(bm);// 设置每一个方块的图标
						iv_game_arr[i][j].setPadding(2, 2, 2, 2);// 设置方块间距
						iv_game_arr[i][j].setTag(new GameData(i, j, bm));// 绑定自定义数据
					}
				}
				setNullImageView(iv_game_arr[2][2]);// 设置最后一个方块是空的
				isGameStart = false;// 设置游戏未开始,方便下面打乱顺序时不显示动画。
				randomMove();// 初始化随机打乱顺序
				isGameStart = true;// 开始游戏状态,此时点击方块移动时会有动画

第二关图片如下

http://img1.sycdn.imooc.com//58143b150001fce503330333.jpg

效果演示

58143b450001426305000889.jpg

58143b4900016dcb05000889.jpg

58143b4e0001bf1005000889.jpg

58143b530001299705000889.jpg


0 回复 有任何疑惑可以回复我~
#1

慕勒0695240 提问者

如果是这种方法,要导入很多图片的话,就会重复很多代码,有没有一种不用写很多代码的。我想把要用的图片放到一个数组里,通过关卡索引来改变图片
2016-10-29 回复 有任何疑惑可以回复我~
#2

阿旭_ 回复 慕勒0695240 提问者

可以把这段代码封装起来,方便的参数是int id类型,然后全局做一个变量控制关卡的变量int t (做为数组的下标,0表示第一关,1表示第二关以此类推),再做一个数组保存所有的图片id 。int[] arr_img_id = new int[]{R.drawable.a,R.drawable.b,R.drawable.c,R.drawable.d};于是调用方法法的时候传的id就变成了arr_img_id[t];即,第N关的的图片就是arr_img_id[t]
2016-10-29 回复 有任何疑惑可以回复我~

完整代码如下:

package com.example.admin.pintu;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.os.SystemClock;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.TranslateAnimation;
import android.widget.Chronometer;
import android.widget.GridLayout;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;

public class MainActivity extends Activity {
	private boolean isGameStart = false;// 判断游戏是否开始
	private boolean isGameOver = false;// 判断游戏是否结束
	private boolean changeDataByImageView = false;// 判断游戏是否交换数据
	private ImageView[][] iv_game_arr = new ImageView[3][3];// 利用二维数组创建方块
	private GridLayout gl_main_game;// 主页面
	private ImageView iv_null_ImageView;// 当前空方块的实例的保存
	private GestureDetector mDetector;// 当前手势
	private boolean isAnimRun = false;// 当前动画是否在执行
	private Chronometer timer;
	private ImageButton stop;
	private View mPassView;
	private TextView mCurrentTimeSpend;
	private TextView mCurrentStageView;
	private int mCurrentStageIndex = 0;
	private Bitmap bigBm;

	// private ArrayList<BitmapDrawable> mBigBm;
	// 设置手势
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		return mDetector.onTouchEvent(event);
	}

	@Override
	public boolean dispatchTouchEvent(MotionEvent ev) {
		mDetector.onTouchEvent(ev);
		return super.dispatchTouchEvent(ev);
	}

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.content_main);
		// 设置监听器
		mDetector = new GestureDetector(this, new GestureDetector.OnGestureListener() {
			@Override
			public boolean onSingleTapUp(MotionEvent arg0) {
				return false;
			}

			@Override
			public void onShowPress(MotionEvent arg0) {
			}

			@Override
			public boolean onScroll(MotionEvent arg0, MotionEvent arg1, float arg2, float arg3) {
				return false;
			}

			@Override
			public void onLongPress(MotionEvent arg0) {
			}

			@Override
			public boolean onFling(MotionEvent arg0, MotionEvent arg1, float arg2, float arg3) {
				int type = getDirByGes(arg0.getX(), arg0.getY(), arg1.getX(), arg1.getY());
				changeByDir(type);// 传递方法
				return false;
			}

			@Override
			public boolean onDown(MotionEvent arg0) {
				return false;
			}
		});
		// 获取时间和停止按钮资源
		this.timer = (Chronometer) findViewById(R.id.chronometer);
		this.stop = (ImageButton) findViewById(R.id.imageButton);
		stop.setOnClickListener(isstop);
		// 显示当前关的索引
		mCurrentStageView = (TextView) findViewById(R.id.textView);
		if (mCurrentStageView != null) {
			mCurrentStageView.setText("第" + (mCurrentStageIndex + 1) + "关");
		}
		// 初始化游戏小方块
		// 获取一张大图
		Bitmap bigBm = ((BitmapDrawable) getResources().getDrawable(R.drawable.a)).getBitmap();
		int tuWandH = bigBm.getWidth() / 3;// 每个小方块的宽和高
		int ivWandH = getWindowManager().getDefaultDisplay().getWidth() / 3;// 小方块宽应为整个屏幕/3
		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].setLayoutParams(new RelativeLayout.LayoutParams(ivWandH, ivWandH));
				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);
						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][2]);// 设置最后一个方块是空的
		randomMove();// 初始化随机打乱顺序
		isGameStart = true;// 开始游戏状态
		timer.start();
	}

	// 重载,由于开始100次随即无动画
	public void changeByDir(int type) {
		changeByDir(type, true);
	}

	// 根据手势方向获取空方块相邻位置,存在方块,进行数据交换,1up,2down,3left,4right
	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 {
			// 不用做什么
		}
	}

	// 游戏暂停
	private View.OnClickListener isstop = new View.OnClickListener() {
		@Override
		public void onClick(View v) {
			timer.stop();
		}
	};

	// 判断游戏结束方法
	public void isGameOver() {
		boolean isGameOver = true;
		// 遍历每个游戏方块
		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) {
			timer.stop();
			handlePassEvent();
		}
	}

	// 处理过关界面
	private void handlePassEvent() {
		// 显示过关界面
		mPassView = (LinearLayout) findViewById(R.id.pass_view);
		mPassView.setVisibility(View.VISIBLE);
		// 当前关的索引
		mCurrentTimeSpend = (TextView) findViewById(R.id.time_spend);
		if (mCurrentTimeSpend != null) {
			mCurrentTimeSpend.setText("用时:" + timer.getText());
		}
		// 下一关按键处理
		ImageButton btnPass = (ImageButton) findViewById(R.id.btn_next);
		btnPass.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				/**
				 * if(judegAppPassed){ //进入到通关界面 }else {
				 */
				// 开始新的一关
				mPassView.setVisibility(View.GONE);
				// 时间清零
				timer.setBase(SystemClock.elapsedRealtime());
				timer.start();
				// 加载关卡数据
				/* ======实现下一关效果======= */
				// 初始化游戏小方块
				Bitmap bigBm = ((BitmapDrawable) getResources().getDrawable(R.drawable.b)).getBitmap();
				int tuWandH = bigBm.getWidth() / 3;// 每个小方块的宽和高
				// 重新设置对应的要展示的图片
				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].setImageBitmap(bm);// 设置每一个方块的图标
						iv_game_arr[i][j].setPadding(2, 2, 2, 2);// 设置方块间距
						iv_game_arr[i][j].setTag(new GameData(i, j, bm));// 绑定自定义数据
					}
				}
				setNullImageView(iv_game_arr[2][2]);// 设置最后一个方块是空的
				isGameStart = false;// 设置游戏未开始,方便下面打乱顺序时不显示动画。
				randomMove();// 初始化随机打乱顺序
				isGameStart = true;// 开始游戏状态,此时点击方块移动时会有动画
			}
		});
	}

	
	// 判断是否通关
	/**
	 * private boolean judegAppPassed(){ return (mCurrentStageIndex==
	 * Const.SONG_INFO.length - 1); }
	 */
	// 手势判断
	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;
			}
		}
		// 1up,2down,3left,4right
	}

	// 随即打乱顺序
	public void randomMove() {
		// 打乱次数
		for (int i = 0; i < 10; i++) {
			// 开始交换,无动画
			int type = (int) (Math.random() * 4) + 1;
			changeByDir(type, false);
		}
	}

	public void changeDataByImageView(final ImageView miImageView) {// 重载有动画
		changeDataByImageView(miImageView, true);
	}

	// 利用动画结束之后,交换两个方块数据
	public void changeDataByImageView(final ImageView miImageView, boolean isAnim) {
		if (isAnimRun) {
			return;
		}
		if (!isAnim) {
			GameData mGameData = (GameData) miImageView.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(miImageView);// 设置当前点击的为空方块
			if (isGameStart) {
				isGameOver();// 成功时,弹出一个toast
			}
			return;
		}
		TranslateAnimation translateAnimation = null;// 创建一个动画,设置方向,移动距离
		if (miImageView.getX() > iv_null_ImageView.getX()) {// 当前点击在空之上
			translateAnimation = new TranslateAnimation(0.1f, -miImageView.getWidth(), 0.1f, 0.1f);// 向上移动
		} else if (miImageView.getX() < iv_null_ImageView.getX()) {
			translateAnimation = new TranslateAnimation(0.1f, miImageView.getWidth(), 0.1f, 0.1f);// 向下移动
		} else if (miImageView.getY() > iv_null_ImageView.getY()) {
			translateAnimation = new TranslateAnimation(0.1f, 0.1f, 0.1f, -miImageView.getHeight());// 向左移动
		} else if (miImageView.getY() < iv_null_ImageView.getY()) {
			translateAnimation = new TranslateAnimation(0.1f, 0.1f, 0.1f, miImageView.getHeight());// 向右移动
		}
		translateAnimation.setDuration(70);// 设置动画时常,ms
		translateAnimation.setFillAfter(true);// 设置动画结束之后是否停留
		// 设置动画结束之后真正交换数据
		translateAnimation.setAnimationListener(new Animation.AnimationListener() {
			@Override
			public void onAnimationStart(Animation animation) {
				isAnimRun = true;
			}

			@Override
			public void onAnimationRepeat(Animation animation) {
			}

			@Override
			public void onAnimationEnd(Animation animation) {
				isAnimRun = false;
				miImageView.clearAnimation();
				GameData mGameData = (GameData) miImageView.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(miImageView);// 设置当前点击的为空方块
				if (isGameStart) {
					isGameOver();
				}
			}
		});
		miImageView.startAnimation(translateAnimation);// 执行动画
	}

	// 设置空方块,mImageView是当前设置为空方块的实例
	public void setNullImageView(ImageView mImageView) {
		mImageView.setImageBitmap(null);
		iv_null_ImageView = mImageView;
	}

	// 判断当前点击的是否是空方块位置为相邻关系,mImageView所点击的方块
	public boolean isHasByNullImageView(ImageView mImageView) {
		// 分别获取当前空方块的位置与点击方块的位置
		GameData mNullGameData = (GameData) iv_null_ImageView.getTag();
		GameData mGameData = (GameData) mImageView.getTag();
		if (mNullGameData.y == mGameData.y && mNullGameData.x + 1 == mGameData.x) {// 当前点击方块在空方块上面
			return true;
		} else if (mNullGameData.y == mGameData.y && mNullGameData.x - 1 == mGameData.x) {// 当前点击方块在空方块下面
			return true;
		} else if (mNullGameData.y == mGameData.y + 1 && mNullGameData.x == mGameData.x) {// 当前点击方块在空方块左面
			return true;
		} else if (mNullGameData.y == mGameData.y - 1 && mNullGameData.x == mGameData.x) {// 当前点击方块在空方块右面
			return true;
		}
		return false;
	}

	// 小方块的监测数据
	class GameData {
		public int x = 0;// 方块位置x
		public int y = 0;// 方块位置y
		public Bitmap bm;// 方块图片
		public int p_x;// 图片位置x
		public int p_y;// 图片位置y

		public GameData(int x, int y, Bitmap bm) {
			super();
			this.x = x;
			this.y = y;
			this.bm = bm;
			this.p_x = x;
			this.p_y = y;
		}

		// 方块的位置是否正确
		public boolean isTrue() {
			if (x == p_x && y == p_y) {
				return true;
			}
			return false;
		}
	}
}


0 回复 有任何疑惑可以回复我~

写一个方法用来重置图片即可。

步骤1:方法的参数是Bitmap的。

步骤2:重新为每个ImageView设置新的图片,绑定新的GameData

步骤3:调用“设置最后一个方块是空的”和“初始化随机打乱顺序方块”方法。

如果还是实现不了,请把你的代码贴上来,我帮你实现再发给你。

0 回复 有任何疑惑可以回复我~

http://img1.sycdn.imooc.com//5814572f0001bead12030569.jpg。。。

0 回复 有任何疑惑可以回复我~
#1

慕勒0695240 提问者

这是什么问题啊
2016-10-29 回复 有任何疑惑可以回复我~
#2

阿旭_

内存不够了,可能的原因有两个,一个是图片太大。另一种可能是代码可能有地方写成了死循环。 建议把图片改成333*333像素的试一下。
2016-10-29 回复 有任何疑惑可以回复我~
#3

慕勒0695240 提问者 回复 阿旭_

对!是图片太大了
2016-10-29 回复 有任何疑惑可以回复我~

http://img1.sycdn.imooc.com//58144eef0001531c03870715.jpg点击下一关后会出现这个

0 回复 有任何疑惑可以回复我~
#1

阿旭_

发一下控制台的错误日志,看能不能定位崩溃的代码是哪一行。
2016-10-29 回复 有任何疑惑可以回复我~

  //处理过关界面

    private void handlePassEvent(){

        //显示过关界面

        mPassView = (LinearLayout)findViewById(R.id.pass_view);

        mPassView.setVisibility(View.VISIBLE);

        //当前关的索引

        mCurrentTimeSpend=(TextView)findViewById(R.id.time_spend);

        if(mCurrentTimeSpend!=null){

            mCurrentTimeSpend.setText("用时:"+timer.getText());

        }

        //下一关按键处理

        ImageButton btnPass = ( ImageButton)findViewById(R.id.btn_next);

        btnPass.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

                /**   if(judegAppPassed){

                 //进入到通关界面

                 }else {*/

                //开始新的一关

                mPassView.setVisibility(View.GONE);

                //时间清零

                timer.setBase(SystemClock.elapsedRealtime());

                timer.start();

                //加载关卡数据

            }

        });

    }

     //判断是否通关

  /**  private  boolean judegAppPassed(){

        return (mCurrentStageIndex== Const.SONG_INFO.length - 1);

    }*/

    //手势判断

    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;

            }

        }

        //1up,2down,3left,4right

    }

    //随即打乱顺序

    public void randomMove(){

        //打乱次数

        for (int i = 0; i < 10; i++) {

            //开始交换,无动画

            int type = (int) (Math.random()*4)+1;

            changeByDir(type,false);

        }

    }

    public void changeDataByImageView(final ImageView miImageView){//重载有动画

        changeDataByImageView(miImageView,true);

    }

    //利用动画结束之后,交换两个方块数据

    public void changeDataByImageView(final ImageView miImageView,boolean isAnim){

        if (isAnimRun) {

            return;

        }

        if(!isAnim){

            GameData mGameData = (GameData) miImageView.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(miImageView);//设置当前点击的为空方块

            if(isGameStart){

                isGameOver();//成功时,弹出一个toast

            }

            return;

        }

        TranslateAnimation translateAnimation=null;//创建一个动画,设置方向,移动距离

        if(miImageView.getX()>iv_null_ImageView.getX()){//当前点击在空之上

            translateAnimation = new TranslateAnimation(0.1f,-miImageView.getWidth(), 0.1f,0.1f);//向上移动

        }else if(miImageView.getX()<iv_null_ImageView.getX()){

            translateAnimation = new TranslateAnimation( 0.1f,miImageView.getWidth(),0.1f,0.1f);//向下移动

        }else if(miImageView.getY()>iv_null_ImageView.getY()){

            translateAnimation = new TranslateAnimation(0.1f, 0.1f,0.1f,-miImageView.getHeight());//向左移动

        }else if(miImageView.getY()<iv_null_ImageView.getY()){

            translateAnimation = new TranslateAnimation(0.1f, 0.1f,0.1f,miImageView.getHeight());//向右移动

        }

        translateAnimation.setDuration(70);//设置动画时常,ms

        translateAnimation.setFillAfter(true);//设置动画结束之后是否停留

        //设置动画结束之后真正交换数据

        translateAnimation.setAnimationListener(new Animation.AnimationListener() {

            @Override

            public void onAnimationStart(Animation animation) {

                isAnimRun = true;

            }

            @Override

            public void onAnimationRepeat(Animation animation) {

            }

            @Override

            public void onAnimationEnd(Animation animation) {

                isAnimRun = false;

                miImageView.clearAnimation();

                GameData mGameData = (GameData) miImageView.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(miImageView);//设置当前点击的为空方块

                if(isGameStart){

                    isGameOver();

                }

            }

        });

        miImageView.startAnimation(translateAnimation);//执行动画

    }

    //设置空方块,mImageView是当前设置为空方块的实例

    public void setNullImageView(ImageView mImageView){

        mImageView.setImageBitmap(null);

        iv_null_ImageView  = mImageView;

    }

    //判断当前点击的是否是空方块位置为相邻关系,mImageView所点击的方块

    public boolean isHasByNullImageView(ImageView mImageView){

        //分别获取当前空方块的位置与点击方块的位置

        GameData mNullGameData=(GameData) iv_null_ImageView.getTag();

        GameData mGameData=(GameData)mImageView.getTag();

        if(mNullGameData.y==mGameData.y&&mNullGameData.x+1==mGameData.x){//当前点击方块在空方块上面

            return true;

        }else if(mNullGameData.y==mGameData.y&&mNullGameData.x-1==mGameData.x){//当前点击方块在空方块下面

            return true;

        }else if(mNullGameData.y==mGameData.y+1&&mNullGameData.x==mGameData.x){//当前点击方块在空方块左面

            return true;

        }else if(mNullGameData.y==mGameData.y-1&&mNullGameData.x==mGameData.x){//当前点击方块在空方块右面

            return true;

        }

        return false;

    }

    //小方块的监测数据

    class GameData{

        public int x=0;//方块位置x

        public int y=0;//方块位置y

        public  Bitmap bm;//方块图片

        public int p_x;//图片位置x

        public int p_y;//图片位置y

        public GameData(int x, int y, Bitmap bm) {

            super();

            this.x = x;

            this.y = y;

            this.bm = bm;

            this.p_x = x;

            this.p_y = y;

        }

        //方块的位置是否正确

        public boolean isTrue() {

            if (x==p_x&&y==p_y) {

                return true;

            }

            return false;

        }

    }

}



0 回复 有任何疑惑可以回复我~

package com.example.admin.pintu;


import android.app.Activity;

import android.content.DialogInterface;

import android.graphics.Bitmap;

import android.graphics.drawable.BitmapDrawable;

import android.os.Bundle;

import android.os.SystemClock;

import android.support.design.widget.FloatingActionButton;

import android.support.design.widget.Snackbar;

import android.support.v7.app.AppCompatActivity;

import android.support.v7.widget.Toolbar;

import android.view.GestureDetector;

import android.view.MotionEvent;

import android.view.View;

import android.view.Menu;

import android.view.MenuItem;

import android.view.animation.Animation;

import android.view.animation.TranslateAnimation;

import android.widget.Chronometer;

import android.widget.ExpandableListView;

import android.widget.GridLayout;

import android.widget.ImageButton;

import android.widget.ImageView;

import android.widget.LinearLayout;

import android.widget.RelativeLayout;

import android.widget.TextView;

import android.widget.Toast;

import com.example.admin.R;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    private boolean isGameStart = false;//判断游戏是否开始

    private boolean isGameOver = false;//判断游戏是否结束

    private boolean changeDataByImageView=false;//判断游戏是否交换数据

    private ImageView[][] iv_game_arr = new ImageView[3][3];//利用二维数组创建方块

    private GridLayout gl_main_game;//主页面

    private ImageView iv_null_ImageView;//当前空方块的实例的保存

    private GestureDetector mDetector;//当前手势

    private boolean isAnimRun= false;//当前动画是否在执行

    private Chronometer timer;

    private ImageButton stop;

    private View mPassView;

    private TextView mCurrentTimeSpend;

    private TextView mCurrentStageView;

    private int  mCurrentStageIndex = 0;

    private  Bitmap bigBm;

  //  private ArrayList<BitmapDrawable> mBigBm;

    //设置手势

    @Override

    public boolean onTouchEvent(MotionEvent event) {

        return mDetector.onTouchEvent(event);

    }

    @Override

    public boolean dispatchTouchEvent(MotionEvent ev) {

        mDetector.onTouchEvent(ev);

        return super.dispatchTouchEvent(ev);

    }

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.content_main);

        //设置监听器

        mDetector = new GestureDetector(this,new GestureDetector.OnGestureListener() {

            @Override

            public boolean onSingleTapUp(MotionEvent arg0) {

                return false;

            }

            @Override

            public void onShowPress(MotionEvent arg0) {

            }

            @Override

            public boolean onScroll(MotionEvent arg0, MotionEvent arg1, float arg2,

                                    float arg3) {

                return false;

            }

            @Override

            public void onLongPress(MotionEvent arg0) {

            }

            @Override

            public boolean onFling(MotionEvent arg0, MotionEvent arg1, float arg2,float arg3) {

                int type = getDirByGes(arg0.getX(), arg0.getY(), arg1.getX(), arg1.getY());

                changeByDir(type);//传递方法

                return false;

            }

            @Override

            public boolean onDown(MotionEvent arg0) {

                return false;

            }

        });

        //获取时间和停止按钮资源

        this.timer = (Chronometer)findViewById(R.id.chronometer);

        this.stop=(ImageButton)findViewById(R.id.imageButton);

        stop.setOnClickListener(isstop);

        //显示当前关的索引

        mCurrentStageView = (TextView) findViewById(R.id.textView);

        if (mCurrentStageView != null) {

            mCurrentStageView.setText("第" + (mCurrentStageIndex + 1) + "关");

        }

        //初始化游戏小方块

            //获取一张大图

            Bitmap  bigBm = ((BitmapDrawable) getResources().getDrawable(R.drawable.a)).getBitmap();

            int tuWandH = bigBm.getWidth() / 3;//每个小方块的宽和高

            int ivWandH = getWindowManager().getDefaultDisplay().getWidth() / 3;//小方块宽应为整个屏幕/3

            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].setLayoutParams(new RelativeLayout.LayoutParams(ivWandH, ivWandH));

                    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);

                            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][2]);//设置最后一个方块是空的

            randomMove();//初始化随机打乱顺序

            isGameStart = true;//开始游戏状态

            timer.start();

        }

    //重载,由于开始100次随即无动画

    public void changeByDir(int type){

        changeByDir(type,true);

    }

    //根据手势方向获取空方块相邻位置,存在方块,进行数据交换,1up,2down,3left,4right

    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 {

            //不用做什么

        }

    }

    //游戏暂停

    private View.OnClickListener isstop=new View.OnClickListener() {

        @Override

        public void onClick(View v) {

            timer.stop();

        }

    };

    //判断游戏结束方法

    public void isGameOver(){

        boolean isGameOver = true;

        //遍历每个游戏方块

        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) {

            timer.stop();

            handlePassEvent();

        }

    }

  

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

如果要设计成关卡,进入下一关,只改变图片,要怎么设计

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信