Új hozzászólás Aktív témák

  • zuzu000

    őstag

    Sziasztok!

    C#-ban próbálok egy wolf3d klónt írni, suliban beadandóhoz kell. Megvan az eredeti forráskód, de c++ tudásom sajna ennyire nincs a topon, hogy minden részét tudjam értelmezni. Egy metódus lenne, ami elég fontos, ha tudnátok segíteni, megköszönném (hogy pontosan mit is csinál)

    boolean CheckLine (objtype *ob)
    {
    int x1,y1,xt1,yt1,x2,y2,xt2,yt2;
    int x,y;
    int xdist,ydist,xstep,ystep;
    int temp;
    int partial,delta;
    long ltemp;
    int xfrac,yfrac,deltafrac;
    unsigned value,intercept;

    x1 = ob->x >> UNSIGNEDSHIFT; // 1/256 tile precision
    y1 = ob->y >> UNSIGNEDSHIFT;
    xt1 = x1 >> 8;
    yt1 = y1 >> 8;

    x2 = plux;
    y2 = pluy;
    xt2 = player->tilex;
    yt2 = player->tiley;


    xdist = abs(xt2-xt1);

    if (xdist > 0)
    {
    if (xt2 > xt1)
    {
    partial = 256-(x1&0xff);
    xstep = 1;
    }
    else
    {
    partial = x1&0xff;
    xstep = -1;
    }

    deltafrac = abs(x2-x1);
    delta = y2-y1;
    ltemp = ((long)delta<<8)/deltafrac;
    if (ltemp > 0x7fffl)
    ystep = 0x7fff;
    else if (ltemp < -0x7fffl)
    ystep = -0x7fff;
    else
    ystep = ltemp;
    yfrac = y1 + (((long)ystep*partial) >>8);

    x = xt1+xstep;
    xt2 += xstep;
    do
    {
    y = yfrac>>8;
    yfrac += ystep;

    value = (unsigned)tilemap[x][y];
    x += xstep;

    if (!value)
    continue;

    if (value<128 || value>256)
    return false;

    //
    // see if the door is open enough
    //
    value &= ~0x80;
    intercept = yfrac-ystep/2;

    if (intercept>doorposition[value])
    return false;

    } while (x != xt2);
    }

    ydist = abs(yt2-yt1);

    if (ydist > 0)
    {
    if (yt2 > yt1)
    {
    partial = 256-(y1&0xff);
    ystep = 1;
    }
    else
    {
    partial = y1&0xff;
    ystep = -1;
    }

    deltafrac = abs(y2-y1);
    delta = x2-x1;
    ltemp = ((long)delta<<8)/deltafrac;
    if (ltemp > 0x7fffl)
    xstep = 0x7fff;
    else if (ltemp < -0x7fffl)
    xstep = -0x7fff;
    else
    xstep = ltemp;
    xfrac = x1 + (((long)xstep*partial) >>8);

    y = yt1 + ystep;
    yt2 += ystep;
    do
    {
    x = xfrac>>8;
    xfrac += xstep;

    value = (unsigned)tilemap[x][y];
    y += ystep;

    if (!value)
    continue;

    if (value<128 || value>256)
    return false;

    //
    // see if the door is open enough
    //
    value &= ~0x80;
    intercept = xfrac-xstep/2;

    if (intercept>doorposition[value])
    return false;
    } while (y != yt2);
    }

    return true;
    }

    A nagyrésze érthető, de vannak c++ dolgok, amik számomra teljesen ismeretlenek. False-t ad vissza, ha a "vonal" útjában van valami, igazat, ha a kettő obj között semmi nincs.
    xt1 = x1 >> 8;
    Ez pontosan mit csinál?
    Illetve y1&0xff és a többi ilyen rész?
    Előre is köszi :R

Új hozzászólás Aktív témák