gm-d.de Technikcontest Sommer '09
Und es ist endlich soweit, ein neuer Contest ist da!
Diesmal handelt es sich um einen Technikcontest, angelehnt an den kleineren, den ich vor einiger Zeit organisiert habe und von dem sich viele eine Fortsetzung gewünscht haben.
Wie auch schon bei dem ersten Technikcontest geht es hier nicht nur darum, sein Können unter Beweis zu stellen, sondern auch seine Grenzen kennenzulernen und neue Erfahrungen zu sammeln.
Im Gegensatz zum letzten Mal ist für alle etwas dabei: GML-Einsteiger, -Fortgeschrittene und auch Experten werden hier (hoffentlich) irgendwie gefordert werden. Ferner gibt es mehrere Aufgaben, die auch alle Punkte geben. Abhängig von den erreichten Punkten gibt es am Ende des Wettbewerbs auch entsprechende Benutzertitel bzw. -ränge. Betrachtet dies also auch als Chance, eure "Selbsteinschätzung" zu untermauern. Keine Sorge: Wer nur Aufgabe 1 schafft und etwas von Aufgabe 2, wird vermutlich schon einen Titel bekommen.
Unabhängig davon werden wir dennoch Sieger kühren. Wieviele das sein werden, machen wir von der Teilnehmeranzahl abhängig.
Verständnisfragen zu den Wettbewerbsregeln können hier im Thread gestellt werden, Fragen bezüglich der Aufgabenstellungen aber bitte per PN an mich. Auch bitte keine Diskussionen über Lösungsansätze hier im Thread oder in den Technikforen für die Dauer des Wettbewerbs.
Infos zur Abgabe befinden sich unter der Aufgabenstellung.
Aufgabenstellung
Spoiler anzeigen
Anmerkung: Die Aufgaben sollten nicht außerhalb ihrer Reihenfolge bearbeitet werden. Für eine volle Punktzahl müssen alle Aufgaben gelöst werden. Aufgabe 5 steht außerhalb der Wertung für die Rangvergabe nach Punkten, wird aber für die Bestimmung des Siegers / der Sieger mitangerechnet.
Abgabe / Richtlinien:
Arbeiten im Team ist nicht erlaubt. Der Wettbewerb verfolgt zugleich ein Lernziel, das durch Teamarbeit allerdings stark gefährdet wird. Tut euch daher selbst einen Gefallen und kommt auch nicht darauf, abzuschreiben. Mitglieder des Teams sind vom Wettbewerb nicht ausgeschlossen, liegen aber außerhalb der Wertung.
Benutzt bitte bei selbstgeschriebenen Funktionen ein Präfix, das aus eurem Nickname besteht (Beispiel: mewx_draw_line, mewx_abs).
Schickt dann eine *.gm6 oder *.gmk mit den entsprechenden Skripten bzw. der Testumgebung (sofern vorhanden) an uawg@gm-d.de (da die Weiterleitung anscheinend ewig braucht, vermerkt am besten noch im Thread oder per PN, dass ihr eine Email geschickt habt. Nicht, dass nachher etwas verloren geht). Als Namen für die Datei bitte ebenfalls den Nickname verwenden.
Schriftliche Aufgaben, die kein auszuführender Code sind, einfach in eine eigene Scriptdatei schreiben und mit /* und */ auskommentieren. Bitte nicht die Game Info benutzen!
Einsendeschluss ist Sonntag, 9. August, 2009 um 20:00 Uhr.
Viel Erfolg und viel Spaß, ran ans Coden!
Ergänzung:
Ein Testscript für Aufgabe 1. Einfach ins eigene Projekt kopieren und ausführen (funktioniert derzeit leider nur für registrierte Benutzer, sorry). Und: Ein "OK" bedeutet nur sehr wahrscheinlich, dass euer Script korrekt ist. Ein Fehler kann trotzdem drin sein.
Spoiler anzeigen
Alles anzeigen
Und es ist endlich soweit, ein neuer Contest ist da!
Diesmal handelt es sich um einen Technikcontest, angelehnt an den kleineren, den ich vor einiger Zeit organisiert habe und von dem sich viele eine Fortsetzung gewünscht haben.
Wie auch schon bei dem ersten Technikcontest geht es hier nicht nur darum, sein Können unter Beweis zu stellen, sondern auch seine Grenzen kennenzulernen und neue Erfahrungen zu sammeln.
Im Gegensatz zum letzten Mal ist für alle etwas dabei: GML-Einsteiger, -Fortgeschrittene und auch Experten werden hier (hoffentlich) irgendwie gefordert werden. Ferner gibt es mehrere Aufgaben, die auch alle Punkte geben. Abhängig von den erreichten Punkten gibt es am Ende des Wettbewerbs auch entsprechende Benutzertitel bzw. -ränge. Betrachtet dies also auch als Chance, eure "Selbsteinschätzung" zu untermauern. Keine Sorge: Wer nur Aufgabe 1 schafft und etwas von Aufgabe 2, wird vermutlich schon einen Titel bekommen.
Unabhängig davon werden wir dennoch Sieger kühren. Wieviele das sein werden, machen wir von der Teilnehmeranzahl abhängig.
Verständnisfragen zu den Wettbewerbsregeln können hier im Thread gestellt werden, Fragen bezüglich der Aufgabenstellungen aber bitte per PN an mich. Auch bitte keine Diskussionen über Lösungsansätze hier im Thread oder in den Technikforen für die Dauer des Wettbewerbs.
Infos zur Abgabe befinden sich unter der Aufgabenstellung.
Aufgabenstellung
- (GML-Einsteiger) Schreibe zu den folgenden Funktionen Ersatzfunktionen in GML.
Funktionsaufrufe innerhalb der Funktionen dürfen dabei nicht benutzt werden (auch von keinen eigenen Funktionen). Build-In Variablen sind ebenfalls nicht erlaubt (hspeed, speed, ...). Es ist nicht notwendig, die Parameter auf ihren Typ hin zu überprüfen.
- abs(x)
- sign(x)
- min(x,y) (2 Parameter reichen)
- max(x,y) (2 Parameter reichen)
- abs(x)
- (GML-Fortgeschritter) Schreibe folgende Funktionen in GML. Es gelten alle Regeln aus Aufgabe 1. Die selbstgeschriebenen Funktionen aus Aufgabe 1 dürfen nicht aufgerufen werden. Die angewendeten Prinzipien sollten aber im Hinterkopf behalten werden.
Zusätzlich darf draw_point (bzw. draw_pixel) verwendet werden.
- draw_hline(x1,y1,x2,y2) zeichnet eine gerade, horizonte Linie von (x1,y1) nach (x2,y2). Es soll zuerst überprüft werden, ob die zu zeichnende Linie tatsächlich parallel zur x-Achse ist.
- draw_stairs(x1,y1,x2,y2) zeichnet eine Linie im 45° Winkel von (x1,y1) nach (x2,y2). Auch hier soll eine entsprechende Überprüfung der Parameter stattfinden.
- draw_stairs_flat(x1,y1,x2,y2) ähnlich wie b), nur darf der Winkel der Treppe nun auch weniger als 45° betragen. Wieder soll zuerst überprüft werden, ob die zu zeichnende "Treppe" wirklich flach ist (Tipp: Keine Kommazahlen benutzen!). Es reicht, wenn nur einer der 4 Fälle abgedeckt ist (0-45°, 135°-180°, 180°- 225° bzw. 315°-0°, d.h. nach rechts oben, links oben, links unten, rechts unten).
- draw_hline(x1,y1,x2,y2) zeichnet eine gerade, horizonte Linie von (x1,y1) nach (x2,y2). Es soll zuerst überprüft werden, ob die zu zeichnende Linie tatsächlich parallel zur x-Achse ist.
- (GML-Fortgeschritter bis -Experte) Schreibe eine Ersatzfunktion für draw_line. Es gelten die gleichen Regeln wie in Aufgabe 2. Es ist nicht notwending, dass die Funktion deckungsgleiche Linien mit draw_line zeichnet.
- Schreibe die Funktion mit geeigneten Fallunterscheidungen (Tipp: Aufgabe 2 gibt hierfür einen guten Leitfaden).
- Optimiere deine Funktion bezüglich ihrer Performance. Hierfür ist die Benutzung von den GM-Funktionen aus dem Kapitel "Computing Things" erlaubt. Stelle sicher, dass keine Variablen nach dem Aufrufen der Funktion in der entsprechenden Instanz gespeichert bleiben (Tipp: Debugmodus -> View Local Variables). Nimm als Maßstab die erreichte Fps bei einem Roomspeed von ~9999. Notiere zusätzlich deine Beobachtungen. Beachte dabei allerdings, dass diese eine Schwäche des GMs aufzeigen sollten und keine Allgemeingültigkeit besitzen!
- Schreibe die Funktion mit geeigneten Fallunterscheidungen (Tipp: Aufgabe 2 gibt hierfür einen guten Leitfaden).
- (GML-Fortgeschritter bis -Experte) Schreibe deine draw_line-Funktion (lieber die aus 3a, sonst gibts evtl- böse Überraschungen!) so um, dass sie die Instanz bewegt, von der aus sie aufgerufen wird (diese sollte eine rechteckige Maske haben). Als Parameter wird eine x- und y-Verschiebung übergeben. Das Script soll die "Linie" dieser Bewegung (von x, y nach x+.., y+...)ablaufen und die Instanz entsprechend verschieben. Sollte ein Wandobjekt im Weg sein, soll die Instanz auf der letzten freien Stelle stehenbleiben. Zusätzlich zu den in Aufgabe 3 beschriebenen Funktionen ist die Benutzung der Funktion place_free erlaubt.
- Schreibe die oben beschriebene Funktion mit dem Namen move_along(hspd,vspd) und entwerfe eine einfache Testumgebung, um ihre Funktionalität zu überprüfen. Hierfür reicht ein einfacher Raum mit solid Wandobjekten und einer Spielerfigur (Tipp: Du kannst als Parameter einfach hspeed und vspeed übergeben, solange du sie nach dem Aufrufen der Funktion auf 0 setzt).
- Erweitere die Funktion so, dass sie einen Spielraum von 1 Pixel erlaubt. Sollte sich die Spielfigur also z.B. auf einer Geraden befinden (Seitenansicht), auf der sich eine 1-Pixel-hohe und - breite Erhebung befindet, soll sie diesen ohne Geschwindigkeitsverlust umgehen bzw. "hochklettern". Es ist dabei zu erwarten, dass die Figur nach dem Überqueren dieser Erhebung sich nicht wieder um den einen Pixel nach unten bewegt, den sie vorher nach oben ausgewichen ist.
- Erweitere deine Testumgebung um Schrägen und beobachte, wie sich deine Spielfigur nun verhält.
- Beschreibe in Worten je eine Situation in einem Spiel, in der das Verhalten aus dem letzten Satz aus Aufgabenteil b (nicht) wünschenswert ist.
- Überlege, wie man die Problematik deiner nicht wünschenswerten Situation aus Aufgabenteil d umgehen könnte.
- Schreibe die oben beschriebene Funktion mit dem Namen move_along(hspd,vspd) und entwerfe eine einfache Testumgebung, um ihre Funktionalität zu überprüfen. Hierfür reicht ein einfacher Raum mit solid Wandobjekten und einer Spielerfigur (Tipp: Du kannst als Parameter einfach hspeed und vspeed übergeben, solange du sie nach dem Aufrufen der Funktion auf 0 setzt).
- (Bonusaufgabe) Erweitere deine draw_line-Funktion so, dass sie draw_line_color entspricht.
Anmerkung: Die Aufgaben sollten nicht außerhalb ihrer Reihenfolge bearbeitet werden. Für eine volle Punktzahl müssen alle Aufgaben gelöst werden. Aufgabe 5 steht außerhalb der Wertung für die Rangvergabe nach Punkten, wird aber für die Bestimmung des Siegers / der Sieger mitangerechnet.
Abgabe / Richtlinien:
Arbeiten im Team ist nicht erlaubt. Der Wettbewerb verfolgt zugleich ein Lernziel, das durch Teamarbeit allerdings stark gefährdet wird. Tut euch daher selbst einen Gefallen und kommt auch nicht darauf, abzuschreiben. Mitglieder des Teams sind vom Wettbewerb nicht ausgeschlossen, liegen aber außerhalb der Wertung.
Benutzt bitte bei selbstgeschriebenen Funktionen ein Präfix, das aus eurem Nickname besteht (Beispiel: mewx_draw_line, mewx_abs).
Schickt dann eine *.gm6 oder *.gmk mit den entsprechenden Skripten bzw. der Testumgebung (sofern vorhanden) an uawg@gm-d.de (da die Weiterleitung anscheinend ewig braucht, vermerkt am besten noch im Thread oder per PN, dass ihr eine Email geschickt habt. Nicht, dass nachher etwas verloren geht). Als Namen für die Datei bitte ebenfalls den Nickname verwenden.
Schriftliche Aufgaben, die kein auszuführender Code sind, einfach in eine eigene Scriptdatei schreiben und mit /* und */ auskommentieren. Bitte nicht die Game Info benutzen!
Einsendeschluss ist Sonntag, 9. August, 2009 um 20:00 Uhr.
Viel Erfolg und viel Spaß, ran ans Coden!
Ergänzung:
Ein Testscript für Aufgabe 1. Einfach ins eigene Projekt kopieren und ausführen (funktioniert derzeit leider nur für registrierte Benutzer, sorry). Und: Ein "OK" bedeutet nur sehr wahrscheinlich, dass euer Script korrekt ist. Ein Fehler kann trotzdem drin sein.
GML-Quellcode
- // context_check()
- // written by MewX
- // init variables
- var map,i,prefix,str,src,res;
- // create script map
- map = ds_map_create();
- for (i=0;i<100;i+=1) {
- if (!script_exists(i))
- continue;
- ds_map_add(map,string_lower(script_get_name(i)),i);
- }
- // get prefix
- prefix = "";
- while (prefix = "")
- prefix = get_string("Bitte gib deinen Nickname bzw. das Präfix deiner Skripte ein:","mewx")+"_";
- // test abs()
- res = true;
- str = "Aufgabe 1#a) abs(x): ";
- src = ds_map_find_value(map,prefix+"abs");
- if (!script_exists(src))
- str += "nicht gefunden";
- else {
- for (i=-25;i<25;i+=0.5)
- res &= (abs(i) == script_execute(src,i));
- if (res)
- str += "OK";
- else
- str += "FEHLER";
- }
- // test sign()
- res = true;
- str += "#b) sign(x): ";
- src = ds_map_find_value(map,prefix+"sign");
- if (!script_exists(src))
- str += "nicht gefunden";
- else {
- for (i=-25;i<25;i+=0.5)
- res &= (sign(i) == script_execute(src,i));
- if (res)
- str += "OK";
- else
- str += "FEHLER";
- }
- // test min()
- res = true;
- str += "#c) min(x,y): ";
- src = ds_map_find_value(map,prefix+"min");
- if (!script_exists(src))
- str += "nicht gefunden";
- else {
- res &= (script_execute(src,0,0) == 0);
- res &= (script_execute(src,32,2) == 2);
- res &= (script_execute(src,7,32) == 7);
- res &= (script_execute(src,-32,-2) == -32);
- res &= (script_execute(src,32,-2) == -2);
- res &= (script_execute(src,0,-2) == -2);
- res &= (script_execute(src,2,0) == 0);
- res &= (script_execute(src,23.4,79.7) == 23.4);
- if (res)
- str += "OK";
- else
- str += "FEHLER";
- }
- // test max()
- res = true;
- str += "#d) max(x,y): ";
- src = ds_map_find_value(map,prefix+"max");
- if (!script_exists(src))
- str += "nicht gefunden";
- else {
- res &= (script_execute(src,0,0) == 0);
- res &= (script_execute(src,32,2) == 32);
- res &= (script_execute(src,7,32) == 32);
- res &= (script_execute(src,-32,-2) == -2);
- res &= (script_execute(src,32,-2) == 32);
- res &= (script_execute(src,0,-2) == 0);
- res &= (script_execute(src,2,0) == 2);
- res &= (script_execute(src,23.4,79.7) == 79.7);
- if (res)
- str += "OK";
- else
- str += "FEHLER";
- }
- // clean up
- ds_map_destroy(map);
- // show result
- show_message(str);