 Okay, fange ich mal an. Wie ihr vielleicht gerade eben auch schon gehört habt, mache ich einen Vortrag über, wie man es schaffen kann, innerhalb von kurze Zeit Spiele zu programmieren. Dazu werden wir die Larvi-Länder benutzen. Und ich habe mir das so gedacht, dass ich jetzt erstmal so ein paar Folien habe und dann zwei kleine Spiele programmiere, die die Laptops dabei haben können, wenn sie wollen, das irgendwie nebenher auch noch mitprogrammieren, wenn sie schnell genug sind. Wenn ich zu schnell bin und zu langsam bin, einfach dazwischen berufen, wenn ihr Fragen habt, auch einfach um die Fragen. Okay, das erste, was ist Larvi? Larvi ist eine Open Source 2D Game Engine oder eigentlich Game Framework, weil es keine richtige komplette Engine ist. Ich habe mir alle möglichen Tools bereitgestellt, damit man sich selber eine Engine machen kann. Das Ganze passiert in Lua und ist sehr portabel. Es läuft, wenn man ein Larv wie geschrieben hat, läuft es auf Windows, auf OS X und auf Linux und bedingt auf diesen Open Source oder auf diesen kleinen Handheld-Star, das Dingoo, das Kanu und das Open Pandora. Wie gesagt, ziemlich bedingt, also weder schnell noch gut, aber immerhin. Kriegen könnt ihr das unter larv2d.org. Das ist eine relativ bunte Seite, aber auch sehr übersichtlich oder auch nicht. Ja, egal. Ah, wo ist das hin? Das Ganze hat ein Wiki. Da gibt es eine Referenz und eine Menge von Totoyals. Snippwitz sind alles mögliche. Wenn man noch nicht genau weiß, wie man zu tun hat, ist das auf jeden Fall ein guter Einstiegspunkt. Dann gibt es ein Forum mit einer sehr netten, manchmal ein bisschen nervigen Community, die einem sehr ausführlich Antworten aus der schnellen Antworten. Wenn man sehr schnell Antworten haben möchte, geht man ins IC. Rautelab im Freenote. Wenn da jemand ist, dann kriegt man da eigentlich sofort Antwort. Was ist Lua? Lua ist eine Skripting-Sprache. Wir haben jetzt leider keine Zeit, da eine Einführung zu machen. Wenn man das gerne lernen möchte und das sollte man gerne lernen möchten, dann kann man sich dieses Buch hier angucken. Es gibt online in der alten Version zum Lesen. Die Referenz gibt es auch online. Es gibt ein Lua-Users-Wiki, wo alles mögliche drin ist. Da wird man beschwemmt mit Zeug. Wenn man gerne cool sein möchte und das irgendwie komisch lernen möchte, dann gibt es die Lua-Missions. Das sind so Unitests, die kaputt gehen und die man reparieren muss. Dann lernt man damit irgendwie Lua. Okay, so viel zu Lua. Wieder zur Zulab. Was kann das Ganze? Das Ganze ist aufgeteilt in Module. Die drei wichtigsten Module sind das Grafikmodul. Das benutzt OpenGL und ein paar andere Libraries, um Grafiken darzustellen. Alles 2D, allerdings hat wer beschleunigt, wenn es da ist. Das Audio-Modul ist nicht so gut, aber man kann Sachen abspielen. Und dann gibt es das Input-Modul, das auch geteilt ist. Es sind eigentlich drei, nämlich Keyboard-Input, Maus-Input und Justice-Input. Was es auch noch gibt, ist eine Physik-Engine. Das ist Box2D, was mehr oder weniger gut gebrabt ist. Ist mit Vorsicht zu genießen, braucht man noch meistens nicht. Dann gibt es ein Filesystem-Modul, womit man auf der Teilnehmend zu greifen kann. Es gibt ein Thread-Modul. Der kann normalerweise keine Threads von sich aus. Damit geht das. Es gibt ein Sound-Modul. Wenn dir der letzte Gpn da gewesen war, da gab es einen Vortrag von mir über Sound-Synthese. Das habe ich vor allem mit diesem Sound-Modul gemacht. Dann gibt es einen Timer-Modul, was man eigentlich nur dazu benutzt, sich die Frames per Second ausgeben zu lassen. Das ist ein zu guter Letztes Luresocket mit drin, womit man ein Netzwerk schön programmieren kann. Soll allerdings auch sehr low-level. Audio gibt Sound aus. Sound sind die Daten. Macht nicht so viel Sinn. Audio braucht auch Sound, um zu funktionieren. Man kann die Modul auch einzeln an und abschalten. Wenn man das Audio-Modul anschaltet und das Sound-Modul ausschaltet, das ist ein bisschen blöd, aber ok. Das Hello World Beispiel sieht so aus. Man hat eine Funktion Love.Draw und da gibt man Love.Brighted.Film.Hello World an einer Position, die man gerne haben möchte. Wenn man das macht, dann kriegt man das zu sehen. Ein bisschen unschrecktekulär, aber jetzt war nicht so viel kurz. Wie funktioniert das Ganze jetzt? Unter Windows und unter Mac, kann man das Verzeichnis, wo sich diese Main-Punkler befindet, einfach auf den Shortcut zu der Love-Executive oder auf die Executive selber ziehen und dann wird es aufgeführt. In der Kommando-Zeit will Love und dann den Fahrt zum Verzeichnis, wo die Main-Punkler ist oder Love und dann ein Fahrt, wo die Game-Punklerf ist. Game-Punklerf ist ein Archiv, was das erste Samen packt. Oder unter Mac Open minus ourLove, da steht auch ein BK drin. Diese Love-Dateien sind einfach eine unbenannte Zip-Dateien und da schmeißt man alles rein, was zum Spiel gehört. Wichtig ist, dass die Main-Punkler auf der obersten Ebene von der Zip-Datei ist, alles andere kann liegen, wo wir. Diese Dateien gibt man dann eben anderen Leuten, die dann die Spiele ausführen können. Wenn man das ein bisschen automatisieren möchte, was ich gemacht habe, kann man sich ein Mac voll schreiben, dann kann man Mac-Love angeben und zur Frühle natürlich abfangen. Geh ich Druck F5 und dann macht das das. Wie sieht das Ganze aus, wie man ein bisschen kompliziertere Sachen macht? Es gibt die Holy Trinity Love-Load, Love-Update und Love-Drag, die sind in jeder, normalerweise in jedem Spiel zu finden, Love-Load, wird einmal am Anfang ausgeführt, wenn alles geladen ist. Man kann dann Sachen rein, um das Spiel zu initialisieren. Dann wird Love-Update ausgeführt, da schreibt man normalerweise Sachen rein, um die Sachen, die auf dem Bildschirm zu sehen sind, zu bewegen oder irgendwelche Sachen, kunstlich eine Ligenz oder so, keine Ahnung, zu updaten. Dann gibt es die Love-Drag-Funktion, die zeichnet auf dem Bildschirm und dann werden Events abgearbeitet. Das sind Mouse-Events, Tastatur-Events, Joystick-Events und Focus-Events. Das sind alles Funktionen. Wie gesagt, die Love-Load ist eine Funktion, die man schreibt. Love-Update ist eine Funktion, die man schreibt. Love-Drag ist eine Funktion, die man schreibt. Und diese Event-Mentler sind auch Funktionen, die man schreibt. Die heißen Love-Mouse-Fest, Love-Mouse-Beliest und so weiter. Ist das dann so ein SDL-Drapper, mehr oder weniger? Ja, ein. Aber es ist ein bisschen schöner geworden. Das Ding ist eine vorgefertigte oder eine vorgefertigte Variante von so einem Game-Look, den kann man sich allerdings auch selber schreiben und möchte. Dann heißt die Funktion love.run macht aber eigentlich keine. Wenn man dann ein Beispiel, ein bisschen kompliziertes Beispiel hat, das ist das zweite Helleboard sozusagen, hat mir in der Funktion love.load schreibt man sich eine globale Variable Hamster, die speichert das Bild des Hamsters und die Position. In der Love-Update wird das Keyboard abgefragt, welche Tasten man hat, je nachdem wird der Hamster dann verschoben, basierend auf dieser DT-Variable, welche die Zeit zwischen den zwei Frames, die bestrichen ist, beinhaltet. Und zu guter Letzt wird ein Love-Drag bezeichnet. Können wir auch gerade machen. Das mit Love-Graphics in die Image wird einfach ein neues Bild erzeugt. Das Ganze ist nur so, dass Variablen, die nicht als lokal gekennzeichnet werden, sind alle in globalen Space. Was ganz praktisch ist, weil man dann in dieser Love-Funktion globale Sachen deklieren kann, die man in anderen Funktionen benutzen kann. Love-Drag war das Hamsterbild ausgeben. Das ist schon mal so. Das ist der Hamster. Wenn die Abtaste gedrückt wird, dann sollte der Hamster oben verschoben werden. Hamster und Y ist gleich ein bisschen nervig. Es gibt keine Compat-Statements. Das heißt, wenn man Variablen verändern möchte, dann muss man die immer ein bisschen verboster hinschreiben. Dieses DT mal 100 bedeutet, wir möchten das 100 pixel pro Sekunde bewegen. Und wenn Tasten auch gedrückt werden kann, dann muss man die Abtaste rechnen, weil das Koordinatensystem in Love oben links anfängt und dann nach unten rechts geht. Wie gesagt, wenn ihr irgendwie Fragen habt, fragt. Nein. In diesem Programm in Lua ist es irgendwie, der schreibt da rein, dass er das gerne benutzt, einfache Anführungszeichen, wenn er einen Buchstaben nur nimmt und doppelte Anführungszeichen, wenn er zwei nimmt, aber das ist nicht und Namen für die Tasten, die keine Zahlen oder Buchstaben sind eine Liste mit diesen Namen gibt es eben wiki. Wenn ich jetzt das mit WASD steilen wollen würde, dann würde ich da einfach WASD reinschreiben. Aber auch in Anführungszeichen. Und jetzt kann man das Ding steilen. Super. Es ist ein bisschen aufwändiges weil Love in Framework ist und nicht so viel bereitstellt braucht man noch meistens ein paar andere Sachen. Dafür gibt es eine ganze Menge Libraries mit komischen Namen. Es gibt N-Animation Library von Buffes, die den für Sprite-Animation benutzt. Im nächsten Beispiel, dann gibt es Loop. Loop ist keine Abkürzung für irgendwas. Das Wrapped einfach übersockert, dass man Protokoll ein bisschen leichter schreiben kann. Es gibt Mittelklasse Extras. Das ist ein Klassensystem für Lua. Es gibt in Lua keine Klassensysteme vorgefertigt. Das muss man sich auch selber machen. In Lua gibt es im Prinzip eigentlich nur eine Tabellendatstruktur und Closures. Damit muss man sich halt Sachen selber zusammen machen. Bedeutet aber, dass man was für Stilen man auch immer programmieren möchte, programmieren kann. Wie gesagt, wenn man sich nicht selber ein Klassensystem implementieren möchte, kann man Mittelklasse benutzen oder die Health Utilities vom Massive Progress. Das ist von mir. Da gibt es auch ein Klassensystem. Man hat noch mehr. Gamestat Abstraktion. Gamestat sind sinnvoll, wenn man Sachen wie Menü, Hauptspiel, Endscreen voneinander trennen möchte die von euch die JavaScript können. Das ist im Prinzip das Gleiche wie diese JavaScript Timer, wo man sagen kann, in vier Minuten eine Funktion aus. Vektorenklassen, die gibt es in Lua selber nicht. Eine Kamera und ein Wingenbuffer. Das Ganze ist auf gehtab. So guter Letzt offen. Das ist eine Qualitionserkennung. Das ist nämlich auch nicht drin. Es ist ein recht flexibles System, das viel einfacher macht eine Qualitionserkennung zu machen. Haben wir auch gleich ein Beispiel. Dann fangen wir an. Das erste Spiel sieht so aus. Später. Ist nicht so arg geguckt. Gut. Ja. Dafür benutzen wir diese Animation Library oder NAL. Was das Ding macht, ist im Prinzip Bilder, die Frames aneinandergezeichnet sind oder immer nur ein Ausschnitt von Bildern zu zeigen, die nach einer bestimmten Zeit sich ändern. Das sieht zum Beispiel so aus. Dass wir jetzt die Animation für den Hammerlinie gesehen haben, hat es relativ billig. Einmal vor hinten sieht, einmal hier drauf haut. Ein bisschen komplizierter, die von dem Viech, was aus dem Boden rausgekommen ist. Okay. In Love Load. Also hier dieses DT ist gleich nach Min, DT und so weiter. Das dient dazu, dass wenn die Frame irgendwann mal unter 30 Frames pro Sekunde sinken sollte, dass wir dann sagen, dann macht das Spiel dort langsamer. Es ist sinnvoll, wenn man sich bewegende Objekte hat, damit es nicht plötzlich ausspringt. Okay. Als erstes sind wir mal die Hintergrundfarbe. Das geht mit Love Graphics setBackgroundColor zu einem schönen Grün. Sieht so aus. Dann verstecken wir den Mauszeiger und setzen den Zufallsgenerator. Das ist eine Lua Funktion, keine La Funktion. Okay. Dann laden wir uns den Hammer. Da verstände eine lokale Variable, weil wir nicht einen globalen Scope haben möchte. Wo das Bild dran gespeichert ist. Und dann eine Animation. Das geht über die Funktion New Animation, die wir in NA definiert haben. Was das macht, oder was das haben möchte, das erst mal das Bild. Dann wie breit so ein Frame ist. Und wie hoch ein Frame ist. Wie lange Zeit zwischen den 2 Frames passieren soll, wobei diese Animationen sollen nicht automatisch ablaufen. Deswegen ist der Parameter egal, wo es die Frames gibt. Kann man aber auch weglassen, dann wird das automatisch errechnet. Okay. Das Ganze kann man sich dann hier hinmalen. Hier ist mit der Animation von Pro. Geben wir die Koordinate. Die sollen in die Mauskoordinate gezeichnet werden. Die wir mit laf.maus.getPosition hätten das gedacht bekommen. Laf.maus.getPosition 2 zurück, die wir uns dann in der X und Y sprechen möchten. Ja. Soll an der X und Y Position gemalt werden, soll nicht rotiert werden. Soll skaliert werden mit 1 und 1, also 100% breit und höher. Warum machen wir das? Das sind auch die starren Parameter, aber warum machen wir das? Das haben wir am Mittelpunkt an eine andere Stelle setzen möchten. Das kommt später. Oder den Mittelpunkt von dem Bild, wo das quasi angezeichnet wird, soll auf der Maus legen und nicht die oberen linke Ecke des Bildes. Okay, jetzt können wir diesen Hammer bewegen. Ist insofern noch nicht so viel anders als gerade eben das Hamsterbohr. Aber jetzt kommt einer dieser, oder zwei dieser Corebacks für die Inputs. Die waren Key Pressed, Key Released und Maus Pressed, Maus Released und so weiter. Wir benutzen Maus Pressed. Das kriegt als Argumente geliefert die X und Y Koordinate, wo die Maus ist und welcher Button gerückt worden ist. Wenn das passiert, setzen wir die Animation oder das Frame der Animation auf das zweite Frame. Und wenn die Maus wieder losgelassen wird, dann soll die Animation auf das erste Frame zurückgehen. Auch hier gibt es X und Y und den Button, der gedrückt oder losgelassen worden ist. Ja. Was kann ich? So. Nee, kann ich nicht. So, besser? Ich kann es auch kleiner machen, wenn ihr das besser lesen könnt. Ihr könnt es immer noch lesen? Immer noch? Okay, was jetzt passiert, wenn man klickt, wird das zweite Frame angezeigt. Das ist auch schon spaßig. Okay. Was jetzt noch fehlt, sind diese anderen Fiche. Die, weil wir die mehrfach brauchen, erstellen wir uns eine neue Liste, ein neues Table, diese Universilidadinstrukturen nur, die man als Area benutzen kann, als Set benutzen kann, als Mögliche benutzen kann, auch als Klasse. Also, ein dieser Tables, wo die dringend speichert werden und erstellen eine neue Funktion, die dann so ein Null irgendwo hin malt oder hinarstellt. Dafür werden wir uns zufällig in Position aus. Das ist ein zufälliger Wert zwischen 100 und 700, mehr oder weniger zufällig. Das benutzen mich die Zielvariante von dieser Rente, sonst ist es egal. Dann brauchen wir, oh, wir brauchen noch das Bild, das können wir uns lokal für diese Datei speichern oder global. Jedenfalls irgendwie so, dass wir dran kommen aus dieser Funktion, dass wir das nicht immer wieder neu laden müssen. So. Dann erstellen wir die Animation. Ein Frame ist 77 Pixel breit und 113 Pixel breit in der Animation. Die Zeit zwischen zwei Frames die vergehen soll, soll 100 Millisekunden sein und weil das automatisch ausrechnen in dem Fall nicht so gut funktioniert sagen wir, es gibt 6 Frames. Dann wird dem Rodus diese Animation, die kann entweder loopen oder hin und zurück laufen oder was wir wollen, einmal laufen und dann stoppen und dann wird das ganze Ding in dieses Z oder in diese Tabel geschrieben, die wir als Z benutzen. Da als Tabelindex in Lohr kann alles mögliche sein, was in Wert. In Lohr ist außer Nils die universelle Nichtwert. Und als weil wir noch die Position von den Dingern brauchen um die zu zeichnen, kommt die da auch ins Z. Also wir haben jetzt drin gespeichert relativ kompakt die Animation und die Position der Animation, dann kann man später drüber loopen. Zum Zeichnen geht man dann in den genischen Vorlog in Lohr. Es bedeutet einfach, für alle Key-Value-Pars aus diesem Z malen die Animation an der Stelle X, Y, die wir umgespeichert haben. Hier muss auch wieder den Mittelpunkt des Bildes auf den Mittelpunkt oder die da, wo das singlet zeichnet werden soll, das soll der Mittelpunkt des Bildes sein, noch nicht die oben links Position, deswegen wieder dieses bisschen nervige 011 und dann ein Offset das müsst ihr jetzt aber glauben. Und wenn man die Funktion auch noch ausführt hier oben, dann hat man da einen gut, der bewegt sich jetzt nicht so viel. Das liegt daran, dass man die Animation updaten muss damit die Lab überrascht, wie viel Zeit bestrichen ist und dann das nächste Frame zu schalten. Das passiert auch wieder mit diesem Vorloop, aber die Positionen jetzt nicht brauchen. Und da gibt es einfach eine Update-Kunktion der man die DC übergibt und dann macht das das Automatisch. Und jetzt geht er hoch. Weil der allerdings auch wieder runtergehen sollte irgendwann benutzen wir die Timelabry aus Hump Wir nehmen uns ein oder wir rechnen uns einen zufälligen Delay solange wieder neu da sein soll irgendwas zwischen 500 Millisekunden und 3 Sekunden jemals wird die Animationsrichtung wieder umgedreht und dann soll die Animation gespielt werden das passiert also nach 500 Millisekunden oder 3 Sekunden dann weil das Objekt im Prinzip dann noch gespeichert wäre nach dieser Zeit, müssen wir noch einen 2. Timer angeben der ein bisschen später, wenn der neu komplett runtergefahren ist den aus dem Array entfernt das passiert mit neugleichen Neel wenn wir das Ding Neel setzen dann wird es aus dieser Table entfernt was man auch noch machen muss mit der Update ist die auch noch in diese Love Update reintragen okay dann müsst ihr jetzt sehen wie der fährt hoch und fährt wieder unter was man auch noch machen kann ist jetzt statt das hier einmal nur einer gesporen wird dass man dann auch eine Timerfunktion sich schreibt die noch in einer gewissen Zeit einen neuen neu erstellt Funktionen in dieser Timerlabel kriegen sich selbst als Argument das dient dazu dass man die Funktion quasi selber wieder nach reintragen kann um dann so periodische Events zu bekommen also auch hier 2. Zahle bedeutet die Funktion wird einfach nochmal eingetragen nach einer random Zeit und dann läuft das für immer sagen wir 2. und der 3. also weiter okay was jetzt noch ein bisschen fehlt ist dass man diese Noils weggauen kann weil wenn man jetzt drauf haut, dann passiert nichts also wenn die Maus geklickt worden ist wird nicht nur der Hammer runtergeschmissen sondern auch nicht geguckt in diese Liste der Noils wisst ihr was Noils sind eigentlich nicht, das sind diese Viecher nehmen wir uns einfach den Abstand von der Position oder von dem Mittelpunkt dieses Bild ist deswegen mussten wir diesen Offset angeben zu der Maus und wenn dieser Abstand kleiner als 70 Pixel ist das ist ein bisschen größer als wie groß das Bild an sich ist dann wird dieser Noil entfernt und rausgesprungen damit kann man die das sollte nicht passieren klar das ist ein bisschen nervige sache an nur wenn man undefinierte Variabeln hat dann wird nicht gewarnt undefinierte Variabeln sind Fertifold, Niel und was jetzt passiert ist, dass dieses Noil nicht definiert ist, das heißt ich versuche die Tabellen Noils mit Niel zu initiieren und das geht nicht aber so geht's zack weg und wie bereuchte wir halt irgendwie damit man das Ganze ein bisschen motivieren kann eine Punktzahl die wird auch hier initialisiert dann wird sie angezeigt oben links und wenn da getroffen wird, kriegt man Punkte wenn nicht getroffen worden ist werden Punkte abgezogen ist ein bisschen kleiner oben deswegen machen wir das ganz größer das geht mit Graphics da kann man entweder ein TTF-Fond reinladen oder ein Bitmap-Fond oder einfach den der schon dabei ist mit einer bestimmten Größe und das machen wir ein bisschen größer angezeigt ja das ist ein wesentlicher Spiel in der Version die ich gerade eben gesehen hab da war das ein bisschen anders da wurden dann noch Text angezeigt wenn man getroffen hat das ist im Prinzip auch nichts anderes als dass man sich den Text in der Tabelle sprach hat und dann dann mal wieder erstellt der dann Text nach einer bestimmten Zeit löscht und die Texte mal halt in diese Love Draw bis im Prinzip genauso gleich wie mit diesen Noils habt ihr da zu fragen also in dieser Transformation macht man wie wir so einen Artistic nee die werden in diese Love Graphics Draw beziehungsweise in dieser in dieser Draw Funktion von diesen Animationen reingegeben du hast ja immer die Position xy dann die Rotation dann die Ex-Richtung und Y-Richtung und den Mittelpunkt der Transformation nee, du hast Zugriff auf die OpenGL Funktion GL Translate und so das funktioniert dann so, dass man was du machen würdest wir eben den Stack bei die Matrix pushen dann irgendwie transformieren die Matrix wieder poppen und jetzt ist das alles weg ja, da ist es ja also funktioniert, das könnt ihr auch machen ja diese Parameter bei diesen Draw Funktionen sind halt schneller, für dich zugänglicher Trend oder dann auf so ein Ding umschraten ja, kann man aber machen noch fragen habt ihr da gemacht, bevor ihr sitzt heißt Lick Lick ja, wirst du dazu was sagen ok, ich seh schon und gibts auf jeden Fall das zweite Spiel ist ein Klassiker, den wir machen werden wow geht mit relativ wenig Zeit warum ich das mache, ist in die zweite Library diese Collision Detection zu zeigen, weil es nicht ganz trivial ist aber doch oft gebraucht wird von Spielen ok, gleich am Anfang brauchen wir wahrscheinlich noch den Vector der bei Hard & Clash mitgeliefert wird wie das Ganze funktioniert ist recht ausführlich dokumentiert die Links sind glaube ich im Game Jam Wiki auch eingetragen ich stelle den Code mit Links und so weiter auch noch im Game Jam Wiki, wenn der Vector gefertigt ist aber gut Pong Hard & Collider muss initialisiert werden bevor es benutzt werden kann und es funktioniert so, dass man Core Red Funktionen sich definiert die aufgerufen werden einmal dann, wenn zwei Dinger kollidieren und einmal dann, wenn zwei Dinger aufhören zu kollidieren, wobei Hard & Collider nur die Kollisionserkennung macht da wird nicht drauf reagiert das heißt, wenn ihr sagen wollt wenn der Ball gegen das Paddle schlägt, dann soll der zurückflogen werden das müsst ihr selber programmieren ist keine Physik Engine will ich damit sagen also machen wir uns einen Codeback der kriegt als Argumente die verstrichende Zeit die beiden Shapes die kollidieren und einen Vector der diese beiden Shapes trennt den brauchen wir aber nicht in der Installisierung mitgegeben okay wie gesagt, es arbeitet mit Shapes davon gibt es mehr es gibt Punkte, Kreise und beliebige Polygone nicht nur Konvex also beliebige simple Polygone simple ist, dass sie sich nicht selber schneiden und dass sie keine Löcher haben der Ball ist ein Kreis im Wesentlichen mit dem Radius 20 der wird dann dargestellt und hier wurde gemalt was man auch noch machen muss ist die Qualifikationserkennung in Love Update, damit was gemacht wird oder mit die Qualifikation erkannt werden wenn man das macht, hat man in den Ballen sehr schön die Paddle sind zwei Rechtecke der bereitet 20 in der Höhe 150 die ersten beiden Parameter sind die XY-Koordinate, wo das Rechteck hin soll und die nächsten beiden, die bereiten die Höhe man könnte die jetzt direkt positionieren wo sie später hin sollen man kann die allerdings auch, was ich ein bisschen angenehmer finde dann an eine Stelle schieben wobei das relativ zum Mittelpunkt der Shape ist das heißt, das Ding wird nach das rechte Paddle wird 600-20 an die Position 600-20 geschoben und 300 das sind die Mitte am rechten Bildschirmrand und das linke Paddle wird nach links geschoben in die Mitte sollten die eigentlich gemalt werden das ist nicht ganz am rechten Bildschirmrand weil das 830 muss genau jetzt haben wir die beiden passiert noch nicht so arg viel deswegen gibt man im Ball eine Richtung mit das ist ein Vector der nach rechts zeigt und in der Love Update wird einfach der Ball bewegt mit in die Richtung, die er hat mal die Tee und zwar 200px oder 150px pro Sekunde dieser Ausdruck, der ergibt ein Vector Move erwartet allerdings zwei Werte, die XY Position um die man das verschieben möchte dafür gibt es die Funktion Unpack wenn man sagt Werte das Ding als Vector aus und dann werden die Funktion Unpack drauf an jetzt bewegt er sich aber er geht ruhig dafür hat man diese On Collide Funktion dafür finden wir erstmal raus, welches denn die andere Shape ist also wir wissen ja, wenn zwei Dinge kollidieren, muss das eine oder beide sein weil nur das sich bewegt also wenn A der Ball ist dann ist das andere, auf jeden Fall B wenn B der Ball ist dann ist das andere A warum machen wir das weil bei Pfong je nachdem, worauf den Pedal aufgeschlagen wurden, ist der Ball sich anders bewegt was man schon vormachen kann ist einfach die Richtung des Balls ändern spiegeln an der Y-Achse und jetzt je nachdem wo der Ball auftritt relativ zum Mittelpunkt des anderen Shapes soll nach oben oder nach unten abgestrahlt werden das funktioniert mit dafür brauchen wir erstmal den Mittelpunkt des Balls das geht so und den Mittelpunkt des anderen Shapes und das ist dann einfach einfach der Differenz weil das Ding nicht normalisierter Vektor ist würde das Ding immer weiter wachsen, deswegen normalisieren wir das Beschluss geht so und jetzt haben wir wieder einen Richtungsvektor der einfach nur in eine Richtung zeigt jetzt müsste er abgestrahlt werden, ja, sehr schön noch kann man die Pedal an den beiden Seiten allerdings nicht bewegen das passiert wieder an der Lab Update links wird mit B und S gesteuert das heißt wenn die Tasse Wege drückt wird das ganze um 200 Pixeln in die Sekunde noch oben bewegt werden wenn S gedrückt wird noch unten bewegt werden und das rechte wird mit hoch und runter gesteuert jetzt müsste man die genau hoch und runter starren können und das ist falsch das ist ein bisschen groß hier wahrscheinlich da geht es schon besser ok, was hier jetzt passiert ist, dass der Ball oben und unten rausfliegt deswegen werden jetzt noch begrenzende Shapes eingeführt oben, unten, links und rechts die müssen nicht gemalt werden, die sind einfach nur da oben ist an der X-Cord D0 Beginn minus 20 ist 800 Pixel breit und 20 Pixel hoch man könnte es natürlich auch kleiner machen was dann allerdings passieren kann oder wenn man es nur einen Pixel breit macht was dann passieren könnte ist, dass der Ball durchtunnelt und das möchte man nicht unbedingt deswegen gibt man da eine gewisse Breite vor unten genauso nicht breiter als 8 oder 7 das ist ja die Y-Position nicht die X-Position links und rechts sind die Tore wenn der Ball dahin kommt, dann werden Punkte gezählt und der Ball zurückgesetzt, das sind auch einfach Shapes die fangen bei minus 20 an sind 20 Pixel breit auch wieder und 6,5 Pixel groß ok damit man damit jetzt was macht muss darauf aufreagiert werden in diesem Oncolite Coreback als jetzt passieren kann, dass das 2 Shapes kollidieren die nicht von der einer nicht der Ball ist das passiert nämlich genau dann wenn hier eins rausläuft dann kollidiert ihr das rechte Petal mit dem oberen Shape, was die Begrenzung ist bzw. unten deswegen muss man hier regieren und raus springen wenn keins von den beiden Shapes der Ball ist je nachdem wo oder was jetzt trifft also wenn die andere Shape die obere Begrenzung ist oder die andere Shape die unsere Begrenzung ist dann soll die Richtung des Balls an die X-Achse gespiegelt werden wenn das andere das linke Tor ist dann soll der Ball in die Mitte zurückgesetzt werden und die Richtung des Balls nach rechts gehen wenn das andere Shape des anderen Tor ist passiert im Wesentlichen das gleiche außer dass der Ball nach links geht und im anderen Fall ist es nur Kollision mit dem Petal das bleibt wie vorher gut Tor und mit dem Bänden kollidiert er auch richtig was jetzt noch sinnvoll wäre wäre auch wieder in der Score zu oder irgendwie Punkte zu zählen dafür nimmt man sich wieder nur Tabelle her an dem ersten Index wäre die Scoffen linken Spieler gespeichert im rechten Index die Scoffen zweiten Spieler dementsprechend wenn das linke Tor getroffen wird geht der rechte Spieler einen Punkt und sonst den linkspieler übrigens weiß nicht ob ich das aufgefallen ist nur fangen Erreindexen nicht mit 0 an sondern mit 1 das ist eine Konventionssache muss man sich auch dran sehen und das Ganze muss noch gezeichnet werden und wenn jetzt Tore fallen werden Punkte aufgezählt kann man auch wieder größer machen mit set font jetzt kann man es auch lesen das ist Punkt dieser Ball ist jetzt recht eckig der ist nicht wirklich recht eckig also für die Kollisionen ist er rund ist ein perfekter Kreis das ist jetzt nur weil er nicht mit genügend Segmenten gemalt oder das kann man allerdings in dieser Draw Funktion angeben zum Beispiel in 32 Segmenten sieht er schon relativ rund aus was man noch machen könnte wäre statt langweiligen Shapes irgendwelche Bilder dahin malen dann würden man einfach diese Draw Calls wo sind sie hier mit lock.graphics.draw und dann Bild und dann die Position wo das Shape eben ist habt ihr Fragen hast du die nicht? ne also wenn du Bilder hast die eine Form drin haben dann musst du dir ein Polygon drüberlegen das dient einfach dazu dass diese per Pixel Kollisionen nicht so schnell sind weil Bilder in Larves sind immer Textur in OpenGL und wenn ich die Pixel Daten davon haben möchte muss ich die erst aus dem Textursprecher aus der Grafikkarte laden und gerade geht aber auch haben Leute gemacht, braucht man aber meistens nicht also meistens reicht es auch schon wenn man Rechtecke mit sich kollidieren lässt damit kann man schon fast alles machen sonst noch Fragen? fühlt ihr euch fit? ok, wie gesagt ich stelle das Ganze ins Wecke mit Copperspielen und noch ein paar Links wo es noch mehr Informationen gibt das wars