package com.puzzles;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
/**
* <p>
* Title: LoonFramework
* </p>
* <p>
* Description:拼图图像处理[未优化](优化算法已内置于loonframework-game框架中。)
* </p>
* <p>
* Copyright: Copyright (c) 2007
* </p>
* <p>
* Company: LoonFramework
* </p>
*
* @author myc
* @email:464102961@qq.com
* @version 0.1
*/
// import org.loon.framework.game.helper.ImageHelper;
public class BlockView extends View {
private static final int GRID_BG_COLOR = Color.argb(0xff, 0x0, 0x0, 0x0);
private int delayMillis = 30; // 定时刷新
private Context context = null;
/**
* 背景图片,主要用作处理
*/
private Bitmap backImage;
private Bitmap screen;
private int[] blocks;
private boolean isEvent = false;
private float mWidth;
private float mHeight;
private static final int ROWS = 4;
private static final int COLS = 4;
private int blockWidth;
private int blockHeight;
private int imgsCounts;
private Resources r = null;
private Paint paint = new Paint();
private Canvas backCanvas = null;
private Canvas screenCanvas = null;
private float rale;
private boolean running = false;
private boolean inited = false;
private int xOffset, yOffset;
private Bitmap overImage;
private Rect bufSrcRect = null;
private RectF bufTarRect = null;
private int[] gridCols = new int[(COLS + 1) * 4];
private int[] gridRows = new int[(ROWS + 1) * 4];
boolean event_down = false; // 第一次单击图片时,为true,再次单击为false, 主要用于选中图片时图片稍微变大
public boolean gameStart = false; // 游戏是否开始
private boolean gamemode = true; // 游戏模式主要是两种难度,这里主要是提供一种思路
private int before_key_down_l; // 单次点击图片,图片所在的列
private int before_key_down_k;// 单次点击图片,图行所在的列
private int backgroundCount = 14;
private int myBackGround[] = new int[backgroundCount]; // 背景图片资源
private int screenWidth; // 屏幕宽
private int screenHeight;
private int backgroundIndex;// 背景图片数组下标
public BlockView(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
}
public boolean getGameMode() {
return gamemode;
}
public void setGameMode(boolean mode) {
gamemode = mode;
}
public BlockView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
this.context = context;
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
if (!inited) {
int i;
backgroundIndex = 0;
r = context.getResources();
for (i = 0; i < backgroundCount; i++) {
myBackGround[i] = (R.drawable.backimage1 + i);
}
screenHeight = h;
screenWidth = w;
init(w, h, 0);
// 初始化格子坐标
for (i = 0; i <= COLS; i++) {
gridCols[i * COLS + 0] = xOffset + i * blockWidth;
gridCols[i * COLS + 1] = yOffset;
gridCols[i * COLS + 2] = xOffset + i * blockWidth;
gridCols[i * COLS + 3] = ROWS * blockHeight + yOffset;
}
for (i = 0; i <= ROWS; i++) {
gridRows[i * ROWS + 0] = xOffset;
gridRows[i * ROWS + 1] = i * blockHeight + yOffset;
gridRows[i * ROWS + 2] = COLS * blockWidth + xOffset;
gridRows[i * ROWS + 3] = i * blockHeight + yOffset;
}
bufSrcRect = new Rect(0, 0, (int) mWidth, (int) mHeight);
bufTarRect = new RectF(0, 0, mWidth, mHeight);
inited = true;
update();
}
}
public void startNext() {
backImage.recycle();
if (backgroundIndex < backgroundCount - 1) {
backgroundIndex++;
} else {
backgroundIndex = 0;
}
gameStart = false;
init(screenWidth, screenHeight, backgroundIndex);
}
public void reStartGame() {
gameStart = false;
getBackImage(r.getDrawable(myBackGround[backgroundIndex]));
getScreenImage();
getOverImage(r.getDrawable(R.drawable.over));
randomPannel();
// init(screenWidth, screenHeight, backgroundIndex);
}
/**
* 初始化拼图参数。
*
* @param bImage
* @param overImage
* @param cs
* @param rs
*/
public void init(int w, int h) {
setFocusable(true);
// 获取背景图片的 Drawable 资源
Drawable blockImage = r.getDrawable(R.drawable.backimage3);
// 获得实际窗体宽。+
mWidth = blockImage.getMinimumWidth();
// 获得实际窗体高。+
mHeight = blockImage.getMinimumHeight();
// 得到最小的比率
rale = Math.min(w / mWidth, h / mHeight);
mWidth = (int) (mWidth * rale);
mHeight = (int) (mHeight * rale);
xOffset = (w - (int) mWidth) >> 1;
yOffset = (h - (int) mHeight) >> 1;
// 获得单块图像宽。
blockWidth = (int) (mWidth / COLS);
// 获得单块图像高。
blockHeight = (int) (mHeight / ROWS);
// 本程序直接使用backimage上一块图形区域缓冲选择项,所以实际背景图像高=图形高+额外图块高。
getBackImage(r.getDrawable(R.drawable.backimage3));
getScreenImage();
getOverImage(r.getDrawable(R.drawable.over));
// 获得等同图片总数的数组,要多出一行和一列用作图像临时存放区
imgsCounts = COLS * ROWS;
blocks = new int[imgsCounts];
// 初始化为非点击。
isEvent = false;
// 初始化图块参数。保存图块正常序列
for (int i = 0; i < imgsCounts; i++) {
blocks[i] = i;
}
// 随机生成图像面板内容。
randomPannel();
}
public void init(int w, int h, int index) {
setFocusable(true);
// 获取背景图片的 Drawable 资源
Log.i("puzzle", String.valueOf(w));
Log.i("puzzle", String.valueOf(h));
Log.i("index", String.valueOf(index));
Drawable blockImage = r.getDrawable(myBackGround[backgroundIndex]);
// 获得实际窗体宽。+
mWidth = blockImage.getMinimumWidth();
// 获得实际窗体高。+
mHeight = blockImage.getMinimumHeight();
Log.i("puzzle", String.valueOf(mWidth));
Log.i("puzzle", String.valueOf(mHeight));
// 得到最小的比率
rale = Math.min(w / mWidth, h / mHeight);
mWidth = (int) (mWidth * rale);
mHeight = (int) (mHeight * rale);
Log.i("mWidth", String.valueOf(mWidth));
Log.i("mHeight", String.valueOf(mHeight));
xOffset = (w - (int) mWidth) >> 1;
yOffset = (h - (int) mHeight) >> 1;
// 获得单块图像宽。
blockWidth = (int) (mWidth / COLS);
// 获得单块图像高。
blockHeight = (int) (mHeight / ROWS);
Log.i("blockWidth", String.valueOf(blockWidth));
Log.i("blockHeight", String.valueOf(blockHeight));
// 本程序直接使用backimage上一块图形区域缓冲选择项,所以实际背景图像高=图形高+额外图块高。
getBackImage(r.getDrawable(myBackGround[backgroundIndex]));
getScreenImage();
getOverImage(r.getDrawable(R.drawable.over));
// 获得等同图片总数的数组,要多出一行和一列用作图像临时存放区
imgsCounts = COLS * ROWS;
blocks = new int[imgsCounts];
// 初始化为非点击。
isEvent = false;
// 初始化图块参数。保存图块正常序列
for (int i = 0; i < imgsCounts; i++) {
blocks[i] = i;
}
// 随机生成图像面板内容。
randomPannel();
}
private void getBackImage(Drawable src) {
// 背景图片多一行
Bitmap bitmap = Bitmap.createBitmap((int) mWidth, (int) mHeight
+ blockHeight, Bitmap.Config.ARGB_8888);
backCanvas = new Canvas();
backCanvas.setBitmap(bitmap);
src.setBounds(0, 0, (int) mWidth, (int) mHeight);
src.draw(backCanvas);
backImage = bitmap;
}
private void getOverImage(Drawable src) {
Bitmap bitmap = Bitmap.createBitmap((int
没有合适的资源?快使用搜索试试~ 我知道了~
拼图算法安卓拼图游戏用户界面开发设计动画效果设定
共60个文件
jpg:17个
java:16个
xml:12个
0 下载量 118 浏览量
2024-09-13
07:29:46
上传
评论
收藏 2MB RAR 举报
温馨提示
开发一款安卓拼图游戏涉及多个步骤,从概念设计到最终发布,每个阶段都需要细致的规划和实施。 游戏概念:确定游戏的基本玩法,例如传统拼图(静态图片拼接)、动态拼图(如拼接一段视频的帧)、或是带有故事情节的拼图游戏。 用户群体:识别目标用户,了解他们的喜好和习惯,以设计出符合市场需求的产品。 功能特性:列出游戏的核心功能,如自定义难度(行数和列数)、计时器、分数系统、提示功能等。 图像处理:实现图像加载、切割、显示等功能。可以使用 Bitmap 类来处理图像数据。 拼图算法:设计算法来生成随机化的拼图块,并实现用户交互逻辑,如拖拽、旋转拼图块。 状态管理:设计状态管理机制来记录拼图的状态,包括拼图块的位置、旋转角度等。 存储与数据管理 本地存储:使用 SharedPreferences 或 SQLite 数据库来保存游戏设置、用户进度等信息。 云端同步:如果需要,可以使用 Firebase 或其他云服务来实现数据的云端存储和同步。 UI/UX 设计:设计用户界面和用户体验,包括主菜单、游戏界面、设置界面等。 原型制作:使用工具(如 Sketch、Adobe XD 或 Figma)制作游戏原
资源推荐
资源详情
资源评论
收起资源包目录
CSDN安卓拼图游戏.rar (60个子文件)
project.properties 361B
.classpath 372B
截图3.png 233KB
截图2.png 231KB
截图1.png 220KB
assets
src
com
gallery
GalleryFlow.java 3KB
MyBitmapFactory.java 3KB
ImageAdapter.java 2KB
fileselect
FileLoadTask.java 3KB
FileItem.java 1KB
ImageFilter.java 536B
FolderFilter.java 291B
FileListAdapter.java 2KB
ImageLoadTask.java 3KB
puzzles
MainMenu.java 8KB
BlockView.java 15KB
GameSetting.java 1KB
SelectImage.java 6KB
MyPuzzlesActivity.java 3KB
FileListActivity.java 2KB
res
anim
menu_anim.xml 353B
introduction_anim.xml 651B
drawable-mdpi
icon_p.png 13KB
over.gif 3KB
icon.png 3KB
ic_launcher.png 3KB
drawable-ldpi
backimage6.jpg 104KB
backimage1.jpg 57KB
backimage5.jpg 110KB
backimage10.jpg 120KB
backimage13.jpg 93KB
backimage3.jpg 66KB
backimage8.jpg 54KB
backimage12.jpg 77KB
backimage14.jpg 3KB
backimage9.jpg 105KB
backimage2.jpg 91KB
backimage4.jpg 145KB
backimage11.jpg 81KB
backimage7.jpg 115KB
ic_launcher.png 2KB
values
strings.xml 936B
styles.xml 591B
layout
select.xml 2KB
setting.xml 1KB
main.xml 891B
main_menu.xml 2KB
file_list.xml 470B
filelist_item.xml 862B
drawable
menu_selector.xml 1KB
drawable-hdpi
folder.png 2KB
file.png 5KB
light.jpg 40KB
love.jpg 37KB
ic_launcher.png 4KB
bd.jpg 12KB
proguard.cfg 1KB
.project 812B
AndroidManifest.xml 1KB
gen
com
puzzles
R.java 4KB
共 60 条
- 1
资源评论
QQ1978519681计算机程序
- 粉丝: 1054
- 资源: 299
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于Java技术的电商项目——changgou源码设计分析
- 基于Python和HTML的myweb2毕设设计源码
- MPC模型预测平行泊车系统路径跟踪控制simulink模型(附参考文献) 1.根据车辆参数确定了所需的最小车位尺寸和理论可行泊车
- 基于Python的森空岛明日方舟自动签到脚本设计源码
- 基于C语言的mesh_temperature_sensor_demo设计源码及Shell脚本实现示例
- 基于Java语言的蓝信开放平台SDK设计源码
- 三相PWM整流器闭环仿真,电压电流双闭环控制,输出直流电压做外环 模型中包含主电路,坐标变,电压电流双环PI控制器,SVPWM控
- 基于PLC的全自动洗衣机的设计,西门子S7-1200PLC程序及组态仿真,电路图,IO表,说明书,博途15.1
- 基于Java的MyBatis 2023 ORM持久层框架设计源码
- 西门子1500PLC某大型物流中心分拣线程序案例 由18个远程IO模块和39个ST40CPU组态,多种线体分拣程序,使用大华扫
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功