我想知道这件事。如何在控制台中将一个符号从一侧移动到另一侧。 我有功能walk()用于在控制台上移动blip。它使用基本的条件系统并将速度值添加到位置。但这是问题所在: 当我想从0,0到60,80时,它的行为就像这样。 它通常会以对角线方式移动到达最小位置(60)。然后它会在Y coords中滑动到80。 所以: 直到60; 60位置以对角方式滑动。 当它达到60时,它将保持在x60并滑动到y80。 但那是合乎逻辑的。 我想找到一种在开始和目的地之间滑动的方法,而不需要悬挂坐标。 呃,我的英文。以下是视频:https://dl.dropboxusercontent.com/u/89067882/problem.avi 视频解释了一切。
答案 0 :(得分:0)
计算水平距离和垂直距离。制作一个比例,即垂直/水平。 使用该比率来决定你向某个方向移动的可能性。
例如,如果水平距离为40且垂直距离为20,则该比率为0.5。这意味着每1次水平移动需要进行0.5次垂直移动,或者每2次水平移动需要进行1次垂直移动。这样做直到你非常靠近目的地。之后使用你的常规walk()函数来走下2,3个街区。
答案 1 :(得分:0)
这是一个演示如何使用预定义的速度和更新间隔进行blip移动的示例。运行它,看看会发生什么......
*我在System.Drawing中添加了引用,因此我可以使用Point
结构。
与@ Arsalan00一样,我们首先计算从A到B所需的X和Y的变化。然后,给定预定义的速度,我们计算在A和B之间行进所需的时间。我们使用循环和Stopwatch
类来确定自我们开始移动blip以来经过了多长时间,暂停Sleep()
预定义的更新间隔时间。通过秒表的经过时间,我们可以计算相对于所需的总旅行时间所经过的“时间百分比”。使用时间百分比,我们可以计算我们应该在X和Y的计算变化中的距离,并将其添加到起点:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Diagnostics;
namespace ConsoleApplication1
{
class Program
{
public const double MillisecondsBetweenMoves = (double)100;
public const double DistancePerSecond = (double)10;
static void Main(string[] args)
{
Point ptStart = new Point(0, 0);
Point ptStop = new Point(70, 15);
int deltaX = ptStop.X - ptStart.X;
int deltaY = ptStop.Y - ptStart.Y;
double DistanceToTravel = Math.Sqrt((deltaX * deltaX) + (deltaY * deltaY));
Console.Clear();
Console.SetCursorPosition(ptStart.X, ptStart.Y);
Console.Write("a");
Console.SetCursorPosition(ptStop.X, ptStop.Y);
Console.Write("b");
double TimeRequiredInMilliseconds = DistanceToTravel / DistancePerSecond * (double)1000;
Stopwatch SW = new Stopwatch();
SW.Start();
while (SW.ElapsedMilliseconds < TimeRequiredInMilliseconds)
{
System.Threading.Thread.Sleep((int)MillisecondsBetweenMoves);
Point position = new Point(
ptStart.X + (int)((double)SW.ElapsedMilliseconds / TimeRequiredInMilliseconds * (double)deltaX),
ptStart.Y + (int)((double)SW.ElapsedMilliseconds / TimeRequiredInMilliseconds * (double)deltaY)
);
Console.Clear();
Console.SetCursorPosition(ptStart.X, ptStart.Y);
Console.Write("a");
Console.SetCursorPosition(ptStop.X, ptStop.Y);
Console.Write("b");
Console.SetCursorPosition(position.X, position.Y);
Console.Write("X");
}
Console.Clear();
Console.SetCursorPosition(ptStart.X, ptStart.Y);
Console.Write("a");
Console.SetCursorPosition(ptStop.X, ptStop.Y);
Console.Write("b");
Console.SetCursorPosition(ptStop.X, ptStop.Y);
Console.Write("X");
Console.ReadLine();
}
}
}