My super move is not so super after all. - Printable Version +- Colobot Forum - International Colobot Community (https://colobot.info/forum) +-- Forum: [Archive] New forum (2015-2019) (https://colobot.info/forum/forumdisplay.php?fid=76) +--- Forum: Colobot: Gold Edition Basics (https://colobot.info/forum/forumdisplay.php?fid=58) +---- Forum: Help (https://colobot.info/forum/forumdisplay.php?fid=61) +---- Thread: My super move is not so super after all. (/showthread.php?tid=913) My super move is not so super after all. - Quartofel - 03-27-2017 Code:```extern void object::Main() {     move(5);     smove(5); } void object::smove(int dist) {     point b = chkpos(dist), pos = this.position;     //while(distance2d(b, this.position)>1) //Y U NO WORK        while(true)     {         point c = chkpos(20);         if(topo(c)>this.position.z){motor(0.1,0.1); adjalt(7,8);}         else{motor(1,1);adjalt(4,5);}     } } void object::adjalt(int min, int max) {     int alt = this.altitude;     if(altmax){while(alt>max){jet(-0.65);alt = this.altitude;}}     if(alt<1 && altmin){motor(0.2, 0.2); jet(1);alt = this.altitude;}}     jet(0); } point object::chkpos(int c) //winny bledow przy przelotach w okolicy wysokich struktur {     int a, b, ori = this.orientation;     point t = this.position, p;     if(0 <= ori && ori <= 90){ori = 90 - ori; a = c*cos(ori); b = c*sin(ori); p.x=(t.x+a); p.y=(t.y+b);} //I     if(90 <= ori && ori <= 180){ori = 180 - ori;a = c*cos(ori); b = c*sin(ori); p.x=(t.x-a); p.y=(t.y+b);} // II     if(180 <= ori && ori <= 270){ori = 270 - ori;a = c*cos(ori); b = c*sin(ori); p.x=(t.x-a); p.y=(t.y-b);} //III     if(270 <= ori && ori <= 360){ori = 360 - ori;a = c*cos(ori); b = c*sin(ori); p.x=(t.x+a); p.y=(t.y-b);} //IV     p.z = topo(p);     return p; }```I've tried everything I could. It should slow down and ascend higher if encountered terrain higher than it's altitude. Written for wasp. Help, I don't know what's wrong ;-; It won't go for set distance, and sometimes it climbs obstacles properly, sometimes don't. Don't know why. RE: My super move is not so super after all. - krzys_h - 03-27-2017 What is the chkpos function supposed to actually do? Return a point c meters in front of the robot? (I'm too lazy to try to understand the whole code ) If so... why not just Code:```point object::chkpos(int c) {    point p;    p.x = this.position.x + cos(this.orientation) * c;    p.y = this.position.y + sin(this.orientation) * c;    p.z = topo(p);    return p; }``` I can't see any other immediate problems, other than the way you do the altitude choice could probably be done better - I'd just let the wasp stay at around z=max(topo(this.position), chkpos(20))+some_arbitrary_altitude_above_ground. Anyway, your code seems to work fine for me, unless you have some level with terrain changes big enough for it to break. RE: My super move is not so super after all. - Mrocza - 03-28-2017 It seems needlessly complicated to me for some reason. You can use the wasp's velocity with the chkpos() to return a point x seconds in front of it. Then adjust the motor to the ratio of these two points' topo(). For jet() I always do a single line: Code:`jet(( targetPosZ - this.position.z ) / smoothingFactor)` RE: My super move is not so super after all. - krzys_h - 03-28-2017 (03-28-2017, 07:57 AM)Mrocza Wrote: You can use the wasp's velocity with the chkpos() to return a point x seconds in front of it.Oh, I totally forgot object.velocity is now a thing... and I'm the one who implemented it This solution would be even better probably