Я всю неделю работаю над этим одним кодом, и до сих пор не получил ответа, который полностью срабатывает по поводу ошибки, с которой я сталкиваюсь. Ошибка var diff = Cursor.Position - playerPoint;
в строке var diff = Cursor.Position - playerPoint;
, эта ошибка возникает из-за того, что вы не можете использовать (-) операнд между Windows.Point
и Drawing.Point
но кодирование для его преобразования, похоже, только преобразует его в выражение, в котором оно участвует.
Прокомментированный код - это другая попытка одного и того же метода, но он дает ту же ошибку. Кто-нибудь получил что-нибудь по этому поводу?
private void tmrMoving_Tick(object sender, object value, Type targetType,
object parameter, CultureInfo culture, EventArgs e)
{
System.Drawing.Point dp = (System.Drawing.Point)value;
var playerPoint = new System.Windows.Point(dp.X, dp.Y);
var cursPoint = new System.Windows.Point(Cursor.Position.X, Cursor.Position.Y);
// var playerPoint = new System.Windows.Point(player.Location.X, player.Location.Y);
var diff = Cursor.Position - playerPoint;
var speed = Math.Sqrt(diff.X * diff.X + diff.Y * diff.Y);
if (speed > 10)
{
diff.X /= speed / 10;
diff.Y /= speed / 10;
}
player.Location += new System.Drawing.Point((int)diff.X, (int)diff.Y);
}
Редактировать Если метод не просматривается с помощью приведенного выше кода, может возникнуть проблема в следующем:
private void tmrMoving_Tick(object sender, object value, Type targetType,
object parameter, CultureInfo culture, EventArgs e)
{
var cursPoint = new System.Windows.Point(Cursor.Position.X, Cursor.Position.Y);
var playerPoint = new System.Windows.Point(player.Location.X, player.Location.Y);
var diff = Cursor.Position - playerPoint;
var speed = Math.Sqrt(diff.X * diff.X + diff.Y * diff.Y);
if (speed > 10)
{
diff.X /= speed / 10;
diff.Y /= speed / 10;
}
player.Location += new System.Drawing.Point((int)diff.X, (int)diff.Y);
}
Поскольку Cursor
- это класс Windows Forms/GDI+, и ваше использование System.Windows.Point
указывает, что вы используете WPF, у вас есть проблема. Эти классы не взаимозаменяемы.
Если вы используете WPF: вместо Cursor.Position
вы можете использовать Mouse.GetPosition(Application.Current.MainWindow);
как указано здесь.
Если вы используете WF: используйте System.Drawing.Point
полностью, а не System.Windows.Point
.
Однако вычитание точек невозможно. Вы должны написать это самостоятельно или, лучше, построить новую точку и выполнить математику в вызове конструктора.
Вы можете вычислить вектор от одной точки до следующей непосредственно по координатам:
int diffX = dp.X - Cursor.Position.X;
int diffY = dp.Y - Cursor.Position.Y;
var speed = Math.Sqrt(diffX * diffX + diffy * diffY);
до тех пор, пока dp
и Cursor.Position
используют одну и Cursor.Position
же систему координат, то есть 0,0
означает то же самое для обоих.