搜档网
当前位置:搜档网 › unity3D学习之纯代码实现2048功能

unity3D学习之纯代码实现2048功能

unity3D学习之纯代码实现2048功能
unity3D学习之纯代码实现2048功能

由于这次的图集是本人自己抠出来,自动Slice后,最顶部会有一小块多余的像素,可以直接删除,也不用改名字,直接保存就好。

为了方便布局,这里给大家一个参数的设定,在导入设置里设定Pixels To Units 为132,后面脚本中的设置都基于这个数值

切完之后,把图集丢到Resources文件夹中,Resources文件夹在Unity里有特殊的作用,可以在脚本中通过Resources类进行访问,

接着拖出分别最后一张背景Sprite、倒数第二张方格Sprite,第一张卡片Sprite,将方格Sprite的排序层置于背景Sprite上层,而卡片Sprite置于方格Sprite上层。以此是卡片->方格->背景。

接着创建一个名为Card的脚本,什么都不用写,拖拽到卡片Sprite上。将方格Sprite和卡片Sprite做成预置,完成之后,在层次面板上删除这两个预置,OK,开始代码部分,

首先,我们要做好大的背景区域,通过脚本创建16个小方块格子,通过不精准的计算,得出第一个方格的起始点的位置应该是(-1.65,1.65),每个方格的间距是1.1,为了编写代码的方便,我们将这些数据存放在一个帮助类(HelpPosition)中,代码如下:

[code]csharpcode:

public static class HelpPosition {

public static readonly Vector2 BeginPos = new

Vector2(-1.65f,1.65f);

public const float OffsetX = 1.1f;

public const float OffsetY = 1.1f;

public static Vector2 GetPosVector2(int x, int y)

{

return new Vector2(BeginPos.x + y*OffsetX, BeginPos.y -

x*OffsetY);

}

}

方法GetPosVector2用于根据xy下标,返回该索引处的卡片的位置。文章来自【狗刨学习网】

做好帮助类之后,我们来实现对16个格子的布局,其实就是做一个潜逃循环,计算卡片的位置即可代码如下:

[code]csharpcode:

public GameObject foregrondSprite;//方格预置的引用

// Use this for initialization

void Awake ()

{

GameObject foregound= new GameObject("Foreground"); //创建

一个空游戏对象,用做方格的父对象

GameObject _clone;

Vector2 StartPos = HelpPosition.BeginPos;

float _offsetX = HelpPosition.OffsetX;

float _offsetY = HelpPosition.OffsetY;

for (int i = 0; i < 4; i++)

{

for (int j = 0; j < 4; j++)

{

Vector2 newPos =new Vector2(StartPos.x +

j*_offsetX,StartPos.y-i*_offsetY);

_clone = Instantiate(foregrondSprite, newPos,

Quaternion.identity)as GameObject;

_clone.transform.parent = foregound.transform;

}

}

}

需要注意的是,这里外层循环的x,是行数,y是列数,传递下标的时候,也按照这个顺序,第一个索引为行数,第二个索引为列数。完成之后拖拽脚本到背景Sprite上,运行游戏后棋盘格子就已经出来了。

接下来我们创建一个GameManager脚本,挂载到背景Sprite上,用于控制游戏的流程。成员字段如下:

[code]csharpcode:

public GameObject card;//对卡片Sprite的引用

private GameObject[,] cardList=new GameObject[4,4];//卡片

游戏对象数组对应棋盘格子

Vector2 StartPos = HelpPosition.BeginPos;

float _offsetX = HelpPosition.OffsetX;

float _offsetY = HelpPosition.OffsetY;

private int CardNum = 0;//对棋盘格子的卡片计数,满格后重新

开始游戏

Start中,生成两个卡片[CreateCard方法],Update中主要是相应键盘的操作[Movexx方法],实现如下:

[code]csharpcode:

void Start ()

{

CreatCard();

CreatCard();

}

// Update is called once per frame

void Update () {

if (Input.GetKeyDown(KeyCode.W))

{

MoveUp();

CreatCard();

}

if (Input.GetKeyDown(KeyCode.S))

{

MoveDown();

CreatCard();

}

if (Input.GetKeyDown(KeyCode.A))

{

MoveLeft();

CreatCard();

}

if (Input.GetKeyDown(KeyCode.D))

{

MoveRight();

CreatCard();

}

}

