NoBlock Module
-
- Frischling
- Beiträge: 4
- Registriert: 08.10.2007, 13:43
- Kontaktdaten:
NoBlock Module
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
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
-
- Frischling
- Beiträge: 4
- Registriert: 08.10.2007, 13:43
- Kontaktdaten:
ooops
Seh gerade, den Beitrag gabs schomal:
http://www.adventure-treff.de/forum/vie ... hp?t=12019
er hats aber genauso gemacht.
http://www.adventure-treff.de/forum/vie ... hp?t=12019
er hats aber genauso gemacht.
- Mister L
- Rätselmeister
- Beiträge: 1913
- Registriert: 21.03.2005, 01:55
- Kontaktdaten:
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.
http://www.maniac-mansion-mania.com/ind ... &Itemid=76
Die nutzen alle das alte Lucas-Arts Interface.
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"
- KhrisMUC
- Adventure-Gott
- Beiträge: 4674
- Registriert: 14.03.2005, 00:55
- Wohnort: München
Genau, wobei theoretisch folgende Funktionen reichen:
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
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);
}
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
-
- Frischling
- Beiträge: 4
- Registriert: 08.10.2007, 13:43
- Kontaktdaten:
- KhrisMUC
- Adventure-Gott
- Beiträge: 4674
- Registriert: 14.03.2005, 00:55
- Wohnort: München
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:
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
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();
}
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
-
- Frischling
- Beiträge: 4
- Registriert: 08.10.2007, 13:43
- Kontaktdaten:
-
- Verpackungs-Wegwerfer
- Beiträge: 76
- Registriert: 09.04.2006, 17:51
- Kontaktdaten:
keine ahnung woran das liegt, bei mir gehts beim ersten mal...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...
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
}
- KhrisMUC
- Adventure-Gott
- Beiträge: 4674
- Registriert: 14.03.2005, 00:55
- Wohnort: München
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.
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