Blödes Blocking

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

Blödes Blocking

Beitrag von DieFüchsin »

Ich hab ein Problem mit "player.Walk(x,y,eBlock,eWalkableAreas)".

Und zwar wird mit diesem Befehl eine Tür angesteuert, die danach von der Spielfigur geöffnet wird.
Auf dem Weg zur Tür kreuzt man jedoch eine Region, die eine Animation auslöst (ein Perlenvorhang bewegt sich, sobald man durchläuft).
Das eBlock verhindert nun aber die Vorhanganimation und lässt den Vorhang erst wedeln, wenn die Tür geöffnet wurde.

Ohne eBlock läuft die Spielfigur aber gar nicht erst bis zur Tür sondern diese öffnet sich sofort.

Ich habs schon mit "eNoBlock" und "while (player.walking) wait(1)" versucht, aber das hatte den gleichen Effekt.


Auch das Einsetzen des Befehls in "Repeatedly Execute" (if(player.y== amvorhang)) bringt nichts.


Hat noch jemand eine Idee, wie der Vorhang trotz "eBlock" aktiviert werden kann?
Danke, Adventuretreff! <3
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Re: Blödes Blocking

Beitrag von KhrisMUC »

Mit repeatedly_execute_always sollte es klappen.
Use gopher repellent on funny little man
Benutzeravatar
DieFüchsin
Adventure-Gott
Adventure-Gott
Beiträge: 4406
Registriert: 12.03.2004, 16:55

Re: Blödes Blocking

Beitrag von DieFüchsin »

Hmm das ist auch nicht das Gelbe vom Ei - das Betreten der Koordinaten wird nicht rechtzeitig erkannt und der Vorhang wedelt nur wenn er Lust hat.
Danke, Adventuretreff! <3
pikubik
Verpackungs-Wegwerfer
Verpackungs-Wegwerfer
Beiträge: 76
Registriert: 09.04.2006, 17:51
Kontaktdaten:

Re: Blödes Blocking

Beitrag von pikubik »

du könntest diese Funktion hier einbauen...

vielleicht gehts dann ja, hab aber keine ahnung ob das funktioniert
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Re: Blödes Blocking

Beitrag von KhrisMUC »

Das nützt leider auch nicht viel, da MovePlayer genauso blocking ist, nur halt "manuell".

Ich werd bei Gelegenheit mal was versuchen, was mir im Hinterkopf rumschwebt, hab nur grad keine Zeit.

Edit: Ok, hier ein erster Versuch:

Code: Alles auswählen

// new module header

enum Dir {
  eLeft,
  eRight,
  eDown,
  eUp
};

import bool arrived;

import function GoFace(int go_x, int go_y, Dir face_dir);

Code: Alles auswählen

// new module script

int tgx, tgy;
Dir tfd;

bool arrived; export arrived;
int lt, lid, mm;

function GoFace(int x, int y, Dir d) {
  tgx = x;
  tgy = y;
  tfd = d;
  player.Walk(x, y);
}

function face(Dir d) {
  int xa, ya;
  if (d == eLeft)  { xa = -1; ya =  0; }
  if (d == eRight) { xa =  1; ya =  0; }
  if (d == eDown)  { xa =  0; ya =  1; }
  if (d == eUp)    { xa =  0; ya = -1; }
  player.FaceLocation(player.x+xa, player.y+ya, eBlock);
}

function repeatedly_execute() {
  if (!arrived && player.x == tgx && player.y == tgy) {
    arrived = true;
    face(tfd);
    if (lt == eLocationHotspot) hotspot[lid].RunInteraction(mm);
    if (lt == eLocationObject) object[lid].RunInteraction(mm);
    if (lt == eLocationCharacter) character[lid].RunInteraction(mm);
  }
}

function on_mouse_click(MouseButton button) {
  if (button == eMouseLeft) {
    ClaimEvent();
    lt = GetLocationType(mouse.x, mouse.y);
    if (lt == eLocationNothing) {
      arrived = true;
      ProcessClick(mouse.x, mouse.y, mouse.Mode);
    }
    else {
      arrived = false;
      if (lt == eLocationHotspot) {
        Hotspot*h = Hotspot.GetAtScreenXY(mouse.x, mouse.y);
        lid = h.ID;
      }
      else if (lt == eLocationObject) {
        Object*o = Object.GetAtScreenXY(mouse.x, mouse.y);
        lid = o.ID;
      }
      else if (lt == eLocationCharacter) {
        Character*c = Character.GetAtScreenXY(mouse.x, mouse.y);
        lid = c.ID;
      }
      mm = mouse.Mode;
      ProcessClick(mouse.x, mouse.y, mm);
    }
  }
}

function on_event (EventType event, int data) {
  if (event == eEventEnterRoomBeforeFadein) arrived = true;
}
Das sollte im Header bzw. Script eines neu angelegten Moduls stehen.
(Ich arbeite mit 3.0.2, deswegen Quelltext.)

