第二十三节 实现左右移动方块
2019-06-25 本文已影响0人
安静的程序员
01.监测按键
因为键盘什么时候按下是不确定的,所以必须要实时监测是否按下了键盘,而Unity中的Update()方法就是实时调用的,所以凡是与按键有关的逻辑都应写在该方法中。
现在,来添加一行代码,当按下键盘上的左方向键时,输出“按下左方向键”:
if (Input.GetKeyDown(KeyCode.LeftArrow)) Debug.Log("按下左方向键");
运行游戏后,按下左方向键,会输出“按下左方向键”。
02.实现左移和右移
添加一个方法MoveLeftBlock(),左移的原理就是图层的横坐标(列)向左移动一格:
// 左移方块
void MoveLeftBlock()
{
MyPoint newPoint = _blockLayer.Point;
newPoint._list -= 1;
_blockLayer.Point = newPoint;
_screenMain.RefreshScreen();
}
右移的方法也一样:
// 右移方块
void MoveRightBlock()
{
MyPoint newPoint = _blockLayer.Point;
newPoint._list += 1;
_blockLayer.Point = newPoint;
_screenMain.RefreshScreen();
}
然后在按键事件中调用左移和右移:
void Update()
{
// 左移方块
if (Input.GetKeyDown(KeyCode.LeftArrow)) MoveLeft-Block();
// 右移方块
if (Input.GetKeyDown(KeyCode.RightArrow)) MoveRightBlock();
}
运行游戏后,按下左右方向键后,方块会左右移动,但只能移动一次,因为GetKeyDown()只在你每次按下时有效。键盘监测有三个方法:GetKeyDown()——按键按下;GetKey()——按着不放;GetKeyUp()——按键松开。
03.连续移动
将GetKeyDown()改成GetKey()就可以实现连续移动,只是太快了,如果按照60帧每秒算的话,一秒钟可以移动60个格子,显然我不想要这种连续移动。
我想要的连续移动是:按下左方向键后,立即向左移动一格,如果左方向键在一定时间内没有松开,就继续向左一格一格匀速移动。同时,左右方向键不能冲突,就是同时只能朝一个方向移动。
实现方案非常简单,就是按下按键后,启动定时器,松开后不需要移动了,就关闭定时器。然后,在切换方向时,先关闭上一个方向的定时器。下面是代码:
void Update()
{
// 按键 - 左方向键
if (Input.GetKeyDown(KeyCode.LeftArrow))
{
// 立即向左移动一格
MoveLeftBlock();
// 取消右移
CancelInvoke("MoveRightBlock");
InvokeRepeating("MoveLeftBlock", 0.3f, 0.1f);
}
if (Input.GetKeyUp(KeyCode.LeftArrow))
{
CancelInvoke("MoveLeftBlock");
}
// 按键 - 右方向键
if (Input.GetKeyDown(KeyCode.RightArrow))
{
// 立即向右移动一格
MoveRightBlock();
// 取消左移
CancelInvoke("MoveLeftBlock");
InvokeRepeating("MoveRightBlock", 0.3f, 0.1f);
}
if (Input.GetKeyUp(KeyCode.RightArrow))
{
CancelInvoke("MoveRightBlock");
}
}
目前,左右移动已经实现了,但是会移出边界,下一节,我们来解决左右移动的碰撞问题。
代码链接:https://pan.baidu.com/s/1Di3FbmQLIpC29YchV9kiGg
提取码:79in