Problem mit dem Bewegen eines Objekts

Fragen zu "Adventure Game Studio"? Hier rein!
Antworten
Benutzeravatar
gff
Profi-Abenteurer
Profi-Abenteurer
Beiträge: 802
Registriert: 09.03.2004, 18:49
Wohnort: Ge
Kontaktdaten:

Problem mit dem Bewegen eines Objekts

Beitrag von gff »

Auf solche Probleme scheine ich ein Patent zu haben :wink:
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.
Benutzeravatar
Furymars
Süßwasserpirat
Süßwasserpirat
Beiträge: 485
Registriert: 13.06.2006, 20:45
Wohnort: Adventure Treff

Beitrag von Furymars »

Versuch es mal mit :

objeobject[0].Move(124, 82, -5);
Wait(10);
object[0].Move(129, 68, -5);
Wait(10);
object[0].Move(150, 65, -5);
Wait(10);
object[0].Move(162, 67, -5);
Wait(10);
.....
und bei den restlichen auch!
Angekündigte Spiele:
MMM : "Nicht ohne meinen Hamster!"
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Wait(), wenn es non-blocking ablaufen soll...? :roll:

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;
  }
}
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.
Use gopher repellent on funny little man
Benutzeravatar
gff
Profi-Abenteurer
Profi-Abenteurer
Beiträge: 802
Registriert: 09.03.2004, 18:49
Wohnort: Ge
Kontaktdaten:

Beitrag von gff »

Ich verstehe gerade den Sinn von k_index nicht :shock:
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

k_index zählt die Wegpunkte durch.

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;
  ...
}
Jetzt klar?
Use gopher repellent on funny little man
Benutzeravatar
gff
Profi-Abenteurer
Profi-Abenteurer
Beiträge: 802
Registriert: 09.03.2004, 18:49
Wohnort: Ge
Kontaktdaten:

Beitrag von gff »

Ah so!K_index zählt hoch bis zur gewünschten Zahl.Und so oft erhält das Objekt neue Koordinaten. 8)
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

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?
Use gopher repellent on funny little man
Benutzeravatar
gff
Profi-Abenteurer
Profi-Abenteurer
Beiträge: 802
Registriert: 09.03.2004, 18:49
Wohnort: Ge
Kontaktdaten:

Beitrag von gff »

Edit 27.0.2007:

Jau,jetzt geht es^^
Hatte das ++ vergessen :oops:
Benutzeravatar
gff
Profi-Abenteurer
Profi-Abenteurer
Beiträge: 802
Registriert: 09.03.2004, 18:49
Wohnort: Ge
Kontaktdaten:

Re: Problem mit dem Bewegen eines Objekts

Beitrag von gff »

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 :wink: 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
und unten exportiert.
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;
	} 
}
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 :oops:
Kann mir einer jemand weiterhelfen? [-o<
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Re: Problem mit dem Bewegen eines Objekts

Beitrag von KhrisMUC »

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.

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++;
  }
}
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:

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;
  }
}
Dann setzt Du Zeitindizes der zehn Kabinen fest, mit gleichen Abständen. Bei 5 Minuten also alle 30 Sekunden.

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++;
  }
}
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.
Use gopher repellent on funny little man
Benutzeravatar
gff
Profi-Abenteurer
Profi-Abenteurer
Beiträge: 802
Registriert: 09.03.2004, 18:49
Wohnort: Ge
Kontaktdaten:

Re: Problem mit dem Bewegen eines Objekts

Beitrag von gff »

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
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Re: Problem mit dem Bewegen eines Objekts

Beitrag von KhrisMUC »

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.
Use gopher repellent on funny little man
Benutzeravatar
gff
Profi-Abenteurer
Profi-Abenteurer
Beiträge: 802
Registriert: 09.03.2004, 18:49
Wohnort: Ge
Kontaktdaten:

Re: Problem mit dem Bewegen eines Objekts

Beitrag von gff »

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 :wink: .
Ich glaube ich lad den Raum mal hoch,damit du sehen kannst wie es momentan aussieht.Wäre das in Ordnung?
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Re: Problem mit dem Bewegen eines Objekts

Beitrag von KhrisMUC »

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.
Use gopher repellent on funny little man
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Re: Problem mit dem Bewegen eines Objekts

Beitrag von KhrisMUC »

Neuer Beitrag zwecks Bump.

Paternoster-Demo
(für AGS 3.0!)
Use gopher repellent on funny little man
Antworten