使用force

时间:2016-05-19 11:33:16

标签: c# xna 2d physics monogame

我正在尝试在地图中的Entity.cs Follow(Vector2 point)任意点。这必须使用“force”来完成。 Force是Vector2 Entity,用于在地图上移动EntityUpdate(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>

1 个答案:

答案 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);
}