Du bist nicht angemeldet.

  1. Übersicht
  2. » Allgemein
  3. » Monkey X - Tutorial 2
  4. » Eine Antwort schreiben

Eine Antwort schreiben

Schreibe deinen Beitrag und versende ihn
Beitragsoptionen
Bist Du ein Mensch oder ein Roboter ?

Verifizierung, dass diese Aktion durch eine reale Person vorgenommen wird und nicht von einem Programm.

Zurück

Themen-Übersicht (Neuester Beitrag zuerst)

Gast2
30.07.2014 21:15

Nun, mit der Variante habe ich auch schon geliebäugelt. Werd's mal mit dem bisherigen Wissen probieren.
Aber grade hat erstmal die Spielanleitung Vorrang. Außerdem macht mir grade jenes Scheißspiel mit der geilen Grafik ein paar interessante Angebote;)

Ronny
30.07.2014 20:48

Ja... Gerne auch mit "Sin" und "Tan"-Berechnungen (Einfallswinkel und Co tongue)


bye
Ron

Gast2
30.07.2014 19:17

Da fällt mir ein: Bin zwar wegen der Spielanleitung nicht mehr zu gekommen. Aber ich werde einfach 2 Bälle machen, die von den Bildschirmrändern zurückprallen und deren Geschwindigkeit sich beim Aufprall ändert.

Ronny
30.07.2014 07:58

Dafuer sind Fragen da... also ruhig stellen.


bye
Ron

Gast2
29.07.2014 23:11

Ups. Tschuldige, wenn ich Sachen frage, die wohl schonmal erklärt waren.

Irgend ist das wie mit Mathetexten, wenn mir die Gleichungen nicht schlüssig waren, verlor sich selbst normaler Text dann im diffusen.
Wenn ich jetzt Deine ersten Beispiele nochmal anschaue, ist mir da manches klarer, als zu Beginn.

Und manches bracuhe ich wohl auch einfach überdeutlich;)

Ronny
29.07.2014 22:16
Field autoA:TAuto

Hier teilen wir dem Kompiler (und Leser) mit, dass die umstehende Klasse eine Eigenschaft "autoA" hat... und diese ist vom Typ "TAuto" (sie koennte auch vom Typ "Int" oder "String" sein). Dadurch hat dann jede Instanz der Klasse die Eigenschaft "autoA" und kann auf die Eigenschaften von TAuto (und den spezifischen Eigenschaften von autoA) zugreifen.

Wir koennten schon dort die Autos erzeugen, also

Field autoA:TAuto = new TAuto(-200, 00)

Manchmal erzeugt dies auch mehr Uebersicht, manchmal aber ist ein zentraler Ort (vorallem, wenn man von einer anderen Klasse "erbt", also "class TMeinTyp extends TAndererTyp") die bessere Loesung. Notwendig ist es, wenn bei den Parametern Variablen genutzt werden (bspweise "jedes Auto ist 10 Pixel weiter rechts als das zuvor").


Gast2 schrieb:

Warum wird hier nicht gleich die Updaterate eingetragen?

Du meinst, warum ich nicht autoA.Update(x) aufrufe, um der Methode "Update()" von autoA mitzuteilen mit welchem Wert es zu arbeiten hat?

Falls ja:
Man kann alle "Update()"-Methoden so schreiben, dass sie einen "delta"-Parameter erwarten (delta = Zeit seit letztem Update als Bruchteil der Updatefrequenz: 1.0 = eine komplette Zeit zwischen zwei Updates) oder andere Werte. Oder aber man laesst sie - so wie du richtig erkannt hast - "allgemeingefasst" und laesst die Methode selbst Dinge herausfinden.

Bei TVTower bspweise kann man mittels "GetDeltaTimer().GetDelta()" von ueberall den gerade gueltigen Deltawert ermitteln. Ein Vorteil ist es, weil wir nicht immer davon ausgehen koennen, dass wir Methoden veraendern koennen, wenn wir von anderen Klassen vererben. Bei BlitzMax muss die vererbte Klasse den gleichen "Funktionskopf" besitzen wie das Original. Wenn also "Fahrzeug" die Methode "Update(x:int, y:int)" haette, muesste die "Auto extends Fahrzeug"-Klasse auch "Update(x:int, y:int)" haben und duerfte nicht einfach einen neuen Parameter hinzufuegen. Bei Monkey koennte dies dank "Ueberladung" aber funktionieren. Eindeutig macht es dies aber in dem Fall nicht. Ich persoenlich finde die Ueberladung nur bei "Settern" (also Funktionen die Werte setzen) richtig praktisch, da man da bequem fuer Dritte Sachen bereitstellen kann (SetPos(point), SetPos(x,y), SetPos(rect), ...).

