Schlagwort-Archive: Klassen

ocajpKönnen Klassen in Java „protected“ oder sogar „private“ sein? Welchen Case springt ein Switch mit einem null-String an? Ist ein statischer Konstruktor ein Konstruktor mit „static“-Modifier? Werden Methoden oder Variablen dynamisch oder statisch gebunden? Können Interfaces von mehreren anderen Interfaces erben? Kompiliert eine Klasse mit der Methode „private static void main“ und ist diese startfähig? Wer solche Details nicht weiß, braucht sich über das Thema Zertifizierung noch keine Gedanken machen. Ich mache mir bereits seit Monaten Gedanken.

Seit Anfang der Woche bin ich offiziell ein von Oracle zertifizierter Java-Programmierer – endlich! Die hierzu nötige Prüfung habe ich mit 85% bestanden. Zum Bestehen brauchte man 63% der richtigen Antworten, dieser Wert variiert je nach Schwierigkeitsgrad des Aufgabenkatalogs. In meinem Fall handelte es sich um ziemlich schwere Aufgaben. Zum Vergleich: Nur wenige Jahre zuvor waren zum Bestehen stolze 77% nötig, die Aufgaben also wesentlich einfacher. Zweieinhalb Stunden hat man Zeit, sich beinahe 90 hirnverknotende Codebeispiele durchzulesen, im Kopf zu interpretieren und dann via Multiple-Choice die richtige Antwort anzuklicken – weniger als zwei Minuten pro Aufgabe. Ansatzpunkte gibt es natürlich keine. Ein paar kümmerliche Alibi-Wissensfragen zwischen den endlosen Zeilen voller Quellcode sollen wohl beruhigend wirken. Am Ende hat mir die Zeit gerade so gereicht.

Die fast 200 Euro teure Zertifizierung (Schulungsmaßnahmen nicht eingerechnet) zum sogenannten „Oracle Certified Associate, Java SE 7 Programmer“ (kurz OCAJP) ist die erste, die man als Java-Programmierer absolvieren kann, sie ist mittlerweile Voraussetzung für sämtliche weiteren. Jetzt habe ich die Möglichkeit, mich irgendwann sogar als professioneller Java-Programmierer (OCPJP) zertifizieren zu lassen, was ich definitiv plane, aber bis dahin wartet noch sehr viel mehr an Vorbereitung und Training auf mich. Das gedruckte Zertifikat sollte in den nächsten sieben Wochen bei mir eintreffen, bis dahin kann ich mich an der PDF-Version ergötzen.

Wer sich mit dem Thema noch nie befasst hat, aber neugierig auf die Prüfung ist, sollte gewarnt sein. Die Fragen sind wirklich knallhart. Es wird nie nach den allgemeinen Dingen gefragt, die jeder Java-Programmierer beantworten kann. Es werden gezielt die Schwachstellen abgeklopft, all jene Aspekte und Grenzfälle abgeprüft, die viele eben nicht kennen. Die Prüfung spekuliert darauf, dass viele etwa den einfachen Unterschied zwischen String s = „Hallo“; und String s = new String(„Hallo“); nicht kennen, und fragt dann gerne ganz genau nach, wieviele Objekte der Garbage Collector der JVM aufräumen darf.

Ich bin voller Stolz, diese Hürde erfolgreich genommen zu haben. Der OCAJP war der nächste große Schritt, mich im Bereich Softwareentwicklung bzw. Java-Programmierung zu beweisen und zu etablieren. So ein Zertifikat kann eines Tages den Unterschied zwischen Arbeitslosengeld und Gehalt ausmachen. Oder zwischen Gehalt und Gehalt++. Das muss sich alles noch herausstellen. Bis dahin werde ich weiterhin Erfahrung sammeln und Bücher wälzen.

Mein treuester „Spacola Eclipse“-Fan hat sich soeben bei mir erkundigt, wie es denn mittlerweile um mein kleines Remake steht. Wie es der Zufall wollte, konnte es kaum einen besseren Zeitpunkt geben, mich das zu fragen. Nach mehreren Wochen fauler Abstinenz gelang es mir gestern und heute tatsächlich für ein paar Stunden einige Dinge am Code zu ändern und Kleinigkeiten von der To-Do-Liste zu streichen. Zeit für mich, meinen ereignislosen Blog mit Dev-News zu füttern.

spacolabrechnungAuf der linken Seite kann man dazu eine Abbildung sehen. Was auf den ersten Blick wie zweimal exakt derselbe Screenshot aussieht, ist in Wirklichkeit eine Gegenüberstellung von Original (oben) und Remake (unten). Ja genau, dieser kleine Aspekt hat mich bestimmt drei Stunden meines Lebens und so einige Nerven gekostet. Es handelt sich im Spiel um den Teil der „Kontoabrechnung“, also die Grafik, die man zu sehen bekommt, sobald man einen Level erfolgreich beendet hat. Hier werden jeweils gelieferte Waren in bare Münze umgerechnet und anschließend kann man schon den nächsten Level beginnen.

Es waren die vielen kleinen Dinge, die die Arbeit so langwierig machen. Pixelgenaue Abstände, Schriftzeilenhöhe, richtige Zentrierung, originalgetreues Timing, Sounds, HUD-Events während der Animation (Highscore!), sukzessives Entfernen der Sprites aus dem Inventar, dabei gleichzeitiges Hochzählen des Punktestands. Und nein, ich habe nicht einfach nur eine große Grafik eingebunden, alles wird dynamisch gezeichnet. Die Unterschiede sind marginal, aber sie sind (leider) da.

Falls sich jemand wundert, wieso auf dem unteren Screenshot das Abrechnungsergebnis nicht mit dem tatsächlichen Score übereinstimmt: Die Berechnung ist leider noch hartkodiert. Ein Fake, ein Test, nur zum Vergleichen. Alles andere ist echt.

Die zweite größere Neuerung ist, dass die Highscore jetzt vollständig in eine Datei gespeichert und beim nächsten Spielstart auch von dort wieder ausgelesen wird. Jetzt fehlt eigentlich „nur“ noch der Dialog zur Eingabe des Namens, dann wäre auch der ganze Highscore-Kram fix und fertig. Aber den Spaß hebe ich mir vermutlich doch für ein anderes Mal auf.

Bereits mit Version 0.23 kam der zweite Gegnertyp hinzu, der zwar komplett eigenständige Sprites hat, sich aber (Copy & Paste sei dank) fast genauso verhält wie der erste Gegnertyp. Ist im Moment eben noch work in progress. Außerdem gibt es jetzt die Geschwindigkeitsstufen für Hyperspeed und natürlich „Ridiculous Speed“ in Anlehnung an den Filmklassiker Spaceballs. Anfang April habe ich noch die komplette Vektorarithmetik zusammengefasst, umgeschrieben und in eine eigene Klasse ausgelagert. Damit habe ich drei Dinge erreicht: 1.: eine konsistente Implementierung der Bewegung von Spielobjekten. 2.: jede Menge überflüssiger oder redundanter Code, der jetzt rausgeflogen ist. 3.: um die 20 Klassen mussten angepasst werden, damit der Code seit der Änderung wieder kompilierbar wurde.

Achja, wir haben jetzt Ingame-Musik und die lässt sich in der Konfiguration sogar an- und abschalten. Der Song ist zwar nicht optimal, aber er ist so ziemlich der passendste, den ich bisher finden konnte. Ich werde da mal noch weitersuchen. Zuletzt kann ich noch erwähnen, dass die Raketentriebwerke der Piratenschiffe jetzt auch Partikel sprühen, wenn sie Schub geben. Das sieht deutlich wuseliger aus als noch in der letzten Version. Vor einigen Wochen hatte ich mal ein neues Preview-Video angekündigt. Ich denke, ich werde meine Ankündigung daher etwas relativieren und mit dem Video warten, bis es wieder spektakuläre Änderungen gibt.

Nachtrag vom 02.06.: Heute war ich ebenfalls ein bisschen fleißig: Der Spieler kann jetzt mit aktiviertem Schildgenerator von gegnerischen Schiffen abprallen (so wie bei Asteroiden bisher schon) oder sich von den Piraten bestehlen lassen, wenn er ohne Schild unterwegs ist. Allerdings fehlt den Piraten noch die nötige Intelligenz um das Diebesgut auch abzuliefern. Wenn der Spieler keine Ware mehr im Inventar hat, kann er den Level jetzt nicht mehr beenden. Mal sehen, vielleicht kümmere ich mich heute noch darum, dass die Gegner auch zurückfeuern können.

Nachtrag vom Nachtrag: Keine drei Stunden später ist es dann soweit: Die Gegner können jetzt aus allen Rohren zurückballern. Und als Spieler muss man sich ganz schön in Acht nehmen. Das macht das Gameplay nun tatsächlich um einiges hektischer als zuvor. Vor allem aber macht es das Gameplay um einiges sinnvoller, denn so nähert sich das Spiel langsam einem ansatzweise vorzeige- und spielbaren Zustand. Hurra!