Karte wie bei Indiana Jones

Fragen zu "Adventure Game Studio"? Hier rein!
Antworten
Benutzeravatar
harley23
Frischling
Frischling
Beiträge: 8
Registriert: 21.08.2002, 22:39

Karte wie bei Indiana Jones

Beitrag von harley23 »

Guten Tag!
Ich verusuche gerade eine Karte, mit auszuwählenden Reisorten zu machen. So wie bei den Indiana Jones Adventures. Eigentlich klappt alles, nur ich weiß nicht, wie ich den roten Balken machen soll. Hat jemand eine Idee? ;)

mfG
Harley23
Benutzeravatar
DasJan
Adventure-Treff
Adventure-Treff
Beiträge: 14683
Registriert: 17.02.2002, 17:34
Wohnort: London
Kontaktdaten:

Re:Karte wie bei Indiana Jones

Beitrag von DasJan »

Du meinst diesen roten Strich, der sich langsam verlängert und die Reiseroute darstellt, richtig? Ich würde es so versuchen:

Mach dir zuerst ein Sprite mit einem roten Kreis, der Rest transparent. Der Kreis muss den Durchmesser haben, wie der Strich breit sein soll. Dann setzt du zwei Variablen Strich_X und Strich_Y auf die Werte wo der Strichanfangen soll und malst da mit RawDrawImage(Strich_X, Strich_Y, Nummer des Kreis-Sprites) einen Kreis hin. Dann veränderst du Strich_X und/oder Strich_Y leicht und malst da den nächsten Kreis hin und so weiter....

Wenn die Kreise nah genug beieinander liegen, dann sehen die (hoffentlich) wie ein breiter Strich aus.

Das Jan
"If you are the smartest person in the room, you are in the wrong room."
Benutzeravatar
harley23
Frischling
Frischling
Beiträge: 8
Registriert: 21.08.2002, 22:39

Re:Karte wie bei Indiana Jones

Beitrag von harley23 »

Das ist eine gute Idee! Vielen Dank! :D
Ich berichte dann mal demnächst von dem Ergebnis.

Harley23
Daniel
Süßwasserpirat
Süßwasserpirat
Beiträge: 312
Registriert: 29.07.2002, 12:15
Wohnort: Knittelfeld
Kontaktdaten:

Re:Karte wie bei Indiana Jones

Beitrag von Daniel »

Es ist ja möglich einen animirten Hintergrund zu machen, also mach es doch so dass, wenn man auf einen Zielort klickt dass, dann der Raum schnell gewechselt wird und in diesen raum der hintergrund animirt ist und einen Streifen nach und nach macht, und nach einer bestimmten Zeit* wechselt man automatisch in den Zielraum

*Zeit je nachdem wielange es Dauert bis die animation durchgelaufen ist.
Hi, die Homepage zu meinem Fanproject ist nun auch online
der link:
http://www.guybrush-production.de.vu oder http://www.g-pro.de.vu
Benutzeravatar
DasJan
Adventure-Treff
Adventure-Treff
Beiträge: 14683
Registriert: 17.02.2002, 17:34
Wohnort: London
Kontaktdaten:

Re:Karte wie bei Indiana Jones

Beitrag von DasJan »

Das mit einem animierten Hintergrund zu lösen, würde viel zu viel Ressourcen benötigen. Da würde man ja zig komplette Hintergrundgrafiken brauchen und ich schätze mal, dass AGS das nicht verkraftet. (Außerdem wäre 30 Megabyte nur für nen Strich etwas oversized.)

Ich bin mal gespannt, ob das so (mit dem Kreis) klappt.

Das Jan
"If you are the smartest person in the room, you are in the wrong room."
Benutzeravatar
harley23
Frischling
Frischling
Beiträge: 8
Registriert: 21.08.2002, 22:39

Re:Karte wie bei Indiana Jones

Beitrag von harley23 »

Moin moin! :)
So, ich wollte mal meinen aktuellen Stand der Dinge präsentieren. Also ich hab es dann doch vorgezogen nicht RawDrawImage zu benutzen, sondern RawDrawLine.
Mein Roomscript sieht jetzt wie folgt aus:


// room script file
int mapx;
int mapy;
int mapx = 42;
int mapy = 113; // Die Koordinaten des Ausgangspunktes