CreateCard的主要实现思路是,每次生成一个卡片时计算当前数组中的卡牌数,如大于等于16则游戏重置;否则随机生成坐标点,判断当前坐标处位置是否有卡片存在,知道找到空余位置,并实例化卡片对象,通过对时间的数学运算,调用Card类中的方法,生成2/4卡片。

[code]csharpcode:

void CreatCard()

{

//对棋盘格计数的控制

CardNum = 0;

foreach (var o in cardList)

{

if (o)

{

CardNum++;

}

}

if (CardNum >= 16)

{

ResetGame();

return;

}

//取当下空余空格的位置

int X_index,Y_index = 0;

do

{

X_index = Random.Range(0, 4);

Y_index = Random.Range(0, 4);

} while (cardList[X_index, Y_index]);

Vector2 newPos = HelpPosition.GetPosVector2(X_index,

Y_index);

//对2,4卡片的不同的生成

cardList[X_index, Y_index] = Instantiate(card, newPos,

Quaternion.identity) as GameObject;

if(Mathf.Abs(Mathf.Sin(Time.time))>.3f)

cardList[X_index,Y_index].GetComponent().Generate(0

);

else

cardList[X_index,

Y_index].GetComponent().Generate(1);

}

ResetGame方法的实现

[code]csharpcode:

private void ResetGame()

{

foreach (var o in cardList)

{

if(o!=null)

Destroy(o);

}

cardList=new GameObject[4,4];

}

剩下的,就是响应鼠标输入,移动卡片了,以向上移动为例,主要逻辑思路如下:

1 遍历卡片数组,寻找一个存在的卡片

2每寻找到一个存在的卡片,沿着移动方向上每一个格子做判断,看当前格子中是否有卡片,找到离自己最近的卡片做如下判断

如果最近的卡片与本身卡片数值一致,则做Card类中的(Merge方法)合并操作;

否则,则将卡片移到该格子的临近格子

---注意沿着移动方向,比如向上移动,则处于第四行的卡片向第三行,第二行,第一行依次查找遍历。

向上方向的代码实现如下:

[code]csharpcode:

void MoveUp()

{

for (int i = 1; i < 4; i++)

{

for (int j = 0; j < 4; j++)

{

if (cardList[i, j] != null) //当找到各自中的卡片后

{

GameObject temp = cardList[i, j]; //保留该卡片的引用

int x = i;

int y =j ;

bool isFind = false;//设置查找标志

while (!isFind)//沿着某个方向进行查找

{

x--; //---根据移动方向不同,这里的操作不一样

if (x<0||cardList[x, y])//当到了边界或者找到卡片后

{

isFind = true;

//做是否合并的判断

if (x >= 0&& cardList[i,

j].GetComponent()._currentIndex ==

cardList[x, y].GetComponent()._currentIndex)

{

//调用卡片Card类中的合并方法

cardList[x, y].GetComponent().Merge();

Destroy(cardList[i, j]);//移除原来的卡片

cardList[i, j] = null; //更新数组信息

}

else

{

cardList[i, j] = null;

cardList[x + 1, y] = temp;

cardList[x + 1, y].transform.position =

HelpPosition.GetPosVector2(x + 1, y);

}

}

}

}

}

}

}

根据上面的逻辑,完成四个方向上的操作即可,接下来完成的是Card类

card类中,通过对Resources文件夹中的Sprites进行读取,根据卡片的编号,更改SpriteRenderer,从而改变2 4 8 卡片的数值,同时也可以通过编号进行记分功能,成员字段如下:

[code]csharpcode:

public Sprite[] CardSprites;//读取图集中所有的切片

private string fileName = "Card_Sprite";

public int _currentIndex=0;//当前卡片的显示编号

在Awake方法里,对Sprites数组进行赋值

[code]csharpcode:

void Awake() {

CardSprites = Resources.LoadAll(fileName);

}

生成卡片时有个放大的动画,封装到一个方法ScaleSelf中[code]csharpcode:void ScaleSelf()

{ iTween.ScaleFrom(gameObject,Vector3.zero,.5f); }

