【发布时间】:2017-10-23 16:37:49
【问题描述】:
我正在开发一个蛇游戏,我遇到了一个问题,如果我输入(上、下、左、右)太快,我的蛇会撞到自己。我试图在 Update() 下创建一个计时器来调节我的动作,但我发现我的蛇仍然不时地跑到自己身上。
我使用 InvokeRepeating() 每 0.05 秒移动一次我的蛇,我有 2 种输入方法:1) 更新以监听键盘输入(上、下、左、右箭头)和 2) 游戏手柄 UI(上、下、左、右箭头)下、左、右按钮)。关于如何调节方向变化的任何建议?
void Start () {
Screen.orientation = ScreenOrientation.Portrait;
isPaused = false;
InvokeRepeating("TimerInvoke", 0, deltaTimer);
}
void TimerInvoke() {
Movement();
StartCoroutine(checkVisible());
if (currentSize == maxSize)
TailFunction();
else
currentSize++;
}
void Update () {
CompDirectionControl();
PauseCMD();
}
void CompDirectionControl() {
if (direction != Direction.South && Input.GetKeyDown(KeyCode.UpArrow))
direction = Direction.North;
if (direction != Direction.West && Input.GetKeyDown(KeyCode.RightArrow))
direction = Direction.East;
if (direction != Direction.North && Input.GetKeyDown(KeyCode.DownArrow))
direction = Direction.South;
if (direction != Direction.East && Input.GetKeyDown(KeyCode.LeftArrow))
direction = Direction.West;
}
public void MPadDirectionControl(int numDirection)
{
if (direction != Direction.South && numDirection == 0)
direction = Direction.North;
if (direction != Direction.West && numDirection == 1)
direction = Direction.East;
if (direction != Direction.North && numDirection == 2)
direction = Direction.South;
if (direction != Direction.East && numDirection == 3)
direction = Direction.West;
}
我尝试创建这样的东西,但延迟非常不一致
if (Time.time >= timeStamp)
{
CompDirectionControl();
timeStamp = Time.time + moveInterval;
}
更新 通过使用协程,我能够为我的键盘输入添加延迟。但是,我还没有想出如何对我的按钮 UI 输入做同样的事情。如果我创建一个公共 IEnumerator GamePadDirControl(int direction),如何将按钮的参数传递给我的 IEnumator?即使我将我的 GamePadDirControl 设置为 public,我在 Inspector 中也看不到它,所以我无法将我的按钮链接到它
IEnumerator DirControl() {
if (direction != Direction.South && Input.GetKeyDown(KeyCode.UpArrow))
{
yield return new WaitForSeconds(deltaTimer);
direction = Direction.North;
}
else if (direction != Direction.West && Input.GetKeyDown(KeyCode.RightArrow))
{
yield return new WaitForSeconds(deltaTimer);
direction = Direction.East;
}
else if (direction != Direction.North && Input.GetKeyDown(KeyCode.DownArrow))
{
yield return new WaitForSeconds(deltaTimer);
direction = Direction.South;
}
else if (direction != Direction.East && Input.GetKeyDown(KeyCode.LeftArrow))
{
yield return new WaitForSeconds(deltaTimer);
direction = Direction.West;
}
}
更新 2 对于我的按钮 UI - 由于我的按钮无法与 IEnumator 函数链接,因此我决定为每个方向创建单独的协程,并从我的 public void MPadDirectionControl(int numDirection) 函数中调用它们。
按钮 ui 输入上的更新代码
public void MPadDirectionControl(int numDirection)
{
if (direction != Direction.South && numDirection == 0)
{
StartCoroutine(IntervalN());
//direction = Direction.North;
}
else if (direction != Direction.West && numDirection == 1)
{
StartCoroutine(IntervalE());
//direction = Direction.East;
}
else if (direction != Direction.North && numDirection == 2)
{
StartCoroutine(IntervalS());
//direction = Direction.South;
}
else if (direction != Direction.East && numDirection == 3)
{
StartCoroutine(IntervalW());
//direction = Direction.West;
}
}
IEnumerator IntervalN() {
yield return new WaitForSeconds(deltaTimer);
direction = Direction.North;
}
IEnumerator IntervalE()
{
yield return new WaitForSeconds(deltaTimer);
direction = Direction.East;
}
IEnumerator IntervalS()
{
yield return new WaitForSeconds(deltaTimer);
direction = Direction.South;
}
IEnumerator IntervalW()
{
yield return new WaitForSeconds(deltaTimer);
direction = Direction.West;
}
【问题讨论】: