Unity中OnGUI绘制贪吃蛇

Square.cs : public class Square : MonoBehaviour
{
public int row, col;
public Rect rect;
public Texture texture; /// <summary>
/// 1向上 2向右 3向下 4向左
/// </summary>
public int nextDir = ; /// <summary>
/// 0背景 1蛇身 2食物
/// </summary>
public int state = ; public Square() { } public Square(int row, int col, Rect rect, Texture texture)
{
this.row = row;
this.col = col;
this.rect = rect;
this.texture = texture;
}
} SnakeEating.cs: public class SnakeEating : MonoBehaviour
{
public int row, col;//行数和列数
public Texture black, white, yellow;//三种背景图 public float speed = 0.5f;//移动的时间间隔 秒 private Square[][] Squares;//二维数组
private bool isGameOver = true;//游戏状态 List<Square> snake;//蛇的节点集合 void Start()
{
StartGame();
} /// <summary>
/// 开始游戏
/// </summary>
void StartGame()
{
int w = (Screen.height / row);//由于一般屏幕宽度大于高度,所以用高度除以行数得出每一个方块的边长
int x = (Screen.width / - (w * col) / );//设置整体的方块的x轴居中
int y = (Screen.height / - (w * row) / );//设置整体的方块的Y轴居中 Squares = new Square[row][];//初始化二维数组 Rect tempRect = new Rect(x, y, w, w);//初始化第一个方块的位置和大小
for (int i = ; i < row; i++)
{
Squares[i] = new Square[col];//实例化一行数组
for (int j = ; j < col; j++)
{
Squares[i][j] = new Square(i, j, tempRect, black);//实例化一个节点
tempRect.x += w;//x轴加上一个方块的宽度
}
tempRect.x = x;//x轴回到最左边
tempRect.y += w;//y轴加上一个方块的宽度到达下一行
} snake = new List<Square>();//初始化蛇的集合
Square head = Squares[(int)row / ][(int)col / ];//设置头结点为正中央的一个方块
head.texture = white;//白色
head.state = ;//蛇身
head.nextDir = Random.Range(, );//随机给出前进的方向
snake.Add(head);//添加到集合 isGameOver = false;//游戏没有结束 StartCoroutine("snakeMove");//启动协同程序
} IEnumerator snakeMove()
{
SetFood();
while (!isGameOver)
{
Square head = snake[];//获取头结点
int newRow = head.row, newCol = head.col;//获取头结点的行列下标
switch (snake[].nextDir)//根据头结点的方向找到下一个节点的下标
{
case :
newRow -= ;
break;
case :
newCol += ;
break;
case :
newRow += ;
break;
case :
newCol -= ;
break;
} //如果下一个节点的下标超出了二维数组的边界则游戏结束
if (newRow < || newRow >= row || newCol < || newCol >= col)
{
isGameOver = true;
break;
}
else if (Squares[newRow][newCol].state == )//如果下一个节点是蛇身则说明吃到自己了,因此游戏结束
{
isGameOver = true;
break;
}
else
{
snake.Insert(, Squares[newRow][newCol]);//将下一个节点加入集合的开头
snake[].texture = white;//设置它的颜色
snake[].nextDir = head.nextDir;//设置方向为上一个头结点的方向
if (snake[].state != )//如果新的头结点不是是食物则将最后一个节点设置为黑色,状态为0(空白),从列表中移除
{
Square end = snake[snake.Count - ];
end.texture = black;
end.state = ;
snake.RemoveAt(snake.Count - );
}
else
{
SetFood();//如果是食物则重新设置一个食物
}
snake[].state = ;//设置头结点的状态为1(蛇身)
} yield return new WaitForSeconds(speed);//等待speed秒
speed -= Time.deltaTime / ;//缩短移动的时间提高速度
}
} /// <summary>
/// 布置食物
/// 找到一个随机行列的上的节点
/// 判断结点如果不是的state(0空白,1蛇身,2食物)不是0则继续随机选择行列
/// 设置找到的节点的state为2,颜色设置为黄色
/// </summary>
public void SetFood()
{
int foodRow = Random.Range(, row);
int foodCol = Random.Range(, col); while (Squares[foodRow][foodCol].state != )
{
foodRow = Random.Range(, row);
foodCol = Random.Range(, col);
} Squares[foodRow][foodCol].state = ;//蛇身
Squares[foodRow][foodCol].texture = yellow;//黄颜色
} void Update()
{
if (!isGameOver)
{
if (Input.GetKeyDown(KeyCode.UpArrow))
{
if (snake.Count > )
{
if (snake[].row == snake[].row - && snake[].col == snake[].col)//判断用于防止反方向行走
return;
}
snake[].nextDir = ;//设置头结点的下一个方向 1上 2右 3下 4左
}
if (Input.GetKeyDown(KeyCode.RightArrow))
{
if (snake.Count > )
{
if (snake[].col == snake[].col + && snake[].row == snake[].row)
return;
}
snake[].nextDir = ;
}
if (Input.GetKeyDown(KeyCode.DownArrow))
{
if (snake.Count > )
{
if (snake[].row == snake[].row + && snake[].col == snake[].col)
return;
}
snake[].nextDir = ;
}
if (Input.GetKeyDown(KeyCode.LeftArrow))
{
if (snake.Count > )
{
if (snake[].col == snake[].col - && snake[].row == snake[].row)
return;
}
snake[].nextDir = ;
}
}
} void OnGUI()
{
if (!isGameOver)
{
//绘制二维数组中每一项
for (int i = ; i < row; i++)
{
for (int j = ; j < col; j++)
{
Square square = Squares[i][j];
GUI.DrawTexture(square.rect, square.texture);
}
}
}
}
}

