Backwards animation

Fragen zu "Adventure Game Studio"? Hier rein!
Antworten
Benutzeravatar
DieFüchsin
Adventure-Gott
Adventure-Gott
Beiträge: 4406
Registriert: 12.03.2004, 16:55

Backwards animation

Beitrag von DieFüchsin »

Für mein Zahnradrätsel muss ich die Räder natürlich animieren. Für die animation reicht ein Loop natürlich nicht.
Jetzt hab ich das Problem, dass beim rückwärtsanimieren nur bei der ersten Animation alle Loops benutzt werden. Wiederholt sich die Animation (mit Repeat) dann wird nur noch der letzte Loop benutzt. Lässt sich da irgendwas machen? :(
Danke, Adventuretreff! <3
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Du könntest die Zahnräder von Hand animieren.
Use gopher repellent on funny little man
Benutzeravatar
DieFüchsin
Adventure-Gott
Adventure-Gott
Beiträge: 4406
Registriert: 12.03.2004, 16:55

Beitrag von DieFüchsin »

Wie das?
Danke, Adventuretreff! <3
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Einen Array anlegen, der die Nummern der Sprites enthält, dann mit Object.Graphic, Wait() und einer while-Schleife selbst animieren.

Andere Möglichkeit:
Du nimmst eine zweite View für die Rückwärtsanimation. D.h. statt mit eBackwards animierst Du normal vorwärts, aber die Sprites sind in der umgekehrten Reihenfolge in den Loops der View.
Use gopher repellent on funny little man
Benutzeravatar
DieFüchsin
Adventure-Gott
Adventure-Gott
Beiträge: 4406
Registriert: 12.03.2004, 16:55

Beitrag von DieFüchsin »

ah ja ok das werd ich versuchen, danke dir.
Danke, Adventuretreff! <3
Benutzeravatar
DieFüchsin
Adventure-Gott
Adventure-Gott
Beiträge: 4406
Registriert: 12.03.2004, 16:55

Beitrag von DieFüchsin »

kann ich die animation eigentlich bei einem bestimmten frame anhalten und von dort wieder starten?
Danke, Adventuretreff! <3
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Ich dachte mir schon, dass die Frage kommt ;)

Anhalten wäre möglich, z.B. so:

Code: Alles auswählen

int stop_at=-1;

// rep_ex
if (stop_at>0  && rad1.Frame==stop_at) rad1.StopAnimating();

...

stop_at=6;
rad1.Animate(...);
Ab da weiterlaufen lassen ist aber nur mit .Animate nicht möglich.

Ich würde es wirklich von Hand animieren.
Use gopher repellent on funny little man
Benutzeravatar
DieFüchsin
Adventure-Gott
Adventure-Gott
Beiträge: 4406
Registriert: 12.03.2004, 16:55

Beitrag von DieFüchsin »

und ich dachte mir, dass du das sagen würdest... ;)

nun ja, dann muss ich wohl in den sauren apfel beißen
Danke, Adventuretreff! <3
Benutzeravatar
DieFüchsin
Adventure-Gott
Adventure-Gott
Beiträge: 4406
Registriert: 12.03.2004, 16:55

Beitrag von DieFüchsin »

khrismuc hat geschrieben:Einen Array anlegen, der die Nummern der Sprites enthält, dann mit Object.Graphic, Wait() und einer while-Schleife selbst animieren.
also für 12 aufeinanderfolgende sprites schreib ich dann

int sprite[12]

oder?

Was hat das wait damit zu tun, nach jeder Bildweiterbewegung x Loops warten oder was?
Danke, Adventuretreff! <3
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Genau.
int sprite[12] legt sprite[0] - sprite[11] an, denen weist Du die Nummern der Animationsframes aus dem Spritemanager zu.
Use gopher repellent on funny little man
Benutzeravatar
DieFüchsin
Adventure-Gott
Adventure-Gott
Beiträge: 4406
Registriert: 12.03.2004, 16:55

Beitrag von DieFüchsin »

hmmm kann ich sie denn so auch alle gleichzeitig animieren? wait hält doch das ganze an, oder?
Danke, Adventuretreff! <3
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Du musst einfach alle Zahnräder drehen, bevor Du Wait() aufrufst.

Code: Alles auswählen

// script header
struct radstruct {
  int sprite[50];    // spritenummern
  int pos;        // position
  int zaehne;     // anzahl zähne
}

// global script
radstruct rad[5];

function init_raeder() {
  int r=1;
  int c;

  rad[1].zaehne=6; rad[1].pos=1;
  rad[2].zaehne=10; rad[2].pos=Random(5)+2;
  ...

  while(r<=4) {  // vier Räder
    c=1;
    while(c<=rad[r].zaehne) {
      if (r==1) rad[r].sprite[c]=120+c;   // rad 1: sprites 121-126
      if (r==2) rad[r].sprite[c]=127+c;   // rad 2: sprites 127-136
      ...
      c++;
    }
    r++;
  }
}

function rad_drehen(int r, bool rechts) {
  if (rechts) rad[r].pos++;
  else rad[r].pos--;
  
  if (rad[r].pos==0) rad[r].pos=rad[r].zaehne;
  if (rad[r].pos==rad[r].zaehne+1) rad[r].pos=1;

  object[r].Graphic=rad[r].sprite[rad[r].pos];  // rad1=object1, usw.
}

function raeder_drehen() {
  rad_drehen(1, true);
  rad_drehen(2, false);
  rad_drehen(3, true);
  rad_drehen(4, false);
}

// gamestart
init_raeder();
Wenn Du jetzt raeder_drehen aufrufst, drehen sich alle Zahnräder einen Zahn weiter. Die Schleife, die die Räder dreht, ruft abwechselnd die Funktion und Wait(x); auf.

Elegant wäre es natürlich, wenn w mit der Zeit größer wird, sodass die Drehung sich verlangsamt (Schwung läßt nach).
Use gopher repellent on funny little man
Benutzeravatar
DieFüchsin
Adventure-Gott
Adventure-Gott
Beiträge: 4406
Registriert: 12.03.2004, 16:55

Beitrag von DieFüchsin »

Was meinst du mit "vier Räder"?

Welche Positionen können die verschiedenen Räder zufällig annehmen, dass die Kombination am Schluss stimmt?
Danke, Adventuretreff! <3
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Vier Räder sollte nur erklären, dass die äußere Schleife deswegen viermal durchlaufen wird (r<=4), wenn Du mehr Zahnräder hast, musst Du die entsprechende Anzahl dort eintragen.

An die Startposition hab ich nicht gedacht, stimmt, das kann auf blöd unlösbar werden.
Füg das ein, nachdem alle rad[x].zaehne definiert wurden:

Code: Alles auswählen

  rad[1].pos=1;  // alles auf Lösungsposition
  rad[2].pos=1;
  rad[3].pos=1;
  ...

  int t=Random(50)+20;  // 140-190 Zähne zur Lösung
  while(r<=t) {
    raeder_drehen();
    r++;
  }
  r=1;
Dazu musst Du die init_raeder() unter die raeder_drehen() verschieben.
Use gopher repellent on funny little man
Benutzeravatar
DieFüchsin
Adventure-Gott
Adventure-Gott
Beiträge: 4406
Registriert: 12.03.2004, 16:55

Beitrag von DieFüchsin »

ok, danke
Danke, Adventuretreff! <3
Antworten