我在这里错过了隐式转换吗?

时间:2014-03-17 20:28:22

标签: c# type-conversion

我创建了一个简单的类,代表笛卡尔平面上的一个点 - 位置类,它不能正常工作。当我增加小数点坐标时,整数坐标似乎没有响应。这就是ConsolidatePosition()方法的用途。似乎传递给MoveRelative()方法的任何Double类型数字在存储到*PosPrecise之前都会转换为整数,就像它们已经由Convert.ToInt32()处理一样(转换)似乎遵循了“x.5到最近的偶数”规则。

我的代码使用文字参数,如果这有所不同。例如。 MoveRelative(0, 0.5)出现在代码中。

public class Position{
public int XPos;
public int YPos;
public double XPosPrecise;
public double YPosPrecise;

public class Position{
    public int XPos;
    public int YPos;
    public double XPosPrecise;
    public double YPosPrecise;

    public Position(){
        XPosPrecise = 0;
        YPosPrecise = 0;
        ConsolidatePosition();
    }

    public Position(double x, double y){
        XPosPrecise = x;
        YPosPrecise = y;
        ConsolidatePosition();
    }

    public void MoveRelative(double x, double y){
        XPosPrecise += x;
        YPosPrecise += y;
        ConsolidatePosition();
    }

    public void MoveAbsolute(double x, double y){
        XPosPrecise = x;
        YPosPrecise = y;
        ConsolidatePosition();
    }

    private void ConsolidatePosition(){
        XPos = Convert.ToInt32(XPosPrecise);
        YPos = Convert.ToInt32(YPosPrecise);
    }
}

以下是对代码的一些调用。它们是对该类的一个实例进行的唯一调用。他们被称为每个框架'我的节目。我已经使用整数和近似整数来测试Move()方法,并且仍然出现幻像舍入。就目前而言,在多次调用Move()后,输出不会发生变化。

public void RotateRight(){
    // apply central positioning
    switch(ActorDirection){
        case 0:
            ActorPosition.MoveRelative(-2, 1);
            break;
        case 1:
            ActorPosition.MoveRelative(2, -2);
            break;
        case 2:
            ActorPosition.MoveRelative(-1, 2);
            break;
        case 3:
            ActorPosition.MoveRelative(1, -1);
            break;
    }
    ActorSprite.RotateRight(true);
    ActorDirection = (ActorDirection + 1) % 4;
}

public void Move(int direction){
    while(ActorDirection != direction){
        RotateRight();
    }
    switch (ActorDirection % 4){
    case 0:
        ActorPosition.MoveRelative(0, -0.5);
        break;
    case 1:
        ActorPosition.MoveRelative(0.5, 0);
        break;
    case 2:
        ActorPosition.MoveRelative(0, 0.5);
        break;
    case 3:
        ActorPosition.MoveRelative(-0.5, 0);
        break;
    }
}

我的问题是,我在这里错过了隐式转换吗?

(这是用C#编写和编译的)

2 个答案:

答案 0 :(得分:0)

我的猜测是转换为整数时十进制值的舍入导致此处出现问题(因为它是一个使用问题)。 (double)0.99转换为(int)0。也许您正在寻找Math.Round()?

答案 1 :(得分:0)

抱歉。问题是屏幕包装函数返回一个具有整数精度而不是十进制精度的新位置对象。这是每个游戏步骤调用,并替换旧的Position对象,永远不允许* PosPrecise达到0.5以上。当函数结果设置为我的对象时,它重置为0.上述任何代码都没有错误,Payo是正确的,这就是我使用它的方式。