NoBlock Module

Fragen zu "Adventure Game Studio"? Hier rein!
Antworten
Demophobie
Frischling
Frischling
Beiträge: 4
Registriert: 08.10.2007, 13:43
Kontaktdaten:

NoBlock Module

Beitrag von Demophobie »

Hi !

Ich habe folgendes Problem.
Ich möchte, dass es in meinem Spiel möglich ist, wie im Lucas-Style, meinen Charakter durch die Gegend zu steuern, und zwar so, dass:
1. zb "Schaue an Bild" erst ausgeführt wird, wenn der Charakter das Ziel errreicht hat.
2. "Schaue an Bild" kann jederzeit abgebrochen werden.

Problem bei Ags ist, dass bei MoveCharacter mit eBlock ich eben Punkt 2 nicht machen kann.

Lösung für das Problem ist anscheinend:
http://new.bigbluecup.com/yabb/index.php?topic=26945.0

Ich hab mir das Modul reingeladen und folgendes probiert:

function on_mouse_click(MouseButton button)
{
if (IsGamePaused() == 1)
{
}
else if (button == eMouseLeft)
{
if (mouse.Mode == 0)
{
ProcessClick(mouse.x, mouse.y, mouse.Mode);
mouse.Mode = 0;
}
else {
NoBlock.Do(mouse.Mode,eLocationHotspot,NoBlock.GetHotXY(mouse.x, mouse.y));
}
}
}

Leider blockt die steuerung immer noch, wenn ich "schau an bild" mache oder ähnliches.

Mein Englisch ist nicht das beste - hab ich vielleicht etwas falsch verstanden?

Danke im Vorraus für Hilfe
Demophobie
Frischling
Frischling
Beiträge: 4
Registriert: 08.10.2007, 13:43
Kontaktdaten:

ooops

Beitrag von Demophobie »

Seh gerade, den Beitrag gabs schomal:

http://www.adventure-treff.de/forum/vie ... hp?t=12019

er hats aber genauso gemacht. :?
Benutzeravatar
Mister L
Rätselmeister
Rätselmeister
Beiträge: 1913
Registriert: 21.03.2005, 01:55
Kontaktdaten:

Beitrag von Mister L »

Ich weiß zwar nicht, ob dir das hilft, aber lade dir doch mal eins der 'Maniac Manison Mania'-Starterpacks runter:
http://www.maniac-mansion-mania.com/ind ... &Itemid=76

Die nutzen alle das alte Lucas-Arts Interface. :wink:
My MMM-Episodes: #7 "Right said Fred", #32 "Secret of Maniac Mansion", # 33 "Carry on Smiley", H05 "Escape from Maniac Mansion", #45 "Maniac Monday", #54 "CSI:RONVILLE", #58 "The People's Court", #70 "Maniac Mansion Begins", #74 "The Curse of King RootenTooten", #93 "Murder a.t. Moonshine Mansion"
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Genau, wobei theoretisch folgende Funktionen reichen:

Code: Alles auswählen

int GScancelable;

function MovePlayerEx(int x, int y, WalkWhere direct) {
  // Move the player character to x,y coords, waiting until he/she gets there,
  // but allowing to cancel the action by pressing a mouse button.
  if (GetGlobalInt(2)>0) {
    int cursorspritenumber = 16,
    int blankcursorspritenumber = 36;
    mouse.UseDefaultGraphic();
    GScancelable = 0;
    player.Walk(x, y, eNoBlock, direct);
    // wait for release of mouse button
    while (player.Moving && (mouse.IsButtonDown(eMouseLeft) || mouse.IsButtonDown(eMouseRight))) {
      Wait(1);
      mouse.Update();
    }
    // abort moving on new mouse down
    while (player.Moving) {
      int xm=mouse.x;
      int ym=mouse.y;
      InventoryItem*ii=InventoryItem.GetAtScreenXY(xm, ym);
      if (mouse.IsButtonDown(eMouseLeft) && (GUI.GetAtScreenXY(xm, ym)==null || ii!=null)) {
        player.StopMoving();
        GScancelable = 1;
      }
      else if (mouse.IsButtonDown(eMouseRight) && (GUI.GetAtScreenXY(xm, ym)==null || ii!=null)) {
        player.StopMoving();
        GScancelable = 2;
      }
      else {
        Wait(1);
        mouse.Update();
      }
    }
    mouse.ChangeModeGraphic(eModeWait, blankcursorspritenumber);
    if (GScancelable==0) return 1;
    else return 0;
  }
  else return 0;
}

