我正在尝试在地图中的Entity.cs
Follow(Vector2 point)
任意点。这必须使用“force”来完成。 Force是Vector2
Entity
,用于在地图上移动Entity
。 Update(float elapsedTime)
Entity
Entity
Force * elapsedTime
public virtual void Update (float elapsedTime)
{
position += force * elapsedTime;
}
移动Update
。像这样:
Follow
所以,我想创建一个类似于Entity
函数的函数,称为Entity
,它将为public virtual void Follow (Vector2 follow, float intensity)
{
if (position != follow) AddForce((follow - position) * intensity);
else AddForce(-force);
}
添加足够的力以使其移动到该点,并停止当它到达那一点时。
这可以被子弹类(Follow(followThisPoint, 300 * elapsedTime);
的孩子)用来追踪敌人,或者类似的东西,我相信你们都可以看到我在比赛中使用的东西。
目前,代码如下所示:
Update
调用此函数的代码如下所示
Entity
请注意,每行AddForce
都会调用此行,这就是我想要的那样。
我对这个函数的问题在于,向实体添加了太多的力,它只是通过了我想要它的点,然后,当它通过时,它会减慢,并且试图回去,但后来我得到了我刚才描述的相同结果,但方向相反。
我希望控制public void AddForce (Vector2 addForce)
{
force += addForce;
}
跟随兴趣点的速度,让它立即停留在感兴趣点,或者在接近时减速,然后慢慢停在那一点上
编辑1:根据要求,这是<div class="row control-group">
<label class="col-xs-4 col-sm-4 col-md-3 col-lg-3 control-label">{{::'label.identity'|translate}}</label>
<div class="col-xs-7 col-sm-7 col-md-9 col-lg-9 controls">
<select id="selectIdentity" name="selectIdentity">
<!-- Empty option necessary for placeholder to work -->
<option value="">{{::'define.selectval'|translate}}</option>
<option ng-repeat="idprovider in identityProvider" ui-select2="select2IdentityProvider" class="selectIdentity" ng-model="identityprovider" ng-change="changedValue(identityprovider)" ui-select2="select2LocaleSettings">{{idprovider}}</option>
</select>
<span class="help-block" ng-show="addUserForm.selectIdentity.$error.required">{{::'error.required'|translate}}</span>
</div>
</div>
功能:
<div class="row control-group" ng-show="identityprovider == EMPLOYEE"
ng-class="{error:addUserForm.sso.$dirty && !addUserForm.sso.$valid , success:addUserForm.sso.$valid}">
<label class="col-xs-4 col-sm-4 col-md-3 col-lg-3 control-label">{{::'label.addUser.SSO'|translate}}</label>
<div class="col-xs-7 col-sm-7 col-md-9 col-lg-9 controls">
<input type="text" class="input-xlarge" id="sso" name="sso"
ng-model="addUser.user.sso" ng-pattern="ssoPattern"
placeholder="{{::'placeholder.addUser.sso'|translate}}"
ng-change="addUserForm.sso.$setValidity('duplicateName', true);"
required="true" ng-maxlength=8 ng-minlength=8 ge-auto-focus />
<span class="help-block"
ng-show="addUserForm.sso.$dirty && addUserForm.sso.$error.required">{{::'error.required'|translate}}</span>
<span class="help-block"
ng-show="addUserForm.sso.$dirty && addUserForm.sso.$error.pattern">{{::'error.sso'|translate}}</span>
<span class="help-block"
ng-show="addUserForm.sso.$dirty && addUserForm.sso.$error.maxlength">{{::'error.max.length'|translate}}</span>
<span class="help-block"
ng-show="addUserForm.sso.$dirty && addUserForm.sso.$error.duplicateName">{{::'error.editOrganization.duplicateName'|translate}}</span>
</div>
</div>
答案 0 :(得分:1)
在回答这个问题之前,我想澄清一些术语。
您的变量force
实际上是一种速度。它表示物体行进的速度。力可以通过加速度改变物体的速度。如果对对象应用力,则会加速此对象。对速度的影响取决于力的施加时间和物体的质量。
鉴于此,让我们来看看你的问题。您想要施加力,使得得到的速度矢量为:
vTarget = (follow - position) * intensity
这意味着当物体到达目标时速度降至零。您还可以将速度限制为上限。
根据您的AddForce
定义,您必须应用以下强制F
:
vTarget = vCurrent + F
vTarget - vCurrent = F
同样,您可以限制F
的长度。这就是全部。这是一些C#/伪代码:
public virtual void Follow (Vector2 follow, float intensity)
{
float vMax = 1000;
float fMax = 1000;
Vector2 vTarget = (follow - position) * intensity;
if (vTarget.Length() > vMax) vTarget = vTarget * (vMax / vTarget.Length());
Vector2 force = vTarget - this.force; //where this.force is actually the velocity
if (force.Length() > fMax) force = force * (fMax / force.Length());
AddForce(force);
}