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

Programy - Przydatne funkcje

DemoLisH - 06-01-2009, 23:02
Temat postu: Przydatne funkcje
Podajemy tutaj wszystkie przydatne funkcje ktore napisaliscie, ja zaczne

Kod:
bool isMoving(object a)
{
point s;
s=a.position;
wait(0.01);
if(a.position.x != s.x || a.position.y != s.y || a.position.z != s.z) return true;
else return false;
}


funkcja sluzy do sprawdzenia czy dany obiekt sie porusza, argumentem pierwszym o nazwie "a" jest wlasnie ten obiekt, funkcja zwraca true gdy wykryje, ze obiekt sie porusza, a false jesli stoi w miejscu

DemoLisH - 12-01-2009, 22:09
Temat postu: RE: Przydatne funkcje
funkcja ktora sprawdza czy obiekt skreca:

Cytat:
bool isTurning(object a)
{
float s;
s=a.orientation;
wait(0.01);
if(abs(s-a.orientation) >1) return true;
else return false;
}

DemoLisH - 13-01-2009, 17:30
Temat postu: RE: Przydatne funkcje
to jak mam takie funkcje to dorzuce jeszcze 1 małą ktora sprawdza czy obiekt lata:
Cytat:
bool isFlying(object a)
{
if(a.altitude>0) return true;
else return false;
}

COLOBOT - 13-01-2009, 19:13
Temat postu: RE: Przydatne funkcje
Kod:
extern void object::Zapiszobiekt( )
{

string msg, poz;
float dir;
int i;

dir = 2 - (orientation / 180);
if (dir > 1.99) dir = 0.00;

poz = this.position.x+";"+this.position.y;

file plik();
file p2();

if (!plik.open("Obiekty.txt", "r"))
{
plik.open("Obiekty.txt", "w");
plik.writeln("CreateObject pos="+poz+" dir="+dir+" type=");
plik.close();
message(this.position.x+" ; "+this.position.y+" , "+dir);
return;
}
p2.open("Obiekty2.txt", "w");

while(!plik.eof())
{
msg = plik.readln();
if (msg != "") p2.writeln(msg);
}

plik.close();
p2.close();

plik.open("Obiekty.txt", "w");
p2.open("Obiekty2.txt", "r");

while(!p2.eof())
{
msg = p2.readln();
if (msg != "") plik.writeln(msg);
}

plik.writeln("CreateObject pos="+poz+" dir="+dir+" type=");

plik.close();
p2.close();

message(this.position.x+" ; "+this.position.y+" , "+dir);

}

Działanie programu jest następujące: Chodzimy sobie dowolnym robotem i stajemy na miejscu, gdzie chcemy postawić budynek. Następnie odpalamy program i tak dowolną ilość razy. Po zakończeniu zabawy otwieramy plik files/obiekty.txt i tam mamy gotową do wklejenia listę obiektów. Wystarczy tylko wpisać kategorię. Pozycja i orientacja już jest zdefiniowana.

adiblol - 13-01-2009, 19:21
Temat postu: RE: Przydatne funkcje
Bardzo przydatne. Nie wpadłbym na to żeby coś takiego zrobić.
COLOBOT - 13-01-2009, 19:46
Temat postu: RE: Przydatne funkcje
Jeszcze zrobiłem kiedyś programik do zapisywania pozycji (żeby się nie babrać z takimi misjami jak ta na Krystalii "Awaria systemu" z uciekającym robotem).
Kod:
extern void object::Zapiszpozycje( )
{

string msg, poz;
int i;

poz = this.position.x+" , "+this.position.y;
file plik();
file p2();

if (!plik.open("Pozycje.txt", "r"))
{
plik.open("Pozycje.txt", "w");
plik.writeln("goto("+poz+" , 0,1,1);");
plik.close();
message(this.position.x+" , "+this.position.y);
return;
}
p2.open("pozycje2.txt", "w");

while(!plik.eof())
{
msg = plik.readln();
if (msg != "") p2.writeln(msg);
}

plik.close();
p2.close();

plik.open("Pozycje.txt", "w");
p2.open("pozycje2.txt", "r");

while(!p2.eof())
{
msg = p2.readln();
if (msg != "") plik.writeln(msg);
}

plik.writeln("goto("+poz+" , 0,1,1);");

plik.close();
p2.close();

message(this.position.x+" , "+this.position.y);


}

I jeszcze żeby nie babrać się z niestandardowymi teksturami zrobiłem trzeci program, ale sam nie wiem dokładnie jak działa ;).
Kod:
extern void object::Zapisztekstury( )
{

string msg, poz;
int i;

int x, y;
float xx, yy;
xx = this.position.x / 10;
yy = this.position.y / 10;

if (xx < 0) xx = xx - 1;
if (yy < 0) yy = yy - 1;

x = xx;
y = yy;

x *= 10;
y *= 10;

point punkt;
punkt.x = x;
punkt.y = y;

produce(punkt, 0, WayPoint, "");

message(x+" , "+y);
poz = x+"; "+y;
file plik();
file p2();

if (!plik.open("tekstury.txt", "r"))
{
plik.open("tekstury.txt", "w");
plik.writeln("TerrainLevel id=5 center= "+poz+" radius=1");
plik.close();
return;
}
p2.open("tekstury2.txt", "w");

while(!plik.eof())
{
msg = plik.readln();
if (msg != "") p2.writeln(msg);
}

plik.close();
p2.close();

plik.open("tekstury.txt", "w");
p2.open("tekstury2.txt", "r");

while(!p2.eof())
{
msg = p2.readln();
if (msg != "") plik.writeln(msg);
}

plik.writeln("TerrainLevel id=5 center= "+poz+" radius=1");

plik.close();
p2.close();


}

