专注Java领域技术
我们一直在努力

Android拼图游戏开发全纪录5

原文始发于:Android拼图游戏开发全纪录5

今天我们终于可以把这个项目给结束掉啦,有了前几天的准备,相信最后一天还是比较轻松的,国际惯例:

Android拼图游戏开发全纪录5

最后要完成的就是我们的主要功能–拼图界面。

布局比较简单,在前几天就已经做好了,现在我们要做的是以下几件事情:

1、计时记步:这个是游戏基本都有的功能,其实也比较简单,记录成功移动的步数、显示一个计时器就行了。

2、处理图片,调整为合适的大小比例:这个方法在前几天已经实现了

3、点击GridView后移动图片:是否能移动的方法已经在前几天实现了

4、判断是否拼图完成:唉,也已经实现了

5、点击原图按钮:显示原图:只要显示一个ImageView就可以了

6、点击重置按钮:将传进来的这张图片重新处理一遍流程

基本思路写完了,看来很复杂的事情,是不是梳理下就觉得很简单了,很多准备工作做好了,会让我们的思路变的更清晰。

package com.xys.xpuzzle.activity;  import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.Timer; import java.util.TimerTask;  import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.View; import android.view.View.OnClickListener; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.Button; import android.widget.GridView; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.RelativeLayout.LayoutParams; import android.widget.TextView; import android.widget.Toast;  import com.xys.xpuzzle.R; import com.xys.xpuzzle.adapter.GridItemsAdapter; import com.xys.xpuzzle.bean.ItemBean; import com.xys.xpuzzle.util.GameUtil; import com.xys.xpuzzle.util.ImagesUtil; import com.xys.xpuzzle.util.ScreenUtil;  /**  * 拼图逻辑主界面:面板显示  *   * @author xys  *   */ public class PuzzleMain extends Activity implements OnClickListener {      // 选择的图片     private Bitmap picSelected;     // 拼图完成时显示的最后一个图片     public static Bitmap lastBitmap;     // PuzzlePanel     private GridView gv_puzzle_main_detail;     private int resId;     private String picPath;     private ImageView imageView;     // Button     private Button btnBack;     private Button btnImage;     private Button btnRestart;     // 显示步数     private TextView tv_puzzle_main_counts;     // 计时器     private TextView tv_Timer;     // 切图后的图片     private List<Bitmap> bitmapItemLists = new ArrayList<Bitmap>();     // GridView适配器     private GridItemsAdapter adapter;     // 设置为N*N显示     public static int type = 2;     // Flag 是否已显示原图     private boolean isShowImg;     // 步数显示     public static int countIndex = 0;     // 计时显示     public static int timerIndex = 0;     // 计时器类     private Timer timer;      /**      * UI更新Handler      */     private Handler handler = new Handler() {  	@Override 	public void handleMessage(Message msg) { 	    switch (msg.what) { 	    case 1: 		// 更新计时器 		timerIndex++; 		tv_Timer.setText("" + timerIndex); 		break; 	    default: 		break; 	    } 	}     };      /**      * 计时器线程      */     private TimerTask timerTask;      @Override     protected void onCreate(Bundle savedInstanceState) { 	super.onCreate(savedInstanceState); 	setContentView(R.layout.xpuzzle_puzzle_detail_main); 	// 获取选择的图片 	Bitmap picSelectedTemp; 	// 选择默认图片还是自定义图片 	resId = getIntent().getExtras().getInt("picSelectedID"); 	picPath = getIntent().getExtras().getString("picPath"); 	if (resId != 0) { 	    picSelectedTemp = BitmapFactory.decodeResource(getResources(), resId); 	} else { 	    picSelectedTemp = BitmapFactory.decodeFile(picPath); 	} 	type = getIntent().getExtras().getInt("type", 2); 	// 对图片处理 	handlerImage(picSelectedTemp); 	// 初始化Views 	initViews(); 	// 生成游戏数据 	generateGame(); 	// GridView点击事件 	gv_puzzle_main_detail.setOnItemClickListener(new OnItemClickListener() {  	    @Override 	    public void onItemClick(AdapterView<?> arg0, View view, int position, long arg3) { 		// 判断是否可移动 		if (GameUtil.isMoveable(position)) { 		    // 交换点击Item与空格的位置 		    GameUtil.swapItems(GameUtil.itemBeans.get(position), GameUtil.blankItemBean); 		    // 重新获取图片 		    recreateData(); 		    // 通知GridView更改UI 		    adapter.notifyDataSetChanged(); 		    // 更新步数 		    countIndex++; 		    tv_puzzle_main_counts.setText("" + countIndex); 		    // 判断是否成功 		    if (GameUtil.isSuccess()) { 			// 将最后一张图显示完整 			recreateData(); 			bitmapItemLists.remove(type * type - 1); 			bitmapItemLists.add(lastBitmap); 			// 通知GridView更改UI 			adapter.notifyDataSetChanged(); 			Toast.makeText(PuzzleMain.this, "拼图成功!", Toast.LENGTH_LONG).show(); 			gv_puzzle_main_detail.setEnabled(false); 			timer.cancel(); 			timerTask.cancel(); 		    } 		} 	    } 	}); 	// 返回按钮点击事件 	btnBack.setOnClickListener(this); 	// 显示原图按钮点击事件 	btnImage.setOnClickListener(this); 	// 重置按钮点击事件 	btnRestart.setOnClickListener(this);     }      /**      * Button点击事件      */     @Override     public void onClick(View v) { 	switch (v.getId()) { 	// 返回按钮点击事件 	case R.id.btn_puzzle_main_back: 	    PuzzleMain.this.finish(); 	    break; 	// 显示原图按钮点击事件 	case R.id.btn_puzzle_main_img: 	    Animation animShow = AnimationUtils.loadAnimation(PuzzleMain.this, R.anim.image_show_anim); 	    Animation animHide = AnimationUtils.loadAnimation(PuzzleMain.this, R.anim.image_hide_anim); 	    if (isShowImg) { 		imageView.startAnimation(animHide); 		imageView.setVisibility(View.GONE); 		isShowImg = false; 	    } else { 		imageView.startAnimation(animShow); 		imageView.setVisibility(View.VISIBLE); 		isShowImg = true; 	    } 	    break; 	// 重置按钮点击事件 	case R.id.btn_puzzle_main_restart: 	    cleanConfig(); 	    generateGame(); 	    recreateData(); 	    // 通知GridView更改UI 	    tv_puzzle_main_counts.setText("" + countIndex); 	    adapter.notifyDataSetChanged(); 	    gv_puzzle_main_detail.setEnabled(true); 	    break; 	default: 	    break; 	}     }      /**      * 生成游戏数据      */     private void generateGame() { 	// 切图 获取初始拼图数据 正常顺序 	new ImagesUtil().createInitBitmaps(type, picSelected, PuzzleMain.this); 	// 生成随机数据 	GameUtil.getPuzzleGenerator(); 	// 获取Bitmap集合 	for (ItemBean temp : GameUtil.itemBeans) { 	    bitmapItemLists.add(temp.getBitmap()); 	}  	// 数据适配器 	adapter = new GridItemsAdapter(this, bitmapItemLists); 	gv_puzzle_main_detail.setAdapter(adapter);  	// 启用计时器 	timer = new Timer(true); 	// 计时器线程 	timerTask = new TimerTask() {  	    @Override 	    public void run() { 		Message msg = new Message(); 		msg.what = 1; 		handler.sendMessage(msg); 	    } 	}; 	// 每1000ms执行 延迟0s 	timer.schedule(timerTask, 0, 1000);     }      /**      * 添加显示原图的View      */     private void addImgView() { 	RelativeLayout relativeLayout = (RelativeLayout) findViewById(R.id.rl_puzzle_main_main_layout); 	imageView = new ImageView(PuzzleMain.this); 	imageView.setImageBitmap(picSelected); 	int x = (int) (picSelected.getWidth() * 0.9F); 	int y = (int) (picSelected.getHeight() * 0.9F); 	LayoutParams params = new LayoutParams(x, y); 	params.addRule(RelativeLayout.CENTER_IN_PARENT); 	imageView.setLayoutParams(params); 	relativeLayout.addView(imageView); 	imageView.setVisibility(View.GONE);     }      /**      * 返回时调用      */     @Override     protected void onStop() { 	super.onStop(); 	// 清空相关参数设置 	cleanConfig(); 	this.finish();     }      /**      * 清空相关参数设置      */     private void cleanConfig() { 	// 清空相关参数设置 	GameUtil.itemBeans.clear(); 	// 停止计时器 	timer.cancel(); 	timerTask.cancel(); 	countIndex = 0; 	timerIndex = 0; 	// 清除拍摄的照片 	if (picPath != null) { 	    // 删除照片 	    File file = new File(MainActivity.TEMP_IMAGE_PATH); 	    if (file.exists()) { 		file.delete(); 	    } 	}     }      /**      * 重新获取图片      */     private void recreateData() { 	bitmapItemLists.clear(); 	for (ItemBean temp : GameUtil.itemBeans) { 	    bitmapItemLists.add(temp.getBitmap()); 	}     }      /**      * 对图片处理 自适应大小      *       * @param bitmap      */     private void handlerImage(Bitmap bitmap) { 	// 将图片放大到固定尺寸 	int screenWidth = ScreenUtil.getScreenSize(this).widthPixels; 	int screenHeigt = ScreenUtil.getScreenSize(this).heightPixels; 	picSelected = new ImagesUtil().resizeBitmap(screenWidth * 0.8f, screenHeigt * 0.6f, bitmap);     }      /**      * 初始化Views      */     private void initViews() { 	// Button 	btnBack = (Button) findViewById(R.id.btn_puzzle_main_back); 	btnImage = (Button) findViewById(R.id.btn_puzzle_main_img); 	btnRestart = (Button) findViewById(R.id.btn_puzzle_main_restart); 	// Flag 是否已显示原图 	isShowImg = false;  	// GV 	gv_puzzle_main_detail = (GridView) findViewById(R.id.gv_puzzle_main_detail); 	// 设置为N*N显示 	gv_puzzle_main_detail.setNumColumns(type); 	LayoutParams gridParams = new RelativeLayout.LayoutParams(picSelected.getWidth(), picSelected.getHeight()); 	// 水平居中 	gridParams.addRule(RelativeLayout.CENTER_HORIZONTAL); 	// 其他格式属性 	gridParams.addRule(RelativeLayout.BELOW, R.id.ll_puzzle_main_spinner); 	// Grid显示 	gv_puzzle_main_detail.setLayoutParams(gridParams); 	gv_puzzle_main_detail.setHorizontalSpacing(0); 	gv_puzzle_main_detail.setVerticalSpacing(0);  	// TV步数 	tv_puzzle_main_counts = (TextView) findViewById(R.id.tv_puzzle_main_counts); 	tv_puzzle_main_counts.setText("" + countIndex); 	// TV计时器 	tv_Timer = (TextView) findViewById(R.id.tv_puzzle_main_time); 	tv_Timer.setText("0秒");  	// 添加显示原图的View 	addImgView();     } } 

自认为注释、代码风格还是不错的,希望大家喜欢。

PS:需要源代码的朋友请留言,其实根据这个思路自己去实现下,对自己是有很大提高的,如果能优化我的代码,那就更好了,可以一起学习交流下。

赞(0) 打赏
未经允许不得转载:Java小咖秀 » Android拼图游戏开发全纪录5
免责声明

抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

专注Java技术 100年

联系我们联系我们

你默默的关注就是最好的打赏~

支付宝扫一扫打赏

微信扫一扫打赏