生成卡片的方法及合并的方法,逻辑基本一致,改变_currentIndex,更改SpriteRenderer组件

[code]csharpcode:

public void Generate(int index)

{

ScaleSelf();

_currentIndex = index;

GetComponent().sprite =

CardSprites[_currentIndex];

}

public void Merge()

{

GetComponent().sprite =

CardSprites[++_currentIndex];

}

至此,2048小游戏的核心功能全部实现完毕~

《镜面反射和漫反射》进阶练习(一)

《镜面反射和漫反射》进阶练习 一、单选题 1.下列有关于光的说法中,不正确的是() A.紫外线有灭菌作用 B.雨后天空中的彩虹是光的反射现象 C.光在电影银幕上发生的是漫反射 D.配戴凸透镜可以矫正远视眼 2.夕阳西下,放学路上的小明突然发现不远处的楼房上有几块玻璃特别明亮刺眼,如图所示。产生这种现象的原因是() A.光的直线传播 B.光的反射 C.光的折 D.光的色散 3.下列关于光的现象,说法正确的是() A.汽车夜间行驶时车内不开灯,这主要是为了节约用电。 B.观察体温计所示的体温时,眼睛看到的水银柱是放大的实像。 C.人们看到水中鱼的位置,并不是鱼的实际位置。 D.黑板的“反光”现象是由于光的漫反射造成的 二、填空题 4.周末,小明和父母来到郑州“绿博园”踏春赏花,一家三口从不同角度观赏鲜花,是因为光在鲜花表面发生了______ ___(选填“漫反射”或“镜面反射”),远远的就可以闻到玉兰的花香,这种现象是_____ ____;站在公园里的人工湖旁边感觉比较凉,是因为水的______ ___较大。 5.花开苏城芳名远,春到相城美无边。阳春三月,相城油菜花盛开,吸引了无数游客。 ) (1) 游客漫步在花海中,穿行于河道间,田埂上“香气袭人知昼暖”,这是因为分子运动的剧烈程度与有关。 (2)高楼下“满城尽带黄金甲”,这是因为太阳光照射在油菜花上发生了 (选填“镜面反射”或“漫反射”)。 (3)蜜蜂在花丛中飞舞,以蜜蜂为参照物,花是的(选填“运动”或“静止”)

6.如图所示的日晷是通过观察直杆在阳光下影子的方位和长短来确定时间的,其中影子的形成可以用光的________来解释;课堂上,教室里各个位置的同学都能看到黑板上的字,这因为光在黑板上发生____ ____(选填“漫”或“镜面”)反射的缘故。 三、简答题 7.如图所示,雨后的夜晚,路上有些积水,甲、乙两同学在较暗的月光下,在路上相向而行.甲同学看到的现象是水面比路面亮,那么乙同学看到的现象是怎样的请你对乙同学看到的现象用学过的物理知识进行解释. 8.观察图中所示装置,手电筒照亮的透明胶片经过凸透镜在银幕上成像 9.(1)能从不同方向看到像,是由于光在银幕上发生了 ______ . 10.(2)利用这个成像原理可制成 ______ . 11.(3)如果保持胶片与银幕的位置不动,想在银幕上成一缩小的像.应将凸透镜 ______ (选填“靠近”或“远离”)银幕. 12. 13. 14. 15. 16.

镜面反射与漫反射