Unity中OnGUI绘制贪吃蛇的更多相关文章
- 关于Unity中OnGUI()的简单使用
有时候想要输出一些数据到屏幕上方便查看,新建一个UI对象又挺麻烦,用OnGUI()在屏幕上直接绘制UI比较方便. GUI.Label(, , , ), “aaa", style); 这条语句 ...
- Unity中动态绘制圆柱体
问题背景 上次写了动态绘制立方体,这最近又来了新功能,绘制圆柱(风筒),要求是给了很多节点,根据节点去动态绘制风筒,风筒就是圆柱连接而成的,可以理解为管道,还有就是拐角处注意倒角,圆润过度过来. 实现 ...
- Unity经典游戏教程之:贪吃蛇
版权声明: 本文原创发布于博客园"优梦创客"的博客空间(网址:http://www.cnblogs.com/raymondking123/)以及微信公众号"优梦创客&qu ...
- python贪吃蛇
代码地址如下:http://www.demodashi.com/demo/13335.html 一.先展示python贪吃蛇效果 二.操作说明 按键 功能 UP 向上移动 DOWN 向下移动 LEFT ...
- C项目实践--贪吃蛇(1)
1.功能需求分析 1.1主要功能 i.游戏欢迎界面 ii.游戏执行功能,包括计算得分 iii.游戏结束界面 1.2游戏基本规则 游戏开始时蛇的长度是4个单位,并且按照当前方向不停地移动.移动范围是CO ...
- 用Python实现童年小游戏贪吃蛇
贪吃蛇作为一款经典小游戏,早在 1976 年就面世了,我最早接触它还是在家长的诺基亚手机中.
- python写一个能变身电光耗子的贪吃蛇
python写一个不同的贪吃蛇 写这篇文章是因为最近课太多,没有精力去挖洞,记录一下学习中的收获,python那么好玩就写一个大一没有完成的贪吃蛇(主要还是跟课程有关o(╥﹏╥)o,课太多好烦) 第一 ...
- AI贪吃蛇(二)
前言 之前写过一篇关于贪吃蛇AI的博客,当时虽然取得了一些成果,但是也存在许多问题,所以最近又花了三天时间重新思考了一下.以下是之前博客存在的一些问题: 策略不对,只要存在找不到尾巴的情况就可能失败, ...
- 是男人就下100层【第四层】——Crazy贪吃蛇(2)
在上一篇<是男人就下100层[第四层]--Crazy贪吃蛇(1)>中我们让贪吃蛇移动了起来,接下来我们来实现让贪吃蛇能够绕着手机屏幕边线移动而且能够改变方向 一.加入状态并改动代码 首先我 ...
随机推荐
- Android(java)学习笔记221:开发一个多界面的应用程序之不同界面间互相传递数据(短信助手案例)
1.首先我们看看下面这个需求: 这里我们在A界面上,点击这个按钮"选择要发送的短信",开启B界面上获取网络上各种短信祝福语,然后B界面会把这些网络祝福语短信发送给A界面到" ...
- SpringMVC10数据验证
/** * @NotBlank 作用在String * @NotEmpty 作用在集合上 * @NotNull 作用在基本数据类型上 * */ public class User { @NotNull ...
- noip 2012 国王游戏(贪心+高精)
/* 我是不会说我考试的时候想到了正解却把金币取大看成金币求和的.... 觉得只按左右手乘积排序不太对 有反例 也可能我反例放到这个题里是错的吧 按自己的理解排的序 就是各种讨论... 假设 第i个人 ...
- win7 打开方式不能添加程序
打开注册表,找到“HKEY_CLASSES_ROOT\Applications\”中,查看相应的程序的“\shell\open\command”项中的数据是否正确:如果不正确,就修改正确,之后再添加程 ...
- sql - Invalid object name 'dbo.in$'
这是我从excel导入的表,用查询的时候,不加前面部分的'dbo',能查出来,好像是owner的原因吧.
- sql plus 和 pl/sql无法连接远程oracle数据库
前言:安装完oracle客户端后,可能会出现sql plus 和 pl/sql无法连接远程oracle数据库的情况,可能是以下原因: 针对sql plus连接不上: 1 可能原因:之前安装过oracl ...
- Xcode6中如何修改文件中自动创建的Created by和Copyright
转自: http://blog.csdn.net/bjourney/article/details/46832159 在Xcode6创建问的时候,会自动生成注释 // Created byxxx o ...
- DOM中的node与element的区别
先看document的两个常见method. document.createTextNode Constructor: Text document.createElement Constructor: ...
- SpringMVC介绍之约定优于配置
SpringMVC介绍之约定优于配置 所谓的约定优于配置就是指在程序开发过程中我们约定好一些规则可以使我们更少的进行配置和代码编写.就这么简单的一句话可能你还不是很懂什么是约定优于配置,没关系,看完后 ...
- 几种常见ECG数据格式及对比
SCP.DICOM.HL7aECG.GDF格式及对比 本文档首先给出SCP.DICOM.HL7aECG.GDF四种心电信号格式的具体数据结构,然后分析其各自的特点及适用范围. 一.SCP-ECG fo ...