Verwendet wird das dann so:

Code: Alles auswählen

function oDoor_Interact() {
  if (!arrived) GoFace(263, 135, eRight);   // Festlegen der Koordinaten
  else {
                                              // ab hier der eigentliche Code
    if (oDoor.Graphic == 6) {
      oDoor.Graphic = 7;
      RestoreWalkableArea(2);
      RemoveWalkableArea(3);
    }
    else {
      oDoor.Graphic = 6;
      RemoveWalkableArea(2);
      RestoreWalkableArea(3);
    }
  }  
}
Getestet, funktioniert auch problemlos mit dem DefaultGame.
Der "Trick": bei einem "Interact with Door"-Klick wird der Character nicht-blockierend losgeschickt; erst, wenn er die Tür erreicht hat und zwischendurch nichts Anderes angeklickt wurde, wird der eigentliche Tür-Code ausgeführt.
Somit sollten auch sämtliche Regionen problemlos funktionieren.
Use gopher repellent on funny little man
Benutzeravatar
DieFüchsin
Adventure-Gott
Adventure-Gott
Beiträge: 4406
Registriert: 12.03.2004, 16:55

Re: Blödes Blocking

Beitrag von DieFüchsin »

Klappt exzellent, danke dir! =D>
Danke, Adventuretreff! <3
obsidian100
Frischling
Frischling
Beiträge: 9
Registriert: 29.09.2008, 10:44

Re: Blödes Blocking

Beitrag von obsidian100 »

Klappt auch bei mir exzellent.

Ich habe nur ein Problem:
Ich möchte diese If-Schleife nicht bei Object haben, also dachte ich mir, baue ich das in das Maus klick Event ein.
Für die Koordinaten habe ich zwei Propertys namens x und y erstellt.
Doch nun geht er garnicht mehr zum Object sondern führt den Code direkt aus.

Hier der Code:
GlobalScript.asc

Code: Alles auswählen

function mouseModeFinder()// Autoselect the right mousemode
{
  if (mouse.Mode == eModeUseinv)// Check if an item is selected.
  {
  }
  else// Else do ModeFinder
  {
    if(GetLocationType(mouse.x, mouse.y) == eLocationNothing)// When nothing, walk mode is selected.
    {
      mouse.Mode = eModeWalkto;
    }
    if(GetLocationType(mouse.x, mouse.y) == eLocationObject || GetLocationType(mouse.x, mouse.y) == eLocationHotspot)// When Object, interact mode is selected.
    {
      mouse.Mode = eModeInteract;
    }
    if(GetLocationType(mouse.x, mouse.y) == eLocationCharacter)// When charakter, talk mode is selected.
    {
      mouse.Mode = eModeTalkto;
    }
    if(gInventory.Visible == true && mouse.y > 220)// When inventory, interact mode is selected.
    {
      mouse.Mode = eModeInteract;
    }
  }
}

function GUIupdate()// Check the position of the mouse and shows, if it must, the GUI.
{
  if (mouse.y < 10)
  {
    gESLO.Visible = true;
  }
  if (mouse.y > 20)
  {
    gESLO.Visible = false;
  }
  if (mouse.y > 235)
  {
    gInventory.Visible = true;
  }
  if (mouse.y < 220)
  {
    gInventory.Visible = false;
  }
}


function on_mouse_click(MouseButton button) // called when a mouse button is clicked. button is either LEFT or RIGHT
  {
  if (IsGamePaused() == 1) // Game is paused, so do nothing (ie. don't allow mouse click)
    {
    }
  else if (button == eMouseLeft) 
    {
      Object* Wobject;
      int xpos,  ypos;
      mouseModeFinder();
      if (mouse.Mode == eModeInteract || eModeTalkto)
      {
        Wobject = Object.GetAtScreenXY(mouse.x, mouse.y);
        xpos = mouse.x;
        ypos = mouse.y;
        if (!arrived) GoFace(Wobject.GetProperty("x"),  Wobject.GetProperty("y"), eLeft);   // Festlegen der Koordinaten
        else 
        {
          ProcessClick(xpos, ypos, mouse.Mode);
        }
      
    }
  else // right-click, so look at object
    {   
    mouse.Mode = eModeLookat;
    ProcessClick(mouse.x,mouse.y, mouse.Mode);
    mouseModeFinder();
    }
  }
}
Ich habe die meiner Meinung nach unwichtigen Dinge weggelassen. Kann mir jemand helfen??
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Re: Blödes Blocking

Beitrag von KhrisMUC »

obsidian100 hat geschrieben:Ich habe die meiner Meinung nach unwichtigen Dinge weggelassen.
Der war gut...
Wenn ich nächster Zeit dazu komme, versuche ich mal, das Modul entsprechend umzumodeln.
Use gopher repellent on funny little man
Antworten