DemoLisH - 13-02-2009, 15:28

funkcja do szybszego skrecania pojazdem, jest bardzo dokladna

Kod:
void object::turn2(float angle,float speed)
{
float b1,b2;
b1=0; b2=0;
if(angle>0)
{
while( abs(b1) < abs(angle)-speed)
{
turn(speed);
b1=b1+speed;
}
turn(-abs(b1)+abs(angle));
}
if(angle<0)
{
while( abs(b2) < abs(angle)-speed)
{
turn(-speed);
b2=b2-speed;
}
turn(abs(b2)-abs(angle));
}
}

colobotwymiiata - 20-02-2009, 15:44

Jak da się zapisać tekstury, to można też robić screenshoty???

PS.:A jak się da, to najlepiej 24 na sekundę 8-)

adiblol - 20-02-2009, 16:56

Nie tyle screenshoty co zapis położenia wszystkich obiektów. Ale nie ma co później z tym zrobić (chyba żeby zaprogramować coś co pokazuje to na mapce i tworzy film).

Filmowanie ekranu bardzo dobrze robi VirtualDub (menu File -> Capture AVI).

colobotwymiiata - 27-03-2009, 18:00

Hmm.. A jeszcze do tekstur, to jak da się je zapisać, to da się wykryć np. czy są burze elektromagnetyczne?
adiblol - 27-03-2009, 18:56

colobotwymiiata napisał/a:
A jeszcze do tekstur, to jak da się je zapisać, to da się wykryć np. czy są burze elektromagnetyczne?

CO?

colobotwymiiata - 27-03-2009, 19:04

Skoro program wykrywa jakie są tekstury, to może wykryć linijkę "TerrainBlitz sleep=... delay=... magnetic=..."?
Berserker - 27-03-2009, 23:13

Funkcja sprawdza, czy dowolne dwa rodzaje obiektow sa w odleglosci mniejszej niz jakas tam.
Kod:

bool object::Dist(object obj1, object obj2, float len)
{
int i1, i2;
float dist;
object alien, bot;
i1 = 1;
i2 = 1;
dist = 1000;


while(i2 < 1000 and i1 < 1000)
{
if(i1 == i2)
{
i2++;
}
alien = retobject(i1++);
if(alien == null)
{
continue;
}
bot = retobject(i2++);
if(bot == null)
{
i1--;
continue;
}
if(alien.category != obj1.category)
{
i2--;
continue;
}
if(bot.category != obj2.category)
{
i1--;
continue;
}
if(distance2d(bot.position, alien.position) < dist)
{
dist = distance2d(bot.position, alien.position);
}
}
if(dist > len)
{

return false;
}
else
{
return true;
}

}

@edit
Buahaha wygrywam z wszystkimi funkcjami w dlugosci ;]

colobotwymiiata - 27-03-2009, 23:24

Całkowicie niekumam tej funkcji(czy to oznacza , że jestem jakiś ciemny?).
Berserker - 27-03-2009, 23:50

Nie, sam jej nie rozumiem najlepiej ;]
Przyklad:
Kod:

object p1, p2;
bool dist;
p1 = radar(AlienWasp);
p2 = radar(PowerCaptor);
dist = Dist(p1, p2, 100);
if(dist == true) costam;
else costam;

Liczy odleglosc os od odgromnikow, jesli najmniejsza mozliwa odleglosc osy od odgromnika (to znaczy osy najblizszej odgromnika) bedzie mniejsza niz 100m, to dobry powod do wyslania eskadry dzial latajacych ;]

colobotwymiiata - 28-03-2009, 01:11

No teraz rozumiem :-D przydatne nawet
DemoLisH - 28-03-2009, 14:06

hehehehe, a ja się tak śmieję głupio bo jej nie rozumiem

Kod:
object p1, p2;

p1 = radar(AlienWasp);
p2 = radar(PowerCaptor);

if (distance(p1.position,p2.position)<jakasodleglosc)
{
costam;
}


i czym to się różni

Berserker - 28-03-2009, 14:36

Masz:
Kod:
BOT  WIEZA      MROWKA WIEZA         MROWKA   WIEZA

Dzieki temu twojemu kodowi bot obliczy odleglosc miedzy najblizsza/najdalsza mrowka i najblizsza/najdalsza mrowka. Moja funkcja obliczy odleglosc kazdej mrowki od kazdej wiezy i wybierze najmniejsza. ;]


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