Blödes Blocking
- DieFüchsin
- Adventure-Gott
- Beiträge: 4406
- Registriert: 12.03.2004, 16:55
Blödes Blocking
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?
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
- KhrisMUC
- Adventure-Gott
- Beiträge: 4674
- Registriert: 14.03.2005, 00:55
- Wohnort: München
Re: Blödes Blocking
Mit repeatedly_execute_always sollte es klappen.
Use gopher repellent on funny little man
- DieFüchsin
- Adventure-Gott
- Beiträge: 4406
- Registriert: 12.03.2004, 16:55
Re: Blödes Blocking
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
-
- Verpackungs-Wegwerfer
- Beiträge: 76
- Registriert: 09.04.2006, 17:51
- Kontaktdaten:
Re: Blödes Blocking
du könntest diese Funktion hier einbauen...
vielleicht gehts dann ja, hab aber keine ahnung ob das funktioniert
vielleicht gehts dann ja, hab aber keine ahnung ob das funktioniert
- KhrisMUC
- Adventure-Gott
- Beiträge: 4674
- Registriert: 14.03.2005, 00:55
- Wohnort: München
Re: Blödes Blocking
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:
Das sollte im Header bzw. Script eines neu angelegten Moduls stehen.
(Ich arbeite mit 3.0.2, deswegen Quelltext.)
Verwendet wird das dann so:
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.
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;
}
(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);
}
}
}
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
- DieFüchsin
- Adventure-Gott
- Beiträge: 4406
- Registriert: 12.03.2004, 16:55
-
- Frischling
- Beiträge: 9
- Registriert: 29.09.2008, 10:44
Re: Blödes Blocking
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
Ich habe die meiner Meinung nach unwichtigen Dinge weggelassen. Kann mir jemand helfen??
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();
}
}
}
- KhrisMUC
- Adventure-Gott
- Beiträge: 4674
- Registriert: 14.03.2005, 00:55
- Wohnort: München
Re: Blödes Blocking
Der war gut...obsidian100 hat geschrieben:Ich habe die meiner Meinung nach unwichtigen Dinge weggelassen.
Wenn ich nächster Zeit dazu komme, versuche ich mal, das Modul entsprechend umzumodeln.
Use gopher repellent on funny little man