function hotspot1_a() { // Der Zielort-Hotspot
// script for hotspot1: Any click on hotspot
RawSetColor (63488); // Linie wird rot
SetGlobalInt(7,1);

}

function room_a() {
// script for room: Repeatedly execute
if (GetGlobalInt(7)==1) {

RawDrawLine(42,113,mapx,mapy);
RawDrawLine(42,113,mapx+1,mapy+1); // Das Ganze hier um den Strich zu verbreitern
RawDrawLine(42,113,mapx,mapy+1); // Sieht vielleicht teilweise überflüssig aus,
RawDrawLine(42,113,mapx+1,mapy); // aber ansonsten spaltet sich die Line zum Ende
Wait(2);
mapx += 3; //Die Koordinaten werden hier dem
mapy -= 1; //Verhältnis nach vergrößert/-kleinert

if (mapx >= 200) { // Hier hat die Linie den Zielort erreicht
SetGlobalInt(7,0); // Hier käme dann noch der Raumwechsel
}
}
}

Ich hoffe, es ist einigermaßen nachvollziehbar. Ich würde gerne Meinungen dazu hören und wenn jemand Verbesserungsvorschläge schreiben würde, wäre ich auch sehr angetan. ;)

mfG
Harley23
Benutzeravatar
DasJan
Adventure-Treff
Adventure-Treff
Beiträge: 14683
Registriert: 17.02.2002, 17:34
Wohnort: London
Kontaktdaten:

Re:Karte wie bei Indiana Jones

Beitrag von DasJan »

Schön, dass du dein Ergebnis noch mal hier zum besten gibst.

Zuerst mal: Die ersten beiden Zeilen kannst du dir imho sparen, mit "int mapx = 42;" wird die Variable gleichzeitig initialisiert und zugewiesen. Keine große Sache, spart aber Platz.

Wieso machst du die Linie in der Repeatedly_execute-Funktion, anstatt in hotspot1_a() eine Schleife einzubauen?

Das Jan
"If you are the smartest person in the room, you are in the wrong room."
theDon
Rätselmeister
Rätselmeister
Beiträge: 2219
Registriert: 11.06.2002, 18:22
Wohnort: gone (forever)
Kontaktdaten:

Re:Karte wie bei Indiana Jones

Beitrag von theDon »

mal abgesehn davon das mehrfachdeklaration schlechter stil (weil syntaktisch falsch) ist...also wenn schon so dann das 2te int weglassen
Wer Ironie oder beleidigende Inhalte in diesem Beitrag findet, darf sie behalten.

http://www.thwboard.de | http://oph-qfb.sourceforge.net
Benutzeravatar
harley23
Frischling
Frischling
Beiträge: 8
Registriert: 21.08.2002, 22:39

Re:Karte wie bei Indiana Jones

Beitrag von harley23 »

So, ich hab mal versucht auf die Ratschläge einzugehen...


// room script file
int mapx = 42;
int mapy = 113;

function hotspot1_a() {
// script for hotspot1: Any click on hotspot
RawSetColor (63488);
while (mapx < 200) {
RawDrawLine(42,113,mapx,mapy);
RawDrawLine(42,113,mapx+1,mapy+1);
RawDrawLine(42,113,mapx,mapy+1);
RawDrawLine(42,113,mapx+1,mapy);
Wait(2);
mapx += 3;
mapy -= 1;
}
}

Na ja, gibt es hier noch Kritik? ;)
...ist halt mein erstes Skript...

mfG
Harley23
Benutzeravatar
DasJan
Adventure-Treff
Adventure-Treff
Beiträge: 14683
Registriert: 17.02.2002, 17:34
Wohnort: London
Kontaktdaten:

Re:Karte wie bei Indiana Jones

Beitrag von DasJan »

Klar, jeder fängt irgendwann mal an.

Ich würde die beiden Variablen-Deklarationen noch in die Funktion hotspot1_a() mit reinnehmen, weil du sie ja außerhalb nicht brauchst. Wenn das Script so für dich funktioniert, dann gibt es sonst keine Einwände mehr, aber es hat zwei Nachteile:
1. Die Zahlen 42, 113, 200, 3, 1 stehen fest im Code drin. Damit ist die Funktion überhaupt nicht variabel.
2. Du kannst mit dem Strich nur Punkte erreichen, deren x- und y-Abstände von Startpunkt (42, 113) ein festes Verhältnis haben (in dem Fall 3/1). Am hübschesten wäre es natürlich, wenn du eine Funktion schreiben würdest, die du einfach nach dem Motto MaleStrich(x1, y1, x2, y2) aufrufen könntest. Aber wenn das aktuelle Script so funktioniert, kannst du dich ja erst mal anderen Teilen des Spiels zuwenden.