-

Falls Du aber meintest, wieso ich dort nicht den Befehl "SetUpdateRate(15)" ausfuehre?
Das jedes mal zu machen, wuerde einen ziemlichen Rattenschwanz mit sich ziehen. Auch wissen wir ja nicht, ob sich da nicht intern ein Zaehler 0 setzt, oder was da noch passiert. Das ist eher ein Befehl um etwas zu Initialisieren, aehnlich einem "StarteGrafikModus()"-Befehl.


@Was meint das Int.

Ich dachte das haette ich erwaehnt. Int steht fuer "Integer".

Int ... Integer, Ganzzahlen (-5, 3, 0 ...)
Float ... Fliesskomma (1.11012, -121.22, 0.0)
Double ... groessere Fliesskommazahlen (13423423432.2342)
Long ... groessere Ganzzahlen
String ... Textzeilen ("abc", "dadgtt r g dfgd~n~n" - letzteres sind zwei "Zeilenumbrueche")

Das sind alles von der Sache her "Klassen" (aber etwas anders umgesetzt, aus Geschwindigkeitsgruenden) die Funktionen haben (strings bspweise "ToInt()" ... ein "5".ToInt() erzeugt einen Integer mit dem Wert 5).


@self
Self sagt (das habe ich auch erklaert), dass die folgende Eigenschaft sich auf die der Instanz bezieht.

Global meineVariable:Int = 5

'ich schreibe immer "T" vor den Typ, auch wenn er hier "Class" heisst
'und man da auch ein "CAuto" drauss machen koennte :p.
'Notwendig ist das nicht.
Class TAuto 
    Field meineVariable:Int = 10


    'Void besagt: es wird nix zurueckgegeben
    Method Run:Void()
       local meineVariable:Int = 20
       Print "meineVariable: " + self.meineVariable
       Print "meineVariable: " + meineVariable
       Print "meineVariable: " + .meineVariable
    End Method
End Class


Function Main()
	Local auto:TAuto = New TAuto()
	auto.Run()
End Function

@Warum "SetzeFarbe"
Ja wir haben ja die Methode "SetzeFarbe" selbst angelegt ... also selber definiert.



@Aufgabe
Erweitere das Autobeispiel um eine Klasse "TStrasse" - die kann sich ja sogar auch bewegen (wenn wir die Strassenmarkierung "bewegen"). also: graues Rechteck von links nach rechts, eigener "abstandX" fuer den Markierungsstart.
Das dient einfach dazu, dass du ein wenig mit den Klassen in Beruehrung kommst.


bye
Ron

Gast2
29.07.2014 20:18

Paar Fragen. Mußt sie nicht ausschweifend beantworten, Stichpunkte reichen sicher, da ich glaube, das Prinzip zu verstehen, aber auch Namen dafür möchte;)


    Field autoA:TAuto
    Field autoB:TAuto


Was ist der genaue Prozess, der hier abläuft bzw. beschrieben wird?



       
        'erzeuge die Autos
        autoA = New TAuto(-200, 200)
        autoB = New TAuto

Die vorher im Field benannten Autos werden jetzt erst erzeugt?



    Method OnUpdate()
        'Autos bewegen
        autoA.Update()
        autoB.Update()
    End Method

Warum wird hier nicht gleich die Updaterate eingetragen?
Weil dies eine Klasse für sich ist, die insgesamt beschreibt, was passieren soll? Die genaue Ausführung sind dann eigenen Klassen?





Class TAuto
    'Eigenschaften einer jeden Instanz von TAuto
    Field x:Int, y:Int
    Field breite:Int = 180
        'Geschwindigkeit horizontal/vertikal
    Field dx:Int = 3, dy:Int = 0
    Field farbeR:Int, farbeG:Int, farbeB:Int


Was meint hier jeweils das Int? Initiiere?


    'wenn man "new TAuto(x,y)" aufruft:
    Method New(x:Int, y:Int)
        Self.x = x
        Self.y = y
        'setze die farben jeweils zufaellig rot = 100-255, gruen ... blau ...
        SetzeFarbe(Rnd(100, 255), Rnd(100, 255), Rnd(100, 255))
    End Method

   

