u3d_小游戏_拼图_1_生成碎片(非随机)
http://blog.csdn.net/cube454517408/article/details/7907247 首先是参考此文;
main.cs作用:1.大图的拆分
2.判断是否成功
3.对碎片随机分配位置
4.按键的响应
pain.cs:针对每一个小plane,1.响应鼠标的拖拽
2.判断是否到达目的地
本文为第一步:大图拆分成多个碎片,让background的宽x占屏幕1/4
正交投影下:
怎么拆分成多个plane?
1.纹理的裁剪(以左下角为坐标原点)--->2.裁剪的纹理scale缩放;以此局部texture匹配整个plane大小----->plane缩小
怎么让plane的x长占屏幕固定比例?
1、首先,在正交投影下,渲染屏幕的宽是由camera的size决定的;
2、那么我们只要获取plane的size;然后通过plane的scale来缩放即可;也即一个比例关系求出scale;(本次只考虑plane的长宽相等情况)
怎么让plane移动到右侧,靠着右侧边缘?
1、渲染屏幕的长度L为:camera的size乘以2再乘以W/H宽高比;camera的size为width的一半
2、那么BackPlane的中心点向右移动的坐标为:L/2-plane.size.x*scale.x/2
结果如下:


如上图:验证拆分成功。
疑问:一直不知道初始设置的1280X720怎么获取,文档里screen.width获取的是current resolution运行时分辨率。
以下为代码:
using UnityEngine;
using System.Collections;
using UnityEditor;
/******************************
* main
* 1.切图,分割,
* 2.移位到最右侧
*
* /
*/
public class main : MonoBehaviour
{
public GameObject mPlane;
public GameObject mPlaneParent;
public GameObject mBackGround;
private GameObject[] mPlaneAll;
public Vector3[] mtestPos; //测试拆分用;
public int mXNums;//水平线的个数;最少为两个;共有(mXNums-1)*(mYNums-1)张碎片
public int mYNums;//竖直线的个数;
public int mPlaneRatio = 4;//水平比例为1/4
private Vector2 mBlock;
private Vector2 mTextureBlock;
private float mPicLength;
private Vector2 mLeftTopCood;
public void Awake()
{
Screen.fullScreen = !Screen.fullScreen;
}
//本次只考虑plane长宽相等的情况
// Use this for initialization
void Start()
{
float planeX = mBackGround.GetComponent<MeshFilter>().mesh.bounds.size.x;
float planeY = mBackGround.GetComponent<MeshFilter>().mesh.bounds.size.y;
float planeZ = mBackGround.GetComponent<MeshFilter>().mesh.bounds.size.z;
Debug.Log("x:" + planeX + "y:" + planeY + "z:" + planeZ);
float W = Screen.width;
float H = Screen.height;
float C = Camera.main.orthographicSize;
Debug.Log("orthographicSize:" + C);
float M = mPlaneRatio;
float P = planeX;
float mScale = (W / H) * 2 * (C / M) / P;
Debug.Log("scale:" + mScale);
mBackGround.transform.localScale = new Vector3(mScale, 1.0f, mScale);
mPicLength = mBackGround.transform.localScale.x;
mBlock.x = mPicLength / (mXNums - 1);
mBlock.y = mPicLength / (mYNums - 1);
mTextureBlock.x = 1.0f / (mXNums - 1);
mTextureBlock.y = 1.0f / (mYNums - 1);
float W_long = C*W/H;
float new_x = W_long - planeX*mScale/(2.0f);
mBackGround.transform.localPosition = new Vector3(new_x, mBackGround.transform.localPosition.y, mBackGround.transform.localPosition.z);
}
void OnGUI()
{
if (GUI.Button(new Rect(10, 10, 100, 30), "拆分"))
{
Split();
}
}
void Split()//1.生成(mXNums-1)*(mYNums-1)张碎片; 2.随机分配位置 3.每张碎片不重叠
{
mPlaneAll = new GameObject[(mXNums - 1) * (mYNums - 1)];
int k = 0;
for (int i = 0; i < mXNums - 1; i++)//X轴的分割
{
for (int j = 0; j < mYNums - 1; j++)
{
mPlaneAll[k] = (GameObject)Instantiate(mPlane);
mPlaneAll[k].name = "plane" + k;
mPlaneAll[k].transform.parent = mPlaneParent.transform;
mPlaneAll[k].transform.localScale = new Vector3(mBlock.x, 1, mBlock.y);//使每个plane缩小到一个碎片的大小;注意Plane经过旋转后,scale坐标系发生了变化;
//计算纹理的偏移offset(把中心点移位到左下角,依照LeftTop进行每块纹理坐标的获取)
float offset_x = mTextureBlock.x * i;//按照网格的“每一列”算
float offset_y = 1.0f - mTextureBlock.y * (j + 1); //纹理的偏移和外界的变化无关,只和:拆分的程度有关。
//scaleTexture纹理缩小的比例
float scale_x = mTextureBlock.x;
float scale_y = mTextureBlock.y;
mPlaneAll[k].renderer.material.mainTextureOffset = new Vector2(offset_x, offset_y);
mPlaneAll[k].renderer.material.mainTextureScale = new Vector2(scale_x, scale_y);
mPlaneAll[k].SetActive(true);
k++;//planeAll数组中:第一列从上到下的碎片,第二列......最后一列
}
}
for (int i = 0; i < (mXNums - 1) * (mYNums - 1); i++)
{
mPlaneAll[i].transform.localPosition = new Vector3(mtestPos[i].x, mtestPos[i].y, 0.0f);
}
}
// Update is called once per frame
void Update()
{
}
}
接下来做一下碎片的随机分配。
u3d_小游戏_拼图_1_生成碎片(非随机)的更多相关文章
- JS小游戏-蓝色拼图
// a[href=#viewSource]"); //查看源代码标签 viewSourceArr.attr("title", "查看源代码"); v ...
- C语言-纸牌计算24点小游戏
C语言实现纸牌计算24点小游戏 利用系统时间设定随机种子生成4个随机数,并对4个数字之间的运算次序以及运算符号进行枚举,从而计算判断是否能得出24,以达到程序目的.程序主要功能已完成,目前还有部分细节 ...
- 例子:js超级玛丽小游戏
韩顺平_轻松搞定网页设计(html+css+javascript)_第34讲_js超级玛丽小游戏_学习笔记_源代码图解_PPT文档整理 采用面向对象思想设计超级马里奥游戏人物(示意图) 怎么用通过按键 ...
- 常用Java API之Ramdom--用代码模拟猜数小游戏
常用Java API之Ramdom Ramdom类用来生成随机数字.使用起来也是三个步骤: 1.导包 import java.util.Random; 2.创建 Random r = new Rand ...
- JavaScript版拼图小游戏
慕课网上准备开个新的jQuery教程,花了3天空闲时间写了一个Javascript版的拼图小游戏,作为新教程配套的分析案例 拼图游戏网上有不少的实现案例了,但是此源码是我自己的实现,所以不做太多的比较 ...
- canvas drag 实现拖拽拼图小游戏
博主一直心心念念想做一个小游戏- 前端时间终于做了一个小游戏,直到现在才来总结,哈哈- 以后要勤奋点更新博客! 实现原理 1.如何切图? 用之前的方法就是使用photoshop将图片切成相应大小的图 ...
- 拼图小游戏之计算后样式与CSS动画的冲突
先说结论: 前几天写了几个非常简单的移动端小游戏,其中一个拼图游戏让我郁闷了一段时间.因为要获取每张图片的位置,用`<style>`标签写的样式,直接获取计算后样式再用来交换位置,结果就悲 ...
- [deviceone开发]-拼图小游戏
一.简介 九宫格小游戏,可从本地图库载入一张图片,填充到9个ImageView,另涉及Timer计时.图库控件. 每个格子都是相同的控件,动态添加到首页中的,在初始化后,响应touch事件,之后通过多 ...
- 使用NGUI实现拖拽功能(拼图小游戏)
上一次用UGUI实现了拼图小游戏,这次,我们来用NGUI来实现 实现原理 NGUI中提供了拖拽的基类UIDragDropItem,所以我们要做的就是在要拖拽的图片上加一个继承于该类的脚本,并实现其中的 ...
随机推荐
- Angular JS | Closure | Google Web Toolkit | Dart | Polymer 概要汇集
AngularJS | Closure | Google Web Toolkit | Dart | Polymer GWT https://code.google.com/p/google-web-t ...
- WAMP集成环境的安装
暑假已经正式开始,我的学习计划也开始有了初步的进展,今天学习的主要内容是PHP的基础知识,以及在电脑上面安装了集成的WAMP(Windows+Apache+MySQL+PHP). PHP的基础知识: ...
- java 中 return 的两种常见的用法
一:return语句总是用在方法中,有两个作用: 一个是返回方法指定类型的值(这个值总是确定的), 一个是结束方法的执行(仅仅一个return语句). 二:实例1 -- 返回一个String priv ...
- 论使用LeanCloud中遇到的坑
1.短信验证码 当注册用户的时候,会发现收不到短信验证码,打印e : That operation isn't allowed for clients. 含义 - 该操作无法从客户端发起.请检查该错误 ...
- UWP开发中两种网络图片缓存方法
通常情况下,我们的程序需要从服务器读取图片,但如果需要不止一次读取某一张图片的话,就需要做本地缓存了,这样既为用户省一点流量,又能显得你的APP很快. 假如你已经知道了某一张图片的地址,那么第一件事就 ...
- linux 系统权限 数字含义
摘抄: sudo chmod XXX dir_name XXX是你要设置的权限代号,第一位代表Owner,第二位代表Group,第三位代表Others XXX中0代表什么都不可以,1代表可执行,2代表 ...
- Android App监听软键盘按键的三种方式与改变软键盘右下角确定键样式
actionNone : 回车键,按下后光标到下一行actionGo : Go,actionSearch : 放大镜actionSend : SendactionNext : NextactionDo ...
- UIscrollView和UIPageControl的循环滚动
因为昨天在网上找了很久,很多只能实现向右滚动,而且一张图一个imageview ,感觉工作量很可怕啊 , 下面的例子就是不论你多少图 , 只和我代码里面的几个数值有关, 只需要修改分页和循环i的最 ...
- 使用 PHPMailer 发送邮件
转载 http://blog.csdn.net/liruxing1715/article/details/7914974 PHPMailer 的官方网站:http://phpmailer.worxwa ...
- symfony2 路由工作原理及配置
1.路由是程序的方法和URL的一一映射.