Das Jan
"If you are the smartest person in the room, you are in the wrong room."
Benutzeravatar
harley23
Frischling
Frischling
Beiträge: 8
Registriert: 21.08.2002, 22:39

Re:Karte wie bei Indiana Jones

Beitrag von harley23 »

Moin!

Ich habe versucht, den Vorschlag von DasJan umzusetzen und eine Funktion zu schreiben, damit man die Linie von XY nach XY ziehen kann. Aber da gibt es Probleme. Ich hab das mit linearen Funktionen probiert. Das funktioniert aber nur, wenn die Steigung der Linie eine ganze Zahl ist. Wenn die Steigung z. B. 1,5 ist, wird die Steigung ignoriert. Hat jemand evtl. Vorschläge wie man so eine Funktion umsetzen könnte? Oder wie man es hinbekommt, dass AGS nicht nur ganze Zahlen akzeptiert. Danke im Voraus!

MfG
Harley23
Gast

Re:Karte wie bei Indiana Jones

Beitrag von Gast »

ey schicks mir mal ;D
Benutzeravatar
harley23
Frischling
Frischling
Beiträge: 8
Registriert: 21.08.2002, 22:39

Re:Karte wie bei Indiana Jones

Beitrag von harley23 »

OK, hier zeige ich meinen gescheiterten Versuch:


function Map_Line (int x1,int y1,int x2,int y2) { // x1, y1 ist der ausgangspunkt
                   // x2, y2 ist der zielpunkt
RawSetColor (63488);
int x3 = x1;
int y3 = y1;
int m = (y2-y1)/(x2-x1); // die steigung
while (x2 != x3 && y2 != y3) {
   RawDrawLine(x1,y1,x3,y3);
   Wait(2);
   x3 += 1;
   y3 += m;
}
}


Ist das überhaupt der richtige Ansatz?
Benutzeravatar
Jonas
Süßwasserpirat
Süßwasserpirat
Beiträge: 291
Registriert: 10.05.2002, 16:23
Kontaktdaten:

Re:Karte wie bei Indiana Jones

Beitrag von Jonas »

Ich habe zwar keine Erfahrung in AGS, aber würde folgendes sagen : Das Problem liegt bei
int m = (y2-y1)/(x2-x1); // die steigung
wenn eine Variable des Types int nur ganze Zahlen annehmen kann.
Entweder nimmst du einen anderen Variablentypen, oder du gibst als Parameter Vektorenkoordinaten an.
[x] - nail here for a new monitor
Benutzeravatar
DasJan
Adventure-Treff
Adventure-Treff
Beiträge: 14683
Registriert: 17.02.2002, 17:34
Wohnort: London
Kontaktdaten:

Re:Karte wie bei Indiana Jones

Beitrag von DasJan »

Die Fehlerursache stimmt schon, die Lösung ist wie folgt. (Ich habe den Code nicht getestet, es geht mir um die Idee:

function Map_Line (int x1, int y1, int x2, int y2) {
RawSetColor (63488);
int x3, y3;
int p = 0;
while (p < 100) {
x3 = x1 + ((x2 - x1) * p) / 100;
y3 = y1 + ((y2 - y1) * p) / 100;
RawDrawLine(x1,y1,x3,y3);
Wait(1);
p++;
}
}


Die Idee ist, dass du zuerst multiplizierst und dann dividierst. Andersrum kriegst du zuerst bei der Division eine zu ungenaue ganze Zahl raus, die dann bei der Multiplikation auch nicht besser wird.

Das Beispiel oben sollte die Linie in 100 Schritten zeichnen, damit wird eine kurze Linie langsamer gezeichnet als eine lange. Um das zu umgehen ersetzt du einfach alle "100" durch ein pmax, das proportional zum Abstand der beiden Punkte ist (Pythagoras).

Das Jan
"If you are the smartest person in the room, you are in the wrong room."
Antworten