function MovePlayer(int x, int y) {
  //Move the player character to x,y coords, waiting until he/she gets there, but allowing to cancel the action
  //by pressing a mouse button.
  return MovePlayerEx (x, y, eWalkableAreas);
}
Am Anfang werden zwei Variablen gesetzt, die die Sprite-Slots des Standardmauscursors und eines leeren Sprites festlegen.

Verwendet wird das in der Interaction so:

Code: Alles auswählen

  if (MovePlayer(120, 179)) {
    // player hat Ziel erreicht
    ...
  }
  else {
    // player hat Ziel nicht erreicht
  }
Use gopher repellent on funny little man
Demophobie
Frischling
Frischling
Beiträge: 4
Registriert: 08.10.2007, 13:43
Kontaktdaten:

Beitrag von Demophobie »

hm aber ich schick den character immer noch mit character.Walk los oder? irgendwie versteh ich noch nicht, was das von dir gepostete script da genau macht.
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Eben nicht, Du schickst ihn mit MovePlayer() los.
Die Funktion liefert 1 zurück, wenn er angekommen ist, und 0, wenn der Spieler woanders geklickt hat.

Du könntest auch schreiben:

Code: Alles auswählen

int angekommen=MovePlayer(x, y);

if (angekommen) {
  MachDies();
  MachDas();
}
Am Ende meines vorherigen Beitrags steht die kurze Variante.

Das Skript definiert zwei Funktionen. Verwendet wird normalerweise nur die zweite, diese ruft aber die erste auf, welche den eigentlich Code enthält.

Die Funktion macht Folgendes:
-Der Spieler wird (nicht-blockierend) zu den Koordinaten geschickt
-Eine Schleife wird durchlaufen, Ausstieg entweder
-*bei erneutem Klick (0) oder
-*bei Erreichen des Ziels (1)
-Die Zahl in Klammern wird als Ergebnis zurückgeliefert
Use gopher repellent on funny little man
Demophobie
Frischling
Frischling
Beiträge: 4
Registriert: 08.10.2007, 13:43
Kontaktdaten:

Beitrag von Demophobie »

Ach - nun kapier ich, wie das gemacht wurde :-) Danke!

Okay ich hab nun noch das Problem, dass der erste Klick noch geblockt wird. Jeder weitere ist ungeblockt.

Find den Grund gerade nicht. Hm...
pikubik
Verpackungs-Wegwerfer
Verpackungs-Wegwerfer
Beiträge: 76
Registriert: 09.04.2006, 17:51
Kontaktdaten:

Beitrag von pikubik »

Demophobie hat geschrieben: Okay ich hab nun noch das Problem, dass der erste Klick noch geblockt wird. Jeder weitere ist ungeblockt.

Find den Grund gerade nicht. Hm...
keine ahnung woran das liegt, bei mir gehts beim ersten mal...
poste mal deinen code


Ich weiß nicht was ich falsch mache, aber bei mir funktioniert das ganze nur wenn ich vor dem "MovePlayer()" noch den wert der GlobalInt auf 1 stelle, da das ganze sonst von anfang an abgebrochen wird (da die GlobalInt immer 0 ist)

Code: Alles auswählen

SetGlobalInt(2,1);
  if (MovePlayer(120, 179)) {
    // player hat Ziel erreicht
    ...
  }
  else {
    // player hat Ziel nicht erreicht
  }
irgendwie wird der globalint ja auch nirgendwo ein wert zugeteilt, oder was mach ich falsch?
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Sorry, war mein Fehler. Ich hab die Funktion aus einem MMM-Starterpack rauskopiert; GI 2 legt fest, ob sich der Spieler bewegen kann.

Wer diese Funktionalität übernehmen will, schreibt einfach "SetGlobalInt(2, 1);" in game_start rein, ansonsten halt alternativ die If-Zeile und entsprechend "} else return 0;" am Ende rausnehmen.
Use gopher repellent on funny little man
Antworten