Oryginalna strona colobot.cba.pl umarła, gdy cba.pl przestało oferować darmowy hosting. To jest statyczny mirror, pobrany w 2018. ~krzys_h
 
Polski Portal COLOBOTa
COLOBOT Polish Portal

Eliminacja obcych - Dzialo fazowe w akcji!

Berserker - 16-12-2009, 15:38
Temat postu: Dzialo fazowe w akcji!
Witam spowrotem wsrod ludzi z internetem :>
Oto program dla dziala fazowego, ktory w miare porzadnie celuje (sam miesiac wyprowadzalem wzor na zaleznosc tangensa od zaleznosci przebytego dystansu w poziomie
i wysokosci, wiec prosze to docenic :] ), potrafi obliczyc przewidywana pozycje osy (:awesome:) i nawet potrafi omijac gorki (przynajmniej w teorii, nie sprawdzalem tego dokladnie).
Publikuje ten program nie po to byscie sie nim cieszyli tylko po to, by go udoskonalic, sam nie wylapie wszystkiego.
Kod:
extern void object::AntMTPhaz()
{
    aim(0);
    object p;
    float dir, dist, len, orient, time, alfa;
    float angle;
    float maxTurnV;
    point target;
    float pitchmax;
    int list[], i, sgn;
    maxTurnV = 0.5;
    pitchmax = 15;
    i = 0;
    list[i++] = AlienWorm;
    list[i++] = AlienAnt;
    list[i++] = AlienSpider;
    list[i++] = AlienWasp;
    //list[i++] = AlienQueen;
    angle = 0;
    time = abstime();
    while(true)
    {
        while(energyCell.energyLevel > 0.2 or radar(list, 0, 360, 0, 60) != null)
        {
            p = radar(list);
            if(p == null)
            {
                motor(0, 0);
                continue;
            }
            target = p.position;
            if(p.category == AlienWasp) target = Dest(p);
            dist = distance(position, target);
            dir = Dir(target);
            if(pitch < pitchmax-5 or dist < 60) dir = dir;
            else
            {
                orient = pitchmaxdir();
                sgn = 1;
                if(orient < 0) sgn = -1;
                orient = abs(orient);
                alfa = 90-(90-orient)*(pitchmax-90)/(pitch-90);
                alfa = sgn*(alfa-orient);
                dir += alfa;
            }
            len = (dist-45)/5;
            if(len > 1) len = 1;
            orient = dir/90;
            if(orient > maxTurnV) orient = maxTurnV;
            motor(len-orient, len+orient);
            angle = Aim(target);
            if(dist < 55)
            {
                aim(angle);
                if(abstime()-time > 1 and abs(orient) < 0.1)
                {
                    aim(angle);
                    fire(0.5);
                    time = abstime();
                }
            }
        }
        goto(0, 0);
    }
}
float object::Angle(point dest)
{
    float maxRange, v, g;
    float PhazH, PhazL, maxElevation;
    float x, y;
    float angle, tg1, tg2, sinus;
    float a, b, c, delta;
    PhazH = 2;
    PhazL = 2;
    maxElevation = 45;
    maxRange = 55;
    g = 7;
    v = sqrt(g*maxRange);
    x = maxRange;
    x = distance2d(dest, position)-PhazL;
    y = dest.z - (position.z + PhazH);
    a = pow(x/v, 2);
    b = -2*x/g;
    c = pow(x/v, 2)+2*y/g;
    delta = pow(b, 2)-4*a*c;
    if(delta >= 0)
    {
        tg1 = atan((-b-sqrt(delta))/(2*a));
    }
    else
    {
        tg1 = atan(-b/a * 1/2);
    }
    angle = tg1;
    return angle;
}

float object::Aim(point dest)
{
    float angle, elevation;
    angle = Angle(dest);
    elevation = (angle-pitch)*cos(abs(roll));
    return elevation;
}
float object::Dir(point dest)
{
    float dir, angle;
    dir = direction(dest);
    angle = dir - (Angle(dest)-pitch) * sin(roll);
    return angle;
}
point object::Dest(object p)
{
    float Vo, Vb;
    float len, dist, t, deltaH;
    point dest;
    Vo = 14;
    Vb = 30;
    deltaH = p.position.z-topo(p.position);
    dist = distance(position, p.position);
    t = dist/Vb;
    len = Vo * t;
    dest.x = p.position.x+cos(p.orientation)*len;
    dest.y = p.position.y+sin(p.orientation)*len;
    dest.z = topo(dest)+deltaH;
    return dest;
}
float object::porientation()
{
    ipf(1000);
    float orient, pitchmax;
    float alfa;
    pitchmax = pitch+roll;
    if(pitchmax == 0) return nan;
    alfa = pitch*90/pitchmax-90;
    orient = alfa+orientation;
    while(orient > 360) orient -= 360;
    while(orient < 0) orient += 360;
    return orient;
   
}
float object::pitchmaxdir()
{
    float dir, orient;
    orient = porientation();
    if(orient > 180) orient = 360-orient;
    dir = orient-orientation;
    while(dir > 180) dir -= 360;
    while(dir < -180) dir += 360;
    return dir;
}

Jest dlugi, wiec pewnie nikt go nie skomentuje, ale co tam :)

sajmon313 - 16-12-2009, 16:54

Berserker napisał/a:
//list[i++] = AlienQueen;

dlaczego nie strzela do królowej?

Berserker napisał/a:
pitchmax = 15;

wyjaśnij to, dlaczego tylko 15

Berserker napisał/a:
Vo = 14;
Vb = 30;

co to za wartości? skad je wziąłeś?

Berserker - 16-12-2009, 17:09

Pipok style!
Cytat:
//list[i++] = AlienQueen;

Bo mi sie zabawa za szybko konczyla :(
Cytat:
wyjaśnij to, dlaczego tylko 15

Nie mam tabeli z danymi, pod jakim katem jaki pojazd moze jechac, a wolalem zobaczyc w miare szybko efekt tego co wymyslilem. Wydaje mi sie, ze dla dziala fazowego bedzie z 40 stopni, ale to mozna zmieniac dowolnie.
Cytat:
co to za wartości? skad je wziąłeś?

To sa predkosci, dokladniej predkosc osy i pozioma predkosc pocisku fazera.
Predkosc osy jest latwa do wyznaczenia, predkosc pocisku wlasciwie wynosi:
Kod:

Vb = sqrt(55*7)*cos(elevation)

Zakladajac, ze elevation to kat wyznaczony za pomoca funkcji Angle(), po prostu zapomnialem zmienic.

Bartek c++ - 22-12-2009, 11:18

Fajna rozróba z tym programem!!!!
Berserker - 22-12-2009, 13:46

Hmmm, a moze jakies sugestie? Bo zamierzam zapdejtowac ten program i wole odrazu dopisac to czego brakuje i poprawic bledy.
Bartek c++ - 01-01-2010, 13:24

Morze żeby nie strzelał w ziemię.

[ Dodano: 01-01-2010, 13:29 ]
bo umnie tak działa

Berserker - 01-01-2010, 21:36

Hmm, pomysle, ale nie lubie takiego sprawdzania, strasznie duzo pamieci zajmuje.
sajmon313 - 02-01-2010, 12:43

Berserker napisał/a:

Nie mam tabeli z danymi, pod jakim katem jaki pojazd moze jechac, a wolalem zobaczyc w miare szybko efekt tego co wymyslilem. Wydaje mi sie, ze dla dziala fazowego bedzie z 40 stopni, ale to mozna zmieniac dowolnie.

Z mojego eksperymentu: http://www.colobot.yoyo.p...topic.php?t=567
wiemy że PhazerShooter podjedzie conajmniej pod pitch 38

Berserker - 02-01-2010, 14:21

Cytat:
wiemy że PhazerShooter podjedzie conajmniej pod pitch 38

Najpierw trzeba napisac funkcje ktora bedzie dawac efekty, a nie tylko miejsce zajmowac :P


Powered by phpBB modified by Przemo & WRIM © 2003 phpBB Group