镜面反射与漫反射 对于漫反射,学生理解起来比较困难,建议首先通过实验观察,让学生感性理解镜面反射和漫反射;然后通过作图分析,理解镜面反射和漫反射的成因。 教学时,教师可就地取材实行实验,如把平面镜放在从窗口(或门口)射进来的太阳光下,反射光照在天花板上,形成一个明亮的光斑;然后随手将一张白纸放在阳光下,让学生观察天花板上是否还有反射光斑。观察后问学生:此时还有反射光吗?反射光哪儿去了?(既然每位同学都看到了这张纸,说明反射光进入了大家的眼中,反射光射向了四面八方。)也能够做做下面的趣味实验:准备几张编织稀疏水准不同的纱布,一面大镜子,一个投影仪。演示时先将镜子放在教室前面,镜面稍微向着教室的天花板倾斜,然后在镜面上铺几层纱布,用投影仪把一幅漂亮的向日葵画投影到纱布上,因为纱布表面粗糙,发生的是漫反射,所以教室里各个角落的同学都能看见,而且画面很清晰。接着把纱布一层一层地取下来,原来清晰的向日葵不再清晰,变得越来越模糊,当把最后一层纱布取下来后,整个向日葵都不见了(如图3.2-3所示)。 图3.2-3 咦!这是怎么回事呢?“向日葵”跑到哪里去了呢?当学生纳闷儿时,教师指向天花板,学生发现刚才纱布上的向日葵跑到天花板上去了。接着教师将取下的纱布又一张一张地放回镜面上,结果向日葵又出现在纱布上,而且越来越清晰。学生非常兴奋和好奇,急切地想知道原因。 在上述实验的基础上,教师使用光路图说明镜面反射和漫反射。能够参考教材图3-15和图3-16所示的光路图,制作多媒体动画课件:画面先出现两种不同的反射面,再依次播放出每一条光线的反射过程。播放完毕,让学生比较镜面反射和漫反射的异同点;并回扣上面的实验,让学生解释其中的原因。 最后,能够让学生列举生活和生产中应用镜面反射和漫反射的实例,或播放一些相关的录像资料,以丰富学生的理解。 光反射的应用 本部分教材意在对学生实行STS教育,丰富学生对光的反射的理解。教学时不必拘泥于教材,要开放课堂空间,能够让学生课后通过互联网或查阅图书报刊等获取信息,广泛收集相关资料;能联系当地实际实行教学效果更好,如让学生在自己社区、市区和学校附近展开调查,用鲜活的事例来说明光反射的应用和光污染的危害及防止。建议学生把收集的资料制成课件,或拍摄成录像、照片等,在课堂上或校园网上发布交流。 4.教学评价 ●课堂测评 1.在探究光的反射定律时,你是如何发现“反射光线跟入射光线、法线在同一平面内”的?

人教版八年级物理第四章第二节光的反射(镜面反射和漫反射)习题

人教版八年级物理第四章光现象第二节光的反射习题(无答案) (镜面反射和漫反射) 知识点一光路的可逆性 1.光发生反射时,光路是______的,这就是说,若让光沿原来的反射光线的上的方向入射到镜面上,反射光线将沿原来入射光线的方向射出 对应训练 2.已知小明和小刚的视力都很好.在明亮的环境中,小明能从一面镜子中看使到小刚的眼睛,小刚能否从镜子中看到小明的眼睛() A一定能 B.不能 C.可能会 D.以上说法均错 知识点二镜面反射和漫反射 1.镜面反射:一束平行光照射到物体的光滑表面,如镜面或平静的水面,其反射光束仍然是______的,这种反 射叫______射,如图甲所示 2.漫反射:一般,物体表面往往是凹凸不平的,平行光入射后,反射光线______而是射向各个方向,这种反射就是漫反射.如图乙所示 对应训练 反射分为______反射和______反射两种,两种反射都遵循光的反射定律.我们能从各个方向看到一些本身不发光的物体,是因为光在这些物体表面发生______的缘故 4.我们能从各个方向看到校园里盛开的鲜花,这是由于鲜花的表面 A.发生了镜面反射 B.发生了漫反射 C.在发光,是光源 D.既有漫反射又有镜面反射 知识检测 1.我们走在大街上,感觉到强烈的阳光被大厦的玻璃幕墙反射到我们的眼睛,这属于______反射;我们可以从不同角度欣赏同一件艺术品这属于______反射,.(填“漫”或“镜面”) 2.光明是人们祈求的,但有时光也会损害人的视觉和身心健康,成为光污染下列现象中会造成光污染的是( ) 3.关于镜面反射和漫反射,下面说法中不正确的是( ) A.无论是镜面反射还是漫反射,对应一条入射光线,只有一条反射光线 B.镜面反射的每一条光线都遵循光的反射定律 C.漫反射中有些光线不遵循光的反射定律 D.入射光线彼此平行时,漫反射后的反射光线彼此不平行 4.如图所示,相邻两室,一明一暗在两室之间有一平面镜M∠AOC=∠BOC,甲、乙两人分别站在A、B两点,面向平面镜张望,则() A.甲可以看到乙,但乙看不到甲

