Problem mit dem Bewegen eines Objekts
- gff
- Profi-Abenteurer
- Beiträge: 802
- Registriert: 09.03.2004, 18:49
- Wohnort: Ge
- Kontaktdaten:
Problem mit dem Bewegen eines Objekts
Auf solche Probleme scheine ich ein Patent zu haben
Also:
Mein Objekt soll mehrere Koordianten anlaufen:
object[0].Move(124, 82, -5);
object[0].Move(129, 68, -5);
object[0].Move(150, 65, -5);
object[0].Move(162, 67, -5);
object[0].Move(170, 72, -5);
object[0].Move(174, 74, -5);
object[0].Move(175, 87, -5);
object[0].Move(175, 200, -5);
object[0].Move(173, 209, -5);
object[0].Move(173, 224, -5);
object[0].Move(168, 230, -5);
object[0].Move(163, 236, -5);
object[0].Move(160, 238, -5);
object[0].Move(150, 239, -5);
object[0].Move(136, 231, -5);
object[0].Move(129, 226, -5);
object[0].Move(127, 222, -5);
object[0].Move(124, 218, -5);
object[0].Move(124, 200, -5);
Das Problem ist hier daß sofort die letzte Koordinate angesteuert wird.Setze ich eBlock ein,tut das Objekt was es soll.Nur hat der Spieler keine Kontrolle mehr.Die soll er aber behalten können.
Dann kam ich auf den Gedanken statt des Objekts einen Charakter zu nehmen.Denn der besitzt eine Waypointfunktion.Dabei taucht aber das Problem auf daß er sich nicht genau an die vorgeschriebene Bahn hält.Er ist parallel etwas verschoben und bewegt sich nicht so regelmäßig wie ein Objekt...
Ich habe schon in der Hilfe,hier auf dem Treff und im AGS Forum von adventuregamestudio.co.uk nachgeschaut.Aber eine Waypointfunktion für Objekte habe ich nicht gefunden.
Also:
Mein Objekt soll mehrere Koordianten anlaufen:
object[0].Move(124, 82, -5);
object[0].Move(129, 68, -5);
object[0].Move(150, 65, -5);
object[0].Move(162, 67, -5);
object[0].Move(170, 72, -5);
object[0].Move(174, 74, -5);
object[0].Move(175, 87, -5);
object[0].Move(175, 200, -5);
object[0].Move(173, 209, -5);
object[0].Move(173, 224, -5);
object[0].Move(168, 230, -5);
object[0].Move(163, 236, -5);
object[0].Move(160, 238, -5);
object[0].Move(150, 239, -5);
object[0].Move(136, 231, -5);
object[0].Move(129, 226, -5);
object[0].Move(127, 222, -5);
object[0].Move(124, 218, -5);
object[0].Move(124, 200, -5);
Das Problem ist hier daß sofort die letzte Koordinate angesteuert wird.Setze ich eBlock ein,tut das Objekt was es soll.Nur hat der Spieler keine Kontrolle mehr.Die soll er aber behalten können.
Dann kam ich auf den Gedanken statt des Objekts einen Charakter zu nehmen.Denn der besitzt eine Waypointfunktion.Dabei taucht aber das Problem auf daß er sich nicht genau an die vorgeschriebene Bahn hält.Er ist parallel etwas verschoben und bewegt sich nicht so regelmäßig wie ein Objekt...
Ich habe schon in der Hilfe,hier auf dem Treff und im AGS Forum von adventuregamestudio.co.uk nachgeschaut.Aber eine Waypointfunktion für Objekte habe ich nicht gefunden.
- Furymars
- Süßwasserpirat
- Beiträge: 485
- Registriert: 13.06.2006, 20:45
- Wohnort: Adventure Treff
- KhrisMUC
- Adventure-Gott
- Beiträge: 4674
- Registriert: 14.03.2005, 00:55
- Wohnort: München
Wait(), wenn es non-blocking ablaufen soll...?
gff:
Du brauchst etwas in der Art:
x[] und y[] sind arrays, die DU z.B. in game_start festlegst.
Der Code funktioniert eventuell so nicht sofort, da object[0].Moving nicht "schnell genug" true zurückliefert. Einfach ausprobieren.
Es gab mal vor längerer Zeit einen ähnlichen thread, ich kann ihn aber gerade nicht finden.
gff:
Du brauchst etwas in der Art:
Code: Alles auswählen
int k_index;
repeatedly_execute() {
if (!object[0].Moving) {
object[0].Move(x[k_index], y[k_index], -5);
k_index++;
if (k_index==15) k_index=0;
}
}
Der Code funktioniert eventuell so nicht sofort, da object[0].Moving nicht "schnell genug" true zurückliefert. Einfach ausprobieren.
Es gab mal vor längerer Zeit einen ähnlichen thread, ich kann ihn aber gerade nicht finden.
Use gopher repellent on funny little man
- gff
- Profi-Abenteurer
- Beiträge: 802
- Registriert: 09.03.2004, 18:49
- Wohnort: Ge
- Kontaktdaten:
- KhrisMUC
- Adventure-Gott
- Beiträge: 4674
- Registriert: 14.03.2005, 00:55
- Wohnort: München
k_index zählt die Wegpunkte durch.
Jetzt klar?
Code: Alles auswählen
int x[20], y[20];
function game_start() {
x[0]=124; y[0]=82;
x[1]=129; y[1]=68;
x[2]=150; y[2]=65;
x[3]=162; y[3]=67;
...
}
Use gopher repellent on funny little man
- gff
- Profi-Abenteurer
- Beiträge: 802
- Registriert: 09.03.2004, 18:49
- Wohnort: Ge
- Kontaktdaten:
- KhrisMUC
- Adventure-Gott
- Beiträge: 4674
- Registriert: 14.03.2005, 00:55
- Wohnort: München
Genau.
Der Code sollte übrigens doch funktionieren.
Ich hatte da was verwechselt; Probleme gibt es nicht, wenn man Object.Moving testet, sondern nur, wenn man die momentane Position hernimmt (da sich das Objekt evtl. theoretisch bereits bewegt, aber immer noch die gleiche X-Koordinate hat.)
Hat es denn geklappt?
Der Code sollte übrigens doch funktionieren.
Ich hatte da was verwechselt; Probleme gibt es nicht, wenn man Object.Moving testet, sondern nur, wenn man die momentane Position hernimmt (da sich das Objekt evtl. theoretisch bereits bewegt, aber immer noch die gleiche X-Koordinate hat.)
Hat es denn geklappt?
Use gopher repellent on funny little man
- gff
- Profi-Abenteurer
- Beiträge: 802
- Registriert: 09.03.2004, 18:49
- Wohnort: Ge
- Kontaktdaten:
- gff
- Profi-Abenteurer
- Beiträge: 802
- Registriert: 09.03.2004, 18:49
- Wohnort: Ge
- Kontaktdaten:
Re: Problem mit dem Bewegen eines Objekts
Zuallerst:Ich entschuldige mich diesen Zombie in Threadgestalt auferstehen zu lassen.
Doch ich begreife nicht mehr was passiert.Mit der Hilfe in diesem Thema hier habe ich damals tatsächlich meine Objekte zum laufen gebracht.
Nun wollte ich das wiederholen und stoße auf massive Probleme!Situation:
eine Paternosteranlage mit 10 Kabinen(ich mag halt Paternoster^^) die Objekte sind.
Im global script die Koordinaten:
und unten exportiert.
Dann im Raumscript:
Manchmal tun die Kabinen was sie sollen.Sie fahren links hoch,machen einen Bogen und fahren rechts runter,machen unten den Bogen und fahren links nach oben.Dann aber fangen sie an durchzudrehen.Manche fahren einfach weiter nach oben,verschwinden vom Bildschirm(!!!) und nehmen dann die Linke Route zurück.
Ich sehe momentan nicht wie ich den Fehler beheben könnte
Kann mir einer jemand weiterhelfen? [-o<
Doch ich begreife nicht mehr was passiert.Mit der Hilfe in diesem Thema hier habe ich damals tatsächlich meine Objekte zum laufen gebracht.
Nun wollte ich das wiederholen und stoße auf massive Probleme!Situation:
eine Paternosteranlage mit 10 Kabinen(ich mag halt Paternoster^^) die Objekte sind.
Im global script die Koordinaten:
Code: Alles auswählen
// main global script file
int x[14];
int y[14];
#sectionstart game_start // DO NOT EDIT OR REMOVE THIS LINE
function game_start() {
// called when the game starts, before the first room is loaded
x[0]=125; y[0]=724; //links 1
x[1]=125; y[2]=586; //links 2
x[2]=125; y[2]=450; //links 3
x[3]=125; y[3]=311; //links 4
x[4]=128; y[4]=174; //links oben5w
x[5]=312; y[5]=288; //mitte oben6
x[6]=181; y[6]=181; //rechts oben7
x[7]=181; y[7]=311; //rechts 1
x[8]=181; y[8]=499; //rechst2
x[9]=181; y[9]=586; //rechts3
x[10]=181; y[10]=724; //rechts4
x[11]=181; y[11]=860; //rechts unten
x[12]=153; y[12]=875; //mitte unten
x[13]=125; y[13]=855; //unten links
Dann im Raumscript:
Code: Alles auswählen
import int y[14];
import int x[14];
int pat2=0,pat3=0,pat4=0,pat5=0,pat6=0,pat7=0,pat8=0,pat9=0,pat10=0,pat11=0;
#sectionstart repeatedly_execute_always // DO NOT EDIT OR REMOVE THIS LINE
function repeatedly_execute_always()
{
//object 2
if(!object[2].Moving)
{
object[2].Move(x[pat2],y[pat2],-2);
pat2++;
if(pat2==14)
{
pat2=0;
}
}
//Object 3
else if(!object[3].Moving)
{
object[3].Move(x[pat3],y[pat3],-4);
pat3++;
if(pat3==14)
{
pat3=0;
}
}
//Object 4
else if(!object[4].Moving)
{
object[4].Move(x[pat4],y[pat4],-4);
pat4++;
if(pat4==14)
{
pat4=0;
}
}
//Object 5
else if(!object[5].Moving)
{
object[5].Move(x[pat5],y[pat5],-4);
pat5++;
if(pat5==14)
{
pat5=0;
}
}
//Object 6
else if(!object[6].Moving)
{
object[6].Move(x[pat6],y[pat6],-4);
pat6++;
if(pat6==14)
{
pat6=0;
}
}
//Object 7
else if(!object[7].Moving)
{
object[7].Move(x[pat7],y[pat7],-4);
pat7++;
if(pat7==14)
{
pat7=0;
}
}
//Object 8
//else
if(!object[8].Moving)
{
object[8].Move(x[pat8],y[pat8],-2);
pat8++;
if(pat8==14)
{
pat8=0;
}
}
//Object 9
else if(!object[9].Moving)
{
object[9].Move(x[pat9],y[pat9],-4);
pat9++;
if(pat9==14)
{
pat9=0;
}
}
//Object 10
else if(!object[10].Moving)
{
object[10].Move(x[pat10],y[pat10],-4);
pat10++;
if(pat10==14)
{
pat10=0;
}
}
//Object 11
else if(!object[11].Moving)
{
object[11].Move(x[pat10],y[pat10],-4);
pat10++;
if(pat11==14)
{
pat11=0;
}
}
Ich sehe momentan nicht wie ich den Fehler beheben könnte
Kann mir einer jemand weiterhelfen? [-o<
- KhrisMUC
- Adventure-Gott
- Beiträge: 4674
- Registriert: 14.03.2005, 00:55
- Wohnort: München
Re: Problem mit dem Bewegen eines Objekts
1. Warum immer "else if"? So wird pro loop nur immer höchstens eine Kabine weitergeschickt, falls sie stehengeblieben ist.
2. object[11] benutzt in Deinem Code pat 10.
3. Ein int ist von Haus aus 0.
4.
5. Warum ist y von mitte oben 288?
Ich würde eine Funktion schreiben, die die Position in Abhängigkeit von einem Index liefert. D.h. man übergibt der Funktion eine Zeit t, die vergangen ist, und die Funktion liefert die Koordinaten zurück, an denen sich die Kabine auf der ovalen Spur befindet.
Sagen wir, eine Kabine braucht 5 Minuten, zwei nach oben, 30s rüber, zwei nach unten, 30s rüber:
Dann setzt Du Zeitindizes der zehn Kabinen fest, mit gleichen Abständen. Bei 5 Minuten also alle 30 Sekunden.
So bekommst Du schöne Kreisbögen und kannst außerdem die Zahl der Kabinen schnell und einfach ändern.
Die Geschwindigkeit legst Du fest, indem Du t pro soundsoviel Loops um Eins hochzählst.
2. object[11] benutzt in Deinem Code pat 10.
3. Ein int ist von Haus aus 0.
4.
Code: Alles auswählen
int pat[12];
// hier pat[x] definieren
#sectionstart repeatedly_execute_always // DO NOT EDIT OR REMOVE THIS LINE
function repeatedly_execute_always() {
int i=2;
while (i<12) { // i: 2-11
if(!object[i].Moving) {
object[i].Move(x[pat[i]],y[pat[i]],-2);
pat[i]++;
if (pat[i]==14) pat[i]=0;
}
i++;
}
}
Ich würde eine Funktion schreiben, die die Position in Abhängigkeit von einem Index liefert. D.h. man übergibt der Funktion eine Zeit t, die vergangen ist, und die Funktion liefert die Koordinaten zurück, an denen sich die Kabine auf der ovalen Spur befindet.
Sagen wir, eine Kabine braucht 5 Minuten, zwei nach oben, 30s rüber, zwei nach unten, 30s rüber:
Code: Alles auswählen
int kx, ky;
function GetPosition(int s) {
if (s<120) { // linke Seite: (125;724) bis (125;311)
kx = 125;
ky = 724 - (s*(724-311))/120;
return;
}
if (s<150) { // oberer Bogen (125;311) bis (181;311)
kx = 153 - FloatToInt(28.0 * Maths.cos(Maths.DegreesToRadians((s-120.0)*6.0));
ky = 311 - FloatToInt(28.0 * Maths.sin((Maths.DegreesToRadians((s-120.0)*6.0));
return;
}
if (s<270) { // rechte Seite: (181;311) bis (181;724)
kx = 181;
ky = 311 + ((s-150)*(724-311))/120;
return;
}
if (s<300) { // unterer Bogen (125;311) bis (181;311)
kx = 153 + FloatToInt(28.0 * Maths.cos(Maths.DegreesToRadians((s-270.0)*6.0));
ky = 724 + FloatToInt(28.0 * Maths.sin((Maths.DegreesToRadians((s-270.0)*6.0));
return;
}
}
Code: Alles auswählen
#sectionstart repeatedly_execute_always // DO NOT EDIT OR REMOVE THIS LINE
function repeatedly_execute_always() {
int i;
while (i<10) {
int kt = t + i*30; // kabine 4 = zeit + 120 Sekunden
if (kt>=300) kt-=300; // innerhalb von 0-299 bleiben
GetPosition(kt); // Position auf der Spur berechnen
object[i+2].SetPosition(kx, ky); // Kabine platzieren
i++;
}
}
Die Geschwindigkeit legst Du fest, indem Du t pro soundsoviel Loops um Eins hochzählst.
Use gopher repellent on funny little man
- gff
- Profi-Abenteurer
- Beiträge: 802
- Registriert: 09.03.2004, 18:49
- Wohnort: Ge
- Kontaktdaten:
Re: Problem mit dem Bewegen eines Objekts
Das ist jetzt ein gänzlich anderer Ansatz.Damit geht es einfacher und kürzer.Ich werd das auf jeden Fall noch probieren!
Derweil hab ich weiter nach dem Fehler gesucht und tatsächlich einen riesigen Kaventsmann gefunden.
Im Script oben gibt es insgesamt nur ein Array.In diesem Array ist immer die Position links die erste.Das ist aber totaler Unsinn weil z.B. das Objekt oben rechts andere Startkoordinaten braucht!!Ich habe also für jede Kabine ein array angelegt.Dann fiel mir auf daß die Positionen der Kabinen falsch ist.Wenn Kabine 1 auf den Koordinaten 12/12 liegt darf sie nicht die Anweisung bekommen auf die Koordinaten 12/12 zu gehen.Das habe ich einfach dadurch gelöst daß ich die Kabinen je eine Position vor ihren richtigen Positionen plaziert habe.Das ist natürlich höllisch umständlich und viel C&P Arbeit-funktioniert aber zum Großteil
Derweil hab ich weiter nach dem Fehler gesucht und tatsächlich einen riesigen Kaventsmann gefunden.
Im Script oben gibt es insgesamt nur ein Array.In diesem Array ist immer die Position links die erste.Das ist aber totaler Unsinn weil z.B. das Objekt oben rechts andere Startkoordinaten braucht!!Ich habe also für jede Kabine ein array angelegt.Dann fiel mir auf daß die Positionen der Kabinen falsch ist.Wenn Kabine 1 auf den Koordinaten 12/12 liegt darf sie nicht die Anweisung bekommen auf die Koordinaten 12/12 zu gehen.Das habe ich einfach dadurch gelöst daß ich die Kabinen je eine Position vor ihren richtigen Positionen plaziert habe.Das ist natürlich höllisch umständlich und viel C&P Arbeit-funktioniert aber zum Großteil
- KhrisMUC
- Adventure-Gott
- Beiträge: 4674
- Registriert: 14.03.2005, 00:55
- Wohnort: München
Re: Problem mit dem Bewegen eines Objekts
Moment, auch mit deinem Ansatz geht das problemlos.
Die erste Kabine startet bei position 1 (also x[1], y[1]), die nächste bei 2, usw.
Jede Kabine hat ihre eigene Variable (pat2 - pat11), in der die momentane Position gespeichert wird. Bei Erreichen eines Wegpunktes wird die Position eins hochgezählt oder an den Anfang zurückgesetzt. Damit laufen alle Kabinen unabhängig voneinander die Bahn ab.
Einziges Problem: die Kabinen laufen nicht total synchron, wenn sie für einzelne Abschnitte unterschiedlich lange brauchen.
Außerdem fiel mir auf, dass du die pat-Variable von jeder Kabine bei 0 starten lässt, nicht bei 0, 1, 2, usw. Ich bin aber davon ausgegangen, dass Du diesen Codeteil nicht gepostet hast.
Die erste Kabine startet bei position 1 (also x[1], y[1]), die nächste bei 2, usw.
Jede Kabine hat ihre eigene Variable (pat2 - pat11), in der die momentane Position gespeichert wird. Bei Erreichen eines Wegpunktes wird die Position eins hochgezählt oder an den Anfang zurückgesetzt. Damit laufen alle Kabinen unabhängig voneinander die Bahn ab.
Einziges Problem: die Kabinen laufen nicht total synchron, wenn sie für einzelne Abschnitte unterschiedlich lange brauchen.
Außerdem fiel mir auf, dass du die pat-Variable von jeder Kabine bei 0 starten lässt, nicht bei 0, 1, 2, usw. Ich bin aber davon ausgegangen, dass Du diesen Codeteil nicht gepostet hast.
Use gopher repellent on funny little man
- gff
- Profi-Abenteurer
- Beiträge: 802
- Registriert: 09.03.2004, 18:49
- Wohnort: Ge
- Kontaktdaten:
Re: Problem mit dem Bewegen eines Objekts
Damit hatte ich auch experimentiert.Deshalb waren oben alle Variablen auf Null gesetzt.Das ist quasi der Rest der von den Experimenten übrig geblieben ist.Wollte einfach nicht immer wieder =xxx; neu hinschreiben...
Aber wenn Du sagst das ganze läuft problemlos(also das oben gepostete Script) machst Du was anders als ich.Funktioniert ja von der Logik her schon nicht das eine Kabine rechts oben erst brav nach unten fährt und dann links nach oben.In so einem Fall suchen sich die Biester ihren eigenen Weg .
Ich glaube ich lad den Raum mal hoch,damit du sehen kannst wie es momentan aussieht.Wäre das in Ordnung?
Aber wenn Du sagst das ganze läuft problemlos(also das oben gepostete Script) machst Du was anders als ich.Funktioniert ja von der Logik her schon nicht das eine Kabine rechts oben erst brav nach unten fährt und dann links nach oben.In so einem Fall suchen sich die Biester ihren eigenen Weg .
Ich glaube ich lad den Raum mal hoch,damit du sehen kannst wie es momentan aussieht.Wäre das in Ordnung?
- KhrisMUC
- Adventure-Gott
- Beiträge: 4674
- Registriert: 14.03.2005, 00:55
- Wohnort: München
Re: Problem mit dem Bewegen eines Objekts
Wenn Du sowieso zu meinem Vorschlag wechseln willst, ist es wahrscheinlich besser, wenn ich stattdessen die Quelldatein zu dem Testspiel hochlade, das ich gerade mache.
Es müsste heute abend fertig sein.
Es müsste heute abend fertig sein.
Use gopher repellent on funny little man
- KhrisMUC
- Adventure-Gott
- Beiträge: 4674
- Registriert: 14.03.2005, 00:55
- Wohnort: München
Re: Problem mit dem Bewegen eines Objekts
Use gopher repellent on funny little man