使对象移向另一个对象位置

我目前拥有的是两个可以通过导航键播放的对象,另一个可以通过wasd播放。 关键是获得第三个对象并获得一个点,并且在捕获它之后它会获得一个新的pos,这有效。

现在……我希望npc2不再受人类控制,并创建一种方法让它自己移动到得分对象上。 我怎么可能做到这一点? 我是新来的c#:)

FORM.cs如下

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace SPEL { public partial class Form1 : Form { npc npc1 = new npc(); npc npc2 = new npc(); sten ste1 = new sten(); int poang1 = 0; int poang2 = 0; private _keyControl cc = new _keyControl(); public Form1() { SetStyle(ControlStyles.UserPaint, true); SetStyle(ControlStyles.AllPaintingInWmPaint, true); SetStyle(ControlStyles.OptimizedDoubleBuffer, true); InitializeComponent(); // Hantera tangentbordet #region captute evenents this.KeyDown += new System.Windows.Forms.KeyEventHandler(cc.addKey); this.KeyUp += new System.Windows.Forms.KeyEventHandler(cc.delKey); #endregion } private void Form1_Load(object sender, EventArgs e) { } private void Form1_Paint(object sender, PaintEventArgs e) { npc1.Rita(e.Graphics); npc2.Rita(e.Graphics); ste1.Draw(e.Graphics); } private void Form1_KeyDown(object sender, KeyEventArgs e) { //MessageBox.Show(e.KeyData.ToString()); } private void timer1_Tick(object sender, EventArgs e) { //spelare 1 this.Text = cc.keyStr; if (cc.getKey("Right")) { npc1.Flytta("Right"); this.Invalidate(); } if (cc.getKey("Left")) { npc1.Flytta("Left"); this.Invalidate(); } if (cc.getKey("Up")) { npc1.Flytta("Up"); this.Invalidate(); } if (cc.getKey("Down")) { npc1.Flytta("Down"); this.Invalidate(); } //Spelare 2 if (cc.getKey("D")) { npc2.Flytta("Right"); this.Invalidate(); } if (cc.getKey("A")) { npc2.Flytta("Left"); this.Invalidate(); } if (cc.getKey("W")) { npc2.Flytta("Up"); this.Invalidate(); } if (cc.getKey("S")) { npc2.Flytta("Down"); this.Invalidate(); } if (npc1.checkkoll().IntersectsWith(ste1.checkkoll())) { poang1++; ste1.randomxy(this.Width -30, this.Height -30); } if (npc2.checkkoll().IntersectsWith(ste1.checkkoll())) { poang2++; ste1.randomxy(this.Width -30, this.Height -30); } } private void timer2_Tick(object sender, EventArgs e) { if (this.BackColor == Color.Red) this.BackColor = Color.Blue; else this.BackColor = Color.Red; } private void flytta_Tick(object sender, EventArgs e) { } } } } 

这是我的运动课

  using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Drawing; namespace SPEL { class npc { private Bitmap strid; private Point pt; public npc() { strid = new Bitmap("hej.gif"); pt.X = 20; pt.Y = 20; } public void Rita(Graphics f) { Rectangle re = new Rectangle(pt.X, pt.Y, strid.Width, strid.Height); f.DrawImage(strid, re); } public Rectangle checkkoll() { Rectangle re = new Rectangle(pt.X, pt.Y, strid.Width, strid.Height); return re; } public void Flytta(string dir) { if (dir == "Left") { pt.X = pt.X - 2; } if (dir == "Right") { pt.X = pt.X + 2; } if (dir == "Up") { pt.Y = pt.Y - 2; } if (dir == "Down") { pt.Y = pt.Y + 2; } } } } 

我明白这要求很多,但如果你能帮助我,我会感激不尽!

尝试这样的事情

  public void FlyttaMot(int x, int y, float speed) { float tx = x - pt.X; float ty = y - pt.Y; float length = Math.Sqrt(tx*tx + ty*ty); if (length > speed) { // move towards the goal pt.X = (int)(pt.X + speed* tx/length); pt.Y = (int)(pt.Y + speed* ty/length); } else { // already there pt.X = x; pt.Y = y; } } 

例如,从Form.cs计时器刻度代码中调用它。

 npc2.FlyttaMot(200, 200, 0.5f); 

我的基础是线性代数。 以这个video为例。 (tx,ty)是npc应该走向的向量。 除以向量的长度给出了一个长度为1的向量。我将它乘以速度参数,这样你就可以调整npc的速度。

最简单,最准确的方法是依靠矢量几何。

定义类

 public class Vector2 { public float x {get;set;}; public float y {get;set;}; public Vector2(float a_x, float a_y, float b_x, float b_y) { x = b_x - a_x; y = b_y - a_y; } //calculate vector length public float Length { get { return Math.Sqrt((x * x) + (y * y)); } } public void SetVectorLength(float desiredLength){ double r = desiredLength/ this.Length; this.x *= r; this.y *= r; } } 

这只是这种情况下的一组函数,但是您可以添加其他function,其中包含大量计算所需的部分function。

在你需要做的只是,计算你的顶点的下一个位置朝向方向向量。

 //hypothetical X coordinate float x_coord = 1.34f; //move towards the vector var vector = new Vector2(10, 10, 20, 20); //set vector move step vector.SetLength(0.1f); var movedX = x_coord + vector.x; 

重复 :这只是一个假设的例子,你需要解决这个问题。 很难把所有相关的矢量几何东西放到小答案中。