《镜面反射与漫反射》教案

教案设计 课题:《镜面反射与漫反射》 授课教师:刘小宁 教材:初中物理八年级上册第四章第二节(光的反射) 一、教学目标 1.掌握镜面反射与漫反射的定义及特征 2.理解镜面反射与漫反射的光路图成因 3.正确区分生活中的镜面反射、漫反射 4.培养学生合作解决问题的过程 二、重难点 重点:掌握镜面反射与漫反射的定义及特征,正确区分生活中的镜面反射、漫反射 难点:让学生感性认识镜面反射与漫反射 三、教学方法 启发诱导法、问答法、讲授法、读书指导法、实验法、练习法、讨论法四、教具 平面镜、白纸 五、教学过程 (一)导入新课:通过学生在生活中经常拿平面镜照射同学的眼睛生活小事,引起学生对本节课的积极兴趣。 (二)讲授新课 1.通过做太阳光在平面镜上、太阳光在白纸上发生的实验,让学生让 学生感性认识镜面反射与漫反射。 2.接着带领学生一起画出镜面反射与漫反射的光路图,强调指出镜面 反射和漫反射的每条光线均遵循反射定律。 3.在此基础上给出学生镜面反射与漫反射的定义及特征。 4.列举出生活中的一些具有镜面反射或漫反射应用的事物,让同学以 小组的形式进行讨论判断。 (三)总结 1.镜面反射与漫反射的定义 2.镜面反射与漫反射的特征 3.镜面反射与漫反射的应用 (四)作业 1.关于光的漫反射,下列说法中正确的是( ) A.光发生漫反射时,反射光线射向各个方向,不遵守光的反射定律 B.光发生漫反射时,遵守光的反射定律 C.我们能够从不同方向看见黑板上的字迹,这说明光发生了镜面反射 D.漫反射和镜面反射二者没有区别 2.在图2中准确画出所给入射光线经两平面镜反射 的反射光线。 3.电影屏幕为什么做成表面粗糙的平面? 图2

八年级物理《镜面反射和漫反射的区分》练习题

八年级物理《镜面反射和漫反射的区分》练习题 1. 下列有关光现象的说法中正确的是() A.光垂直照射在平面镜上,入射角是90° B.镜面反射与漫反射都遵循光的反射定律 C.光发生镜面反射光路可逆,发生漫反射时光路不可逆 D.光在同一种介质中一定沿直线传播 2. 晚上,在桌面上铺一张白纸,把一块小平面镜平放在纸上,让手电筒的光正对着平面镜照射,如图所示,从侧面看去,是() A.白纸和平面镜都较亮 B.白纸和平面镜都较暗 C.白纸被照亮而平面镜较暗 D.平面镜被照亮而白纸较暗 3. 下列说法中正确的是() A.光的传播速度总是3×108m/s B.光总是沿直线传播的 C.物体经平面镜成正立等大的实像 D.漫反射遵循光的反射定律 4. 教室里坐在不同位置上的同学都能看到黑板上的粉笔字,主要原因是由于光的() A.直线传播 B.镜面反射 C.折射 D.漫反射 5. 下列有关光的现象中,说法正确的是() A.色光的混合规律与颜料的混合规律相同 B.能从不同方向看清物体是因为发生了镜面反射 C.要使投影仪清晰成像在更远的屏幕上,投影仪的镜头要距投影片更近一些 D.近视眼是将像成在了视网膜的后面,应该配戴凹透镜来校正 6. 雨后天晴的夜晚,为了不踩到地上的积水,下列判断中正确的是(________) A.迎着月光走,地上暗处是水,背着月光走发亮处是水 B.迎着月光走,地上发亮处是水,背着月光走地上暗处是水 C.迎着月光或背着月光走,都应是地上发亮处是水 D.迎着月光或背着月光走,都应是地上暗处是水. 7. 下列关于光现象的说法正确的是()

