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?
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."
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.
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."
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.
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."
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."
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!
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;
}
}
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.
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."