gpt4 book ai didi

c# - 使一个物体移向另一个物体的位置

转载 作者:太空宇宙 更新时间:2023-11-03 11:13:31 25 4
gpt4 key购买 nike

我目前拥有的是两个可以通过导航键播放的对象,另一个可以使用 wasd 播放。重点是获得第 3 个对象并得分,并在接住它后随机生成一个新的位置,这是有效的。

现在...我希望 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 的速度。

关于c# - 使一个物体移向另一个物体的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13345446/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com