A.光发生漫反射时,仍遵守光的反射定律 B.光从空气射入水中,传播速度不变 C.月食是因为光的反射而形成的 D.平面镜可以成实像 8. 关于实像和虚像的说法正确的是() A.虚像是人的幻觉,并没有光线进入人眼 B.实像能用光屏接收,虚像则不能 C.实像一定是光的折射形成的,虚像一定是光的反射形成的 D.实像有放大的也有缩小的,虚像一定是放大的 9. 下列说法中正确的是() A.小芳面向穿衣镜,当她远离平面镜后退1m,镜中的像将变小 B.小明在平静的水面上看到“云在水中飘”,这是云在水中形成的虚像 C.雨后晴朗的夜晚,当你迎着月光走,为了不踩到积水,应走“较暗”的地方 D.你在一块平面镜中看到了另一同学的眼睛,如果这个平面镜很小,这位同学不会从镜中看到你的眼睛 10. 皮鞋擦上油后,还要用软布擦几下,越擦越亮,这是由于() A.反复擦可以增加漫反射效果 B.鞋油的颜色好,所以越擦越亮 C.鞋油比皮革亮,所以越擦越亮 D.反复擦可以使鞋油填充皮革凹坑,增加表面光滑程度,增加镜面反射效果 11. 下面说法不正确的是() A.镜面反射遵从光的反射定律 B.平行光束经平面镜反射后,仍然是平行光束 C.漫反射不遵从反射定律 D.漫反射中入射的平行光束经反射后,不再是平行光束 12. 关于镜面反射和漫反射说法正确的是() A.镜面反射遵守反射定律,而漫反射不遵守 B.镜面反射不遵守反射定律,而漫反射遵守 C.镜面反射和漫反射都不遵守反射定律 D.镜面反射和漫反射都遵守反射定律 13. 雨后的夜晚,月亮非常明亮,路上出现了一个个小水坑,我们走在路上时,如果我们迎着月光走________处应该是水坑(选填“亮”或“暗”),此时发生的是________(填“镜面反射”或“漫反射”). 14. 在学校走廊里挂着一块平面镜,某同学们走近镜子时,他在镜中像的大小________

镜面反射与漫反射

镜面反射与漫反射 一、基础知识 1.人看物体的条件:物体发光或反射光,物体发的光或反射的光线能进入人的眼睛.2.平行光射向平而光滑的反射面,反射光线平行射出,这种反射是镜面反射;平行光射向凹凸不平的反射面,反射光线射向四面八方,这种反射是漫反射. 3.人感觉物体的亮暗,关键是进入眼睛的光的多少,进入眼睛的光多就感觉亮,进入眼睛的光少就感觉暗. 4.无论是镜面反射还是漫反射都遵循光的反射定律,正确区分镜面反射和漫反射. 5.不要误以为镜面反射就一定亮,漫反射就一定暗,感觉亮暗关键是看进入眼睛的光的多少. 镜面反射后的光线平行射出,正好处在这一方向上时,获得的光线很强,其他方向上几乎没有反射光线,感觉很暗。 6.漫反射时反射光线射向各个方向,所以我们能从各个不同方向看到物体. 7.黑板“反光”就是因为黑板发生了镜面反射的缘故; 二、强化练习 1.(2012?天津)雨后的夜晚,当你迎着月光行走在有积水的路上,为了避让水洼,应走“较暗”的地面.这是因为光在() A.地面发生镜面反射B.地面发生漫反射 C.水面发生漫反射D.水面不发生反射 2.(2012?赤峰)下列光现象中,属于镜面反射的是() A.在不同方向都能看见点燃的蜡烛火焰 B.太阳光照在地面的玻璃片上形成刺眼的光束 C.人在船上看见水中的鱼 D.全班同学都能看见教师黑板上的字迹 3.(2008?自贡)目前光污染越来越严重,其中白色污染是最普遍的一类光污染.建筑物的玻璃幕墙、釉面砖墙、磨光大理石等都能造成白色污染,形成白色污染的主要原因是()A.光沿直线传播B.光的折射C.光的色散D.光的反射 4.(2012?齐齐哈尔)教室内用来放映投影片的银幕,表面是白色且粗糙的,其目的是()A.不反射光B.能折射光 C.发生漫反射D.发生镜面发射 5.(2010?湘潭)如图所示,在暗室中用手电筒照射挂在白色温墙上的小镜子,这时看到被照射部分() A.墙和镜子都是黑色的 B.墙和镜子都是白色的 C.墙是黑色的,镜子是白色的 D.墙是白色的,镜子是黑色的

相关主题