Tasten

Fragen zu "Adventure Game Studio"? Hier rein!
Antworten
Marius

Tasten

Beitrag von Marius »

Hi
Ich habe folgendes Problem:
Wenn man den ISkeypressed Befehl benutzt darf man die taste nur antippen.
Wie kann man einestellen, dass die Aktion auch passiert wenn man die Taste gedrückt hält??
a-v-o
Süßwasserpirat
Süßwasserpirat
Beiträge: 258
Registriert: 22.09.2002, 21:28
Kontaktdaten:

Beitrag von a-v-o »

Die Funktion on_key_press wird nur aufgerufen, wenn eine Taste gedrückt wird, aber nicht wenn sie gedrückt gehalten wird, ausser die Tastenwiederholung der Tastatur setzt ein und erzeugt immer wieder einen Tastendruck, dann wird on_key_press regelmäßig aufgerufen.

IsKeyPressed kann in jeder Funktion verwendet werden nicht nur in on_key_press, um zu überprüfen, ob eine Taste gerade gedrückt gehalten wird.

Möchtest du die Aktion also nicht in Abhängigkeit von der Tastenwiederholung starten, dann kannst du IsKeyPressed bspw. in der repeatedly_execute verwenden. Dann wird in jedem game loop geprüft, ob die Taste gedrückt gehalten wird.
Marius

Beitrag von Marius »

Funktioniert leider nicht.
Zum Beispiel wenn die Figur eine Bewegung per Tastendruck ausführt herrscht Stillstand sobald die Taste gedrückt bleibt
a-v-o
Süßwasserpirat
Süßwasserpirat
Beiträge: 258
Registriert: 22.09.2002, 21:28
Kontaktdaten:

Beitrag von a-v-o »

Für die Steuerung des Player-Characters per Tastatur (statt mit Mausklick) sind schon Scripts entwickelt worden. Eines davon findest du bspw. unter
ftp://a-v-o.selfhost.de/ags/keyboardcontrol.txt

Das Problem ist nicht die Funktion IsKeyPressed, sondern der MoveCharacter-Befehl. In der repeatedly_execute wird der Befehl in jedem game loop aufgerufen, solange eine Taste gedrückt gehalten wird. Das hat zur Folge, dass sich der Character nicht bewegt.

Wie in diesem Fall deutlich wird, ist die Fehlerursache bisweilen woanders zu suchen als vermutet. Daher solltest du genau beschreiben, was du erreichen willst, ansonsten kann die Hilfestellung nicht weiterhelfen.
marius

Beitrag von marius »

Ich möchte ereichen, dass der Spieler , wenn er die nach-obentaste gedrückt hält der Character nach oben springt
(if (IsKeyPressed(372) == 1)
MoveCharacterDirect(EGO,character[EGO].x,character[EGO].y-80);)
a-v-o
Süßwasserpirat
Süßwasserpirat
Beiträge: 258
Registriert: 22.09.2002, 21:28
Kontaktdaten:

Beitrag von a-v-o »

Du willst also, dass der Character beim Tastendruck nach oben springt und solange der Spieler die Taste gedrückt hält, soll der Character immer weiter springen!?

// GlobalInt
#define GI_SPRUNG_Y 5

// --- repeatedly_execute ---

int sprung_y = GetGlobalInt (GI_SPRUNG_Y);
if (IsKeyPressed(372) == 1)
{
// Taste ist gedrückt
if (sprung_y < 0)
{
// es findet gerade kein Sprung statt, also neuen Sprung starten
sprung_y = character [EGO].y - 80;
SetGlobalInt (GI_SPRUNG_Y, sprung_y);
MoveCharacterDirect (EGO, character[EGO].x, sprung_y);
}
}
if (character [EGO].y <= sprung_y)
{
// Sprung ist beendet
// die folgende Zeile sollte auch in game_start kopiert werden:
SetGlobalInt (GI_SPRUNG_Y, -1);
}
Marius

Beitrag von Marius »

Nein nicht ganz.
Ich meine, dass der character dann springt und bei einer bestimmten höhe wieder runter kommt
(wie bei super mario)
a-v-o
Süßwasserpirat
Süßwasserpirat
Beiträge: 258
Registriert: 22.09.2002, 21:28
Kontaktdaten:

Beitrag von a-v-o »

Also, wenn es so Jump-And-Run-mäßig sein soll, dann kann ich dir empfehlen, dir das Platformerius-Tutorial anzuschauen. Dort sind unter anderem Sprünge bspw. auch mit Salto zu sehen:

http://user.tninet.se/~vqb114l/ilb/tutorials/ptni.htm

Vielleicht kannst du ja noch mehr von dem Script brauchen.
RobinMasters
Komplettlösungsnutzer
Komplettlösungsnutzer
Beiträge: 10
Registriert: 06.08.2006, 15:01
Wohnort: Köln

Beitrag von RobinMasters »

wie kann man das Tastatursteuerungsscript
// --- Konstanten für Richtungen und Laufweite
#define DIR_DISTANCE 10000
#define DIR_SW 1
#define DIR_S 2
#define DIR_SE 3
#define DIR_W 4
#define DIR_STOP 5
#define DIR_E 6
#define DIR_NW 7
#define DIR_N 8
#define DIR_NE 9

int PrevDirection = DIR_STOP;

function Tastatursteuerung() {
// --- Tastatursteuerung ---
int Direction, dx, dy;

// Neue Richtung ermitteln
if ((IsKeyPressed (371) == 1) || (IsKeyPressed (55) == 1)) Direction = DIR_NW;
else if ((IsKeyPressed (372) == 1) || (IsKeyPressed (56) == 1)) Direction = DIR_N;
else if ((IsKeyPressed (373) == 1) || (IsKeyPressed (57) == 1)) Direction = DIR_NE;
else if ((IsKeyPressed (375) == 1) || (IsKeyPressed (52) == 1)) Direction = DIR_W;
else if ((IsKeyPressed (377) == 1) || (IsKeyPressed (54) == 1)) Direction = DIR_E;
else if ((IsKeyPressed (379) == 1) || (IsKeyPressed (49) == 1)) Direction = DIR_SW;
else if ((IsKeyPressed (380) == 1) || (IsKeyPressed (50) == 1)) Direction = DIR_S;
else if ((IsKeyPressed (381) == 1) || (IsKeyPressed (51) == 1)) Direction = DIR_SE;
else Direction = DIR_STOP;

// Vergleich mit aktueller Richtung
if (PrevDirection != Direction)
{
PrevDirection = Direction;
if (Direction == DIR_STOP) {StopMoving(EGO);} // Stopp der Spielfigur
else
{
if (Direction == DIR_NW) { dx = -DIR_DISTANCE; dy = -DIR_DISTANCE; }
else if (Direction == DIR_N) { dx = 0; dy = -DIR_DISTANCE; }
else if (Direction == DIR_NE) { dx = DIR_DISTANCE; dy = -DIR_DISTANCE; }
else if (Direction == DIR_W) { dx = -DIR_DISTANCE; dy = 0; }
else if (Direction == DIR_E) { dx = DIR_DISTANCE; dy = 0; }
else if (Direction == DIR_SW) { dx = -DIR_DISTANCE; dy = DIR_DISTANCE; }
else if (Direction == DIR_S) { dx = 0; dy = DIR_DISTANCE; }
else if (Direction == DIR_SE) { dx = DIR_DISTANCE; dy = DIR_DISTANCE; }
MoveCharacterStraight (EGO, character[EGO].x + dx, character[EGO].y + dy);
}
}
}


der Version ab 2.7 anpassen?

Wenn man sie so übernimmt kommt die Meldung

variable "Direction" is already defined
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Ersetz einfach im Text jedes "Direction" mit "Richtung". Oder so.
Use gopher repellent on funny little man
RobinMasters
Komplettlösungsnutzer
Komplettlösungsnutzer
Beiträge: 10
Registriert: 06.08.2006, 15:01
Wohnort: Köln

Beitrag von RobinMasters »

Danke, aber mit der letzten Zeile habe ich noch ein Problem:
MoveCharacterStraight (EGO, character[EGO].x + dx, character[EGO].y + dy);
}
Wie bringt man hier den neuen Befehl
character[EGO].WalkStraight
ein?
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

character[EGO].WalkStraight(character[EGO].x+dx, character[EGO].y+dy);

Das war schwer ;) RTFM ;)
Use gopher repellent on funny little man
RobinMasters
Komplettlösungsnutzer
Komplettlösungsnutzer
Beiträge: 10
Registriert: 06.08.2006, 15:01
Wohnort: Köln

Beitrag von RobinMasters »

Hmm...In Kombination mit dem Easy3D-Modul verhält sich die Tastatursteuereung komisch:
Beim Antippen einer Taste "springt" der Character durch den Raum...
Antworten