Oryginalna strona colobot.cba.pl umarła, gdy cba.pl przestało oferować darmowy hosting. To jest statyczny mirror, pobrany w 2018. ~krzys_h
|
Forum - Polski Portal COLOBOTa |
|
|
Przesunięty przez: Abadon 20-02-2010, 13:26 |
Dzialo fazowe w akcji! |
Autor |
Wiadomość |
Berserker
Dark Ness
Twoja ulubiona misja: Ofrenia
Pomógł: 16 razy Wiek: 24 Dołączył: 24 Mar 2009 Posty: 496 Skąd: Bigos
|
Wysłany: 16-12-2009, 15:38 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
Jedi Master
Wiek: 28 Dołączył: 16 Gru 2009 Posty: 42 Skąd: /dev/uarndom
|
Wysłany: 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
Dark Ness
Twoja ulubiona misja: Ofrenia
Pomógł: 16 razy Wiek: 24 Dołączył: 24 Mar 2009 Posty: 496 Skąd: Bigos
|
Wysłany: 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++
Twoja ulubiona misja: Tropica - Czas na atak
Pomógł: 6 razy Wiek: 20 Dołączył: 07 Lip 2009 Posty: 390
|
Wysłany: 22-12-2009, 11:18
|
|
|
Fajna rozróba z tym programem!!!! |
_________________
|
|
|
|
|
Berserker
Dark Ness
Twoja ulubiona misja: Ofrenia
Pomógł: 16 razy Wiek: 24 Dołączył: 24 Mar 2009 Posty: 496 Skąd: Bigos
|
Wysłany: 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++
Twoja ulubiona misja: Tropica - Czas na atak
Pomógł: 6 razy Wiek: 20 Dołączył: 07 Lip 2009 Posty: 390
|
Wysłany: 01-01-2010, 13:24
|
|
|
Morze żeby nie strzelał w ziemię.
[ Dodano: 01-01-2010, 13:29 ]
bo umnie tak działa |
_________________
|
|
|
|
|
Berserker
Dark Ness
Twoja ulubiona misja: Ofrenia
Pomógł: 16 razy Wiek: 24 Dołączył: 24 Mar 2009 Posty: 496 Skąd: Bigos
|
Wysłany: 01-01-2010, 21:36
|
|
|
Hmm, pomysle, ale nie lubie takiego sprawdzania, strasznie duzo pamieci zajmuje. |
_________________
|
|
|
|
|
sajmon313
Jedi Master
Wiek: 28 Dołączył: 16 Gru 2009 Posty: 42 Skąd: /dev/uarndom
|
Wysłany: 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 |
_________________ Validator CBot - Prace Trwają
Ostatnia Aktualizacja: 02.01.10 |
|
|
|
|
Berserker
Dark Ness
Twoja ulubiona misja: Ofrenia
Pomógł: 16 razy Wiek: 24 Dołączył: 24 Mar 2009 Posty: 496 Skąd: Bigos
|
Wysłany: 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 |
_________________
|
|
|
|
|
|
Nie możesz pisać nowych tematów Możesz odpowiadać w tematach Nie możesz zmieniać swoich postów Nie możesz usuwać swoich postów Nie możesz głosować w ankietach Nie możesz załączać plików na tym forum Możesz ściągać załączniki na tym forum
|
Wersja do druku
|
|
| |
|
|
|
|
Polski Portal COLOBOTa © 2008 - 2012 |
|
|