Was meint das Self.?
Warum „setze“? Also deutsch? Hast Du das selber definiert?




Alles in allem verstehe ich das.
Aber ob ich das jetzt umsetzen könnte?
Na, vielleicht denke ich mir mal eine Aufgabe aus.
Oder hast Du eine parat?

Ronny
28.07.2014 20:18

Die Befehle sind "Funktionen" von Modulen. Es gibt so Logiksachen wie unsere "if ... then ... else... endif". Dinge wie "Print" sind aber Funktionen die generell zur Verfuegung stehen (also nicht nur innerhalb einer Klasse).


Im naechsten Tutorial geht es dann eh um "LoadImage/DrawImage" und wir nutzen "import" um eine eigene, zweite Datei, zu importieren.


bye
Ron

Gast2
28.07.2014 19:52
Ronny schrieb:

... aber "lerne erstmal" die Grundzuege mit Monkey/Ted.


Hmm. Halte ich auch für besser;)

Also vorwärts!

Hast Du eigentlich irgendwo eine Tabelle mit den Befehlen verfügbar?

Sonst suche ich mir die selber zusammen, immer so, wie es hier vorwärtsgeht. Ist vielleicht sogar besser wegen der Einprägung.

Ronny
28.07.2014 18:05

Hmmm

ronny@RonnyPC ~/Arbeit/Programmieren/MonkeyX77a $ ldd jentos_v1.1_linux 
	linux-vdso.so.1 =>  (0x00007fff653fe000)
	libQt5WebKitWidgets.so.5 => /usr/lib/x86_64-linux-gnu/libQt5WebKitWidgets.so.5 (0x00007f8578597000)
	libQt5WebKit.so.5 => /usr/lib/x86_64-linux-gnu/libQt5WebKit.so.5 (0x00007f85762cc000)
	libQt5Widgets.so.5 => /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5 (0x00007f8575ac4000)
	libQt5Network.so.5 => /usr/lib/x86_64-linux-gnu/libQt5Network.so.5 (0x00007f8575782000)
	libQt5Gui.so.5 => /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5 (0x00007f85751b5000)
	libQt5Core.so.5 => /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 (0x00007f8574ba1000)
	libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f8574984000)
	libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f8574680000)
	libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f8574469000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f85740a1000)
	libQt5OpenGL.so.5 => /usr/lib/x86_64-linux-gnu/libQt5OpenGL.so.5 (0x00007f8573e37000)
	libQt5PrintSupport.so.5 => /usr/lib/x86_64-linux-gnu/libQt5PrintSupport.so.5 (0x00007f8573be0000)
	libQt5Sensors.so.5 => /usr/lib/x86_64-linux-gnu/libQt5Sensors.so.5 (0x00007f85739a7000)
	librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f857379f000)
	libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f8573585000)
	libXrender.so.1 => /usr/lib/x86_64-linux-gnu/libXrender.so.1 (0x00007f857337b000)
	libXcomposite.so.1 => /usr/lib/x86_64-linux-gnu/libXcomposite.so.1 (0x00007f8573178000)
	libjpeg.so.8 => /usr/lib/x86_64-linux-gnu/libjpeg.so.8 (0x00007f8572f22000)
	libpng12.so.0 => /lib/x86_64-linux-gnu/libpng12.so.0 (0x00007f8572cfc000)
	libicui18n.so.48 => /usr/lib/x86_64-linux-gnu/libicui18n.so.48 (0x00007f8572934000)
	libicuuc.so.48 => /usr/lib/x86_64-linux-gnu/libicuuc.so.48 (0x00007f85725c7000)
	libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007f8572292000)
	libxslt.so.1 => /usr/lib/x86_64-linux-gnu/libxslt.so.1 (0x00007f8572055000)
	libxml2.so.2 => /usr/lib/x86_64-linux-gnu/libxml2.so.2 (0x00007f8571cee000)
	libglib-2.0.so.0 => /lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007f85719ed000)
	libgobject-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0 (0x00007f857179c000)
	libgstreamer-1.0.so.0 => /usr/lib/x86_64-linux-gnu/libgstreamer-1.0.so.0 (0x00007f8571499000)
	libgstapp-1.0.so.0 => /usr/lib/x86_64-linux-gnu/libgstapp-1.0.so.0 (0x00007f857128d000)
	libgstbase-1.0.so.0 => /usr/lib/x86_64-linux-gnu/libgstbase-1.0.so.0 (0x00007f8571036000)
	libgstpbutils-1.0.so.0 => /usr/lib/x86_64-linux-gnu/libgstpbutils-1.0.so.0 (0x00007f8570e0f000)
	libgstvideo-1.0.so.0 => /usr/lib/x86_64-linux-gnu/libgstvideo-1.0.so.0 (0x00007f8570bcd000)
	libgstaudio-1.0.so.0 => /usr/lib/x86_64-linux-gnu/libgstaudio-1.0.so.0 (0x00007f8570987000)
	libsqlite3.so.0 => /usr/lib/x86_64-linux-gnu/libsqlite3.so.0 (0x00007f85706d3000)
	libQt5Quick.so.5 => /usr/lib/x86_64-linux-gnu/libQt5Quick.so.5 (0x00007f8570178000)
	libQt5Qml.so.5 => /usr/lib/x86_64-linux-gnu/libQt5Qml.so.5 (0x00007f856fd3b000)
	libQt5Sql.so.5 => /usr/lib/x86_64-linux-gnu/libQt5Sql.so.5 (0x00007f856fafc000)
	libQt5Location.so.5 => /usr/lib/x86_64-linux-gnu/libQt5Location.so.5 (0x00007f856f85a000)
	libGL.so.1 => /usr/lib/fglrx/libGL.so.1 (0x00007f856f64e000)
	libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f856f349000)
	libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f856f145000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f8578801000)
	libicudata.so.48 => /usr/lib/x86_64-linux-gnu/libicudata.so.48 (0x00007f856ddd4000)
	libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007f856dbb6000)
	liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007f856d993000)
	libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f856d754000)
	libffi.so.6 => /usr/lib/x86_64-linux-gnu/libffi.so.6 (0x00007f856d54c000)
	libgmodule-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgmodule-2.0.so.0 (0x00007f856d347000)
	libgsttag-1.0.so.0 => /usr/lib/x86_64-linux-gnu/libgsttag-1.0.so.0 (0x00007f856d10f000)
	libQt5V8.so.5 => /usr/lib/x86_64-linux-gnu/libQt5V8.so.5 (0x00007f856cac4000)
	libQt53D.so.5 => /usr/lib/x86_64-linux-gnu/libQt53D.so.5 (0x00007f856c588000)
	libXext.so.6 => /usr/lib/x86_64-linux-gnu/libXext.so.6 (0x00007f856c375000)
	libatiuki.so.1 => /usr/lib/fglrx/libatiuki.so.1 (0x00007f856c25a000)
	libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007f856c056000)
	libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007f856be4f000)

Klingt nach "es braucht die QT 5 Bibiotheken".

Aaaaber... ich habs jetzt mal bei Knoppix probiert: kann es sein dass Du eine 32Bit-Variante installiert hast - die Binaerdatei ist ja fuer 64Bit gemacht.

$ objdump -f jentos_v1.1_linux 

jentos_v1.1_linux:     file format elf64-x86-64
architecture: i386:x86-64, flags 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
start address 0x000000000041b675

Lass dich davon aber nicht abhalten: man kann zwar selbst das Programm kompilieren (Code ist verfuegbar) aber "lerne erstmal" die Grundzuege mit Monkey/Ted.



bye
Ron

Gast2
28.07.2014 14:09

Das klingt doch schon besser:


knoppix@Microknoppix:/media/sdb8/Monkey/MonkeyX77a$ ldd jentos_v1.1_linux
\tdas Programm ist nicht dynamisch gelinkt
Ronny
28.07.2014 13:53

LDD ... linked ... nicht I/i.

$ ldd jentos_v1.1_linux

bye
Ron

Gast2
27.07.2014 18:10

Keine Fehlermeldung

bei Ausführung "Idd jentos_v1.1_linux"


knoppix@Microknoppix:/media/sdb8/Monkey/MonkeyX77a$ Idd jentos_v1.1_linux
bash: Idd: Kommando nicht gefunden.
Ronny
27.07.2014 16:48

Keine Fehlermeldung?

fuehre im dortigen Verzeichnis mal aus "ldd dateiname", dann zeigt es dir, ob irgend eine der "Bibliotheken"fehlt (sicher was QT-maessiges).


bye
Ron

Gast2
27.07.2014 16:24

Ich hab's schon versucht über Terminal zu starten (Wird immer angeboten "ausführen", "im Terminal ausführen", "abbrechen". Geht auch nicht.