Frage zu Types in Blitzmax

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu Seite Zurück  1, 2, 3  Weiter

Neue Antwort erstellen

 

LucySalz

BeitragDi, Dez 20, 2011 19:50
Antworten mit Zitat
Benutzer-Profile anzeigen
nein, die 9 war einfach nur so, hätte auch 56 sein können ^^

also muss ich
Local saurier:TMonster[50] angeben, wenn ich 50 saurier will? und dann spreche ich sie an?

könnte man mir ein beispiel zeigen (proggen)

wo ich ca 3 saurier habe, die ich dann als drawrect ausgebe, und zb über die tasten 1,2,3 deren werte erhöhen kann?
also zb ich drücke auf 1, dann wird kreis[1] um 1 breiter oder so....

somit könnte ich im zusammenhang lernen, wenn es zu viel ist , wäre es auch ok, es wäre nur für mein verständnis.... es ist echt schwer in types reinzukommen ^^
Lars Kammer

Propellator

BeitragDi, Dez 20, 2011 19:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Ein paar Methoden zum Ansprechen von Types:

1. Die einfache Variable
BlitzMax: [AUSKLAPPEN]
Local meinsaurier:TMonster = New TMonster


Dies ist die einfachste Methode, und auch die Beschränkteste. Sie eignet sich für einzelne Instanzen, von welchen du immer wissen willst dass du sie jetzt gerade ansprichst, z.B. den Spieler.

2. Das Array
BlitzMax: [AUSKLAPPEN]
Local meinesaurier:TMonster[10]
meinesaurier[0] = New TMonster


Arrays eignen sich zum ansprechen einer bekannten Anzahl an Objekt-Instanzen, bei welcher man immer wissen will welche Instanz man gerade anspricht oder jede einzeln ansprechen will.

Die Linked List
BlitzMax: [AUSKLAPPEN]
Local meinesaurier:TList = New TList
Local bla:TMonster = New TMonster
meinesaurier.AddLast(bla)

For Local einsaurier:TMonster = EachIn meinesaurier
' Ansprechen
Next


DIe Linked List eignet sich für eine unbekannte oder sich verändernde Anzahl an Objekt-Instanzen, welche man zwar jede einzeln ansprechen möchte, aber nicht unbedingt jede im speziellen anders ansprechen möchte. Es ist die komplexeste, aber flexibelste Methode die es gibt.

EDIT:

Zum erhöhen eines Wertes brauchst du ein Feld innerhalb des Objekts, welches du erhöhst. Das Objekt selber kannst du nicht "erhöhen". Ein Objekt ist nur ein Container (Behälter) für Variablen, Konstanten, Methoden und Funktionen, welche zu diesem Objekt gehören.
Propellator - Alles andere ist irrelephant.
Elefanten sind die Könige der Antarktis.

BlitzMoritz

BeitragDi, Dez 20, 2011 21:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Propellator hat Folgendes geschrieben:
Arrays eignen sich zum ansprechen einer bekannten Anzahl an Objekt-Instanzen, ...

Nö, bekanntermaßen sind Arrays beliebig erweiterbar, z.B. so:
BlitzMax: [AUSKLAPPEN]
Graphics 800,600

Local point%[]

Repeat
Cls

If Len(point) >= 2 Then
DrawOval point[0]- 4, point[1] - 4, 8, 8
For Local i% = 0 To Len(point)-3 Step 2
DrawLine point[i], point[i+1], point[i+2], point[i+3]
DrawOval point[i+2]- 4, point[i+3] - 4, 8, 8
Next
End If

If MouseHit(1) Then
point = point[.. Len(point)+2]
point[Len(point)-2] = MouseX()
point[Len(point)-1] = MouseY()
End If

Flip

Until KeyDown(KEY_ESCAPE) Or AppTerminate()
 

LucySalz

BeitragDi, Dez 20, 2011 21:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke an alle, ich schau mir alles mal an, blitzmoritz dein code ist echt gut, ich schau mir mal das an, dann kann ich selber mal sowas machen.

Dieser Thread ist ein vorzeige beispiel für all die anfänger, denen types auch schwer fallen.
ich denke es eignet sich gut in der tutorial sektion ^^

alle sind wirklich gut, habt ihr gute arbeit geleistet, danke ^^
Lars Kammer

ZEVS

BeitragDi, Dez 20, 2011 21:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich möchte zu BlitzMoritz' Code hinzufügen:
Die Len-Funktion assoziiere ich persönlich eher mit Strings. Eine Polymorphie mit Arrays war mir unbekannt, doch bleibt zu erwähnen, dass man das Gleiche wahrscheinlich schneller unter der Eigenschaft Array.length ermitteln kann.

ZEVS

Holzchopf

Meisterpacker

BeitragDi, Dez 20, 2011 21:46
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzMoritz hat Folgendes geschrieben:

Ich möchte der Vollständigkeit halber noch anfügen, dass die Aussage von Propellator, Zitat:
Arrays eignen sich zum ansprechen einer bekannten Anzahl an Objekt-Instanzen
keinerlei Mängel aufweist. Nicht, dass BlitzMoritz' Nö hier irgendjemanden (generell Neulinge) verwirrt. Ja, es ist richtig, dass man Arrays ganz einfach dynamisch verändern kann. Und BlitzMoritz' Zusatz sollte nicht vergessen gehen. Aber die Umkehrung von Propellators Aussage, die lauten würde: "Zum Ansprechen (oder Speichern) einer bekannten Anzahl an Objekt-Instanzen eignen sich Arrays", trifft dafür umso mehr zu.
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

Propellator

BeitragDi, Dez 20, 2011 21:58
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzMoritz:
Wunderbar, du weisst wie man Slices benutzt. Nur, was passiert wenn du ein Objekt löschst? in einer Linked List kein Problem, wenn du es aus der Liste nimmst, wird einfach die Abhängigkeit eines Links geändert. Bei einem Array kannst du die einzelnen Einträge zwar über einen Index ansprechen, darfst aber beim Löschen auch alle wieder neu anordnen. Ich würde Keinem anraten, etwas wie Schüsse mit Arrays + Slices zu erledigen, genau aus diesem Grund.

ZEVS: Performance in diesem Bereich spielt meistens keine Rolle.
Propellator - Alles andere ist irrelephant.
Elefanten sind die Könige der Antarktis.
 

LucySalz

BeitragDi, Dez 20, 2011 22:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich glaube das beispiel mit blitzmoritz verwirrt mich nochmehr Sad Confused Laughing

dabei verstehe ich folgendes nicht:

1. den befehl Len in diesem codezusammenhang
2. warum ich das nicht einfach machen kann:

If MouseHit(1) Then
test[i] = i + 1
End If

3. point = point[.. Len(point)+2] .... was bedeutet das: .. ?
4. die logik verstehe ich nicht, obwohl das programm perfekt ist..... ich raff das nicht... sorry Confused Sad
Lars Kammer

BlitzMoritz

BeitragMi, Dez 21, 2011 0:09
Antworten mit Zitat
Benutzer-Profile anzeigen
@LucySalz: Mit Len(array) bekommst du die "Länge" heraus, also wieviele Einträge dein Array hat, falls du das nicht irgendwie anders gezählt haben solltest. Aber Achtung: die Indizes gehen nur von 0 bis Len(array)-1.

Bei array = array[.. n] musst du nicht viel verstehen, die Schreibweise bedeutet lediglich, dass du das vorhandene Array auf insgesamt n Einträge veränderst. Und array[.. Len(array)+2] bedeutet eben zwei Einträge mehr als vorher.
Entfernen kannst du einen einzelnen Beitrag natürlich auch, es gibt dafür nur keinen simplen "Remove"-Befehl, du müsstest es in einer kleinen Schleife selbst besorgen, was aber kein Ding ist. Im folgenden erweiterten Beispiel habe ich dir dafür die Function "ArrayRemove" geschrieben, mit der du einzelne Punkte wieder entfernen kannst, wenn du d'raufklickst:
BlitzMax: [AUSKLAPPEN]
Graphics 800,600

Local point%[]

Repeat
Cls

If Len(point) >= 2 Then
DrawOval point[0]- 4, point[1] - 4, 8, 8
For Local i% = 0 To Len(point)-3 Step 2
DrawLine point[i], point[i+1], point[i+2], point[i+3]
DrawOval point[i+2]- 4, point[i+3] - 4, 8, 8
Next
End If

If MouseHit(1) Then

Local deleting@
For Local j% = 0 Until Len(point)-1 Step 2
If Abs(MouseX()-point[j]) <= 8 And Abs(MouseY()-point[j+1]) <= 8 Then
ArrayRemove(point, j, 2)
deleting = True
Exit
End If
Next

If deleting = False Then
point = point[.. Len(point)+2]
point[Len(point)-2] = MouseX()
point[Len(point)-1] = MouseY()
End If

End If

Flip

Until KeyDown(KEY_ESCAPE) Or AppTerminate()


Function ArrayRemove(array%[] Var, start_index%, count%)
Local k%, new_array%[Len(array)-count]
While k <> start_index
new_array[k] = array[k]
k:+1
Wend
k = k + count
While k < Len(array)
new_array[k-count] = array[k]
k:+1
Wend
array = new_array
End Function

Du musst dir eben die Frage stellen, ob je nach deinem Anwendungsbedarf das gezielte Ansprechen einzelner Indizes diesen kleinen Umweg beim Entfernen rechtfertigt oder nicht.
Mein Beispiel könntest du natürlich auch genauso mit Listen machen, ich selbst mag Listen sehr, aber du solltest aus irgendwelchem voraus Gesagtem nicht behalten, Arrays könne man nicht dynamisch behandeln.

Edit: Hier, zum Vergleich für dich, das Ganze in einer Liste, vielleicht ist dir das angenehmer:
BlitzMax: [AUSKLAPPEN]
Graphics 800,600

Local p:point, list:TList = CreateList()
Type point
Field x%, y%
End Type

Repeat
Cls

Local memo:point
For p = EachIn list
DrawOval p.x-4, p.y-4,8,8
If memo <> Null Then DrawLine(memo.x, memo.y, p.x, p.y)
memo = New point
memo.x = p.x
memo.y = p.y
Next

If MouseHit(1) Then

Local deleting@
For p = EachIn list
If Abs(MouseX()-p.x) <= 8 And Abs(MouseY()-p.y) <= 8 Then
ListRemove(list, p)
deleting = True
Exit
End If
Next

If deleting = False Then
p = New point
p.x = MouseX()
p.y = MouseY()
ListAddLast(list, p)
End If

End If

Flip

Until KeyDown(KEY_ESCAPE) Or AppTerminate()
 

LucySalz

BeitragMi, Dez 21, 2011 0:59
Antworten mit Zitat
Benutzer-Profile anzeigen
mit TList ist es wirklich angenehmer, die arrays machen mich nur aggressiv.... ich raff die einfach nicht... irgendwie bin ich nen schlechter programmierer.... zu dumm arrays zu verstehen... types gehen... aber arrays nicht... schade....
Lars Kammer
 

Lion

BeitragMi, Dez 21, 2011 1:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Arrays sind eigentlich recht einfach. Und die Tatsache, dass du sie nicht sofort verstehst ist nicht weiter schlimm und heißt nicht, dass du ein schlechter Programmierer bist. Du fängst halt gerade erst an.
Und wenn du die Types wirklich verstehst (auch wenn du dir wohl noch nicht den gesamten Funktionsumfang von denen klar gemacht hast), ist das schon mal echt gut Wink Da haben nämlich die meisten wesentlich mehr Probleme beim verstehen als bei Arrays. Die verstehst du mit der Zeit auch schon noch Wink
Intel Core 2 Quad 4x2.66 ghz - 4gb ddr2 - nvidia GeForce GTX660 2gb
Intel Atom 1x1.83 ghz - 2gb ddr2 - intel GMA 3150 256mb
AMD A10-5750M 4x2.5 ghz - 8 gb ddr4 - AMD R9 M290x
 

LucySalz

BeitragMi, Dez 21, 2011 10:11
Antworten mit Zitat
Benutzer-Profile anzeigen
danke für die aufbauenden worte Smile

die types kenn ich noch von blitzbasic3d, da habe ich die in einem kleinerem umfang genutzt....

Ein sehr guter freund sagt immer, dass arrays sehr wichtig sind und man muss sie beherrschen....

naja mal sehen, lern ich auch noch Very Happy Very Happy Very Happy

Ps. ich warte gerade auf mein buch, Game Programming for Teens 3. Auflage, sollte heute oder morgen kommen, hoffe, dass ich eine gute Wahl getroffen habe?! oder gibt es noch Empfehlungen? Smile
Lars Kammer

BlitzMoritz

BeitragMi, Dez 21, 2011 10:47
Antworten mit Zitat
Benutzer-Profile anzeigen
LucySalz hat Folgendes geschrieben:
mit TList ist es wirklich angenehmer, die arrays machen mich nur aggressiv....
Wink Bei mir war's früher umgekehrt: Das Gefühl, nicht indiziert auf einzelne Listeneinträge zugreifen zu können, war mir irgendwie unangenehm.
 

LucySalz

BeitragMi, Dez 21, 2011 10:58
Antworten mit Zitat
Benutzer-Profile anzeigen
wie schon gesagt wurde, ich verstehe die types zwar, habe sie aber bestimmt noch nicht sie in voller bandbreite verstanden ^^

ich kenn es noch von blitz3d: typ erstellen, nutzen und fertig.... blitzmax ist da etwas "unfreundlicher" Smile
Lars Kammer

klin

BeitragMi, Dez 21, 2011 14:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Es kommt darauf an, wie man diese gelernt hat. Wenn man z.B. zuerst von BB gelernt hat und schon daran gewöhnt ist, ist alles "unfreundlicher". Dafür kann man mit Bmax Types viel mehr anstellen wie bei den BB Types.

BlitzMax ist eben eine höhere Ebene als BB. Daran muss man sich gewöhnen. Also fang lieber mal nicht mit Monkey an ^^. Das ist nämlich richtig C++ like Wink

Klin
 

LucySalz

BeitragMi, Dez 21, 2011 14:31
Antworten mit Zitat
Benutzer-Profile anzeigen
wenn wir schonmal in dieser runde sind, und es erwähnt wird... was ist eigentlich monkey genau?`??? was kann ich damit machen, wie kann ich es machen... und warum? Smile Very Happy
Lars Kammer

ZEVS

BeitragMi, Dez 21, 2011 16:11
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzMoritz hat Folgendes geschrieben:
Das Gefühl, nicht indiziert auf einzelne Listeneinträge zugreifen zu können, war mir irgendwie unangenehm.

TList.ValueAtIndex ist zwar langsam, aber wirkungsvoll.
Zitat:
Was ist Monkey?

Ich bin kein Experte, besitze Monkey nicht, schaue aber mit offenen Augen durch dieses Portal.
Monkey ermöglicht programmieren für viele sog. Targets, die IPhone, Andriod, Windows Phone, Flash, HTML5-Canvases und weitere beinhalten. Damit ist Monkey der kleinste gemeinsame Nenner von Objective C (IPhone), Java (Android), Action Script (Flash), JavaScript (HTML 5) und kompillierten Binärcode. Mit anderen Worten: Monkey kann fast nichts. Somit muss man (soweit ich es mitbekomme) das Programm den einzelnen Targets anpassen.
Zitat:
Wie kann ich mit Monkey programmieren?

So wie mit BlitzMax, nur halt schwieriger.
Zitat:
warum

Es ist schon toll, ein Programm praktisch überall zum Laufen zu kriegen. Im Idealfall beschränken sich die Entwicklungskosten (Zeit ist Geld) zum Programmieren für die einzelnen Targets auf die Entwicklungskosten eines einzelnen, nur halt, dass man eine größere Zielgruppe hat. Wenn man das Programm verkaufen will, eröffnet sich der normale PC-Markt, IPhone, Andoid und Windows-Phone - Markt und man kann Demos in Flash oder HTML5 anbieten, die man mit jedem Browser zum Laufen kriegt.

Zu TList/Array:
TList ist ein klares Anwendungsgebiet von gleichberechtigten Objekten in beliebiger Menge und kommen den BB-Types nahe. Arrays entsprechen daher den BB-Dims. Das Beispiel von BlitzMoritz würde ich mit Punkt-Type und TList machen.
Man sollte aber auch nie eine hierarchische Type-Struktur aus den Augen verlieren...

ZEVS
 

LucySalz

BeitragMi, Dez 21, 2011 19:38
Antworten mit Zitat
Benutzer-Profile anzeigen
danke ZEVS Smile

@klin

BlitzMax: [AUSKLAPPEN]
SuperStrict
Type TMonster
Field derp:Int
EndType

Local SaurierListe:TList = New TList

Local i:Int
Global x:Int
Global w:Int

Graphics 800, 600

While Not KeyHit(KEY_ESCAPE)
'Hundert Saurier erstellen
Cls

For i = 1 To 10
Local saurier:TMonster = New TMonster
saurier.derp = Rand(0,100)
SaurierListe.AddLast(saurier)
Next

'Ausgabe
For Local saurier:TMonster = EachIn SaurierListe
DrawText saurier.derp, 0, x
x = x + 10
Next

'For w = 0 To SaurierListe.Count()

DrawText SaurierListe.Count(), 90, 90

'Next

Flip
Wend


hab da mal 3 fragen:

1. DrawText SaurierListe.Count(), 90, 90 bei dem zählt er unendlich weiter, obwohl ich nur testweise 10 new einträge erstelle???

2. wie kann ich jetzt zb: saurier(5) ansprechen

3. wie kann ich zb saurier(5) mit werten versehen und sie dann per zb. Drawtextbefehl ausgeben?

die fragen scheinen sich zu wiederholen, doch brauche ich antworten zu den gegebenen beispielen, so lerne ich.... sorry wenn ich nerve, ich raff es eben noch nicht ganz ^^
Lars Kammer

Xeres

Moderator

BeitragMi, Dez 21, 2011 19:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
1. DrawText SaurierListe.Count(), 90, 90 bei dem zählt er unendlich weiter, obwohl ich nur testweise 10 new einträge erstelle???
Erstelle sie vor der Hauptschleife, nicht darin.
Zitat:
wie kann ich jetzt zb: saurier(5) ansprechen
Es gibt im Prinzip keinen saurier(5), aber:
BlitzMax: [AUSKLAPPEN]
Local Saurier5:TMonster = TMonster(SaurierListe.ValueAtIndex(5))

SaurierListe - Das ist die Liste (TList Objekt)
ValueAtIndex(5) - Das ist die Methode, die dir mit dem Paramter den 5 Eintrag gibt.
Das Allgemeine Object, das du erhältst, castest du mit TMonster(...) in das richtige Zielobjekt.

Die Variable Saurier5 kannst du dann behandeln, wie du willst.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

Lion

BeitragMi, Dez 21, 2011 19:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Xeres hat Folgendes geschrieben:

Zitat:
wie kann ich jetzt zb: saurier(5) ansprechen
Es gibt im Prinzip keinen saurier(5), aber:
BlitzMax: [AUSKLAPPEN]
Local Saurier5:TMonster = TMonster(SaurierListe.ValueAtIndex(5))

SaurierListe - Das ist die Liste (TList Objekt)
ValueAtIndex(5) - Das ist die Methode, die dir mit dem Paramter den 5 Eintrag gibt.
Das Allgemeine Object, das du erhältst, castest du mit TMonster(...) in das richtige Zielobjekt.

Die Variable Saurier5 kannst du dann behandeln, wie du willst.

Ich empfehle hier jedoch, den Sauriern ein Field ID% zu geben, was du dann beim erstellen mit entsprechendem Wert füllst. So kannst du später dann immer denselben Saurier raussuchen, da sich die Auflistung in der Liste verändern kann und du mit einem mal einen anderen Saurier hast Wink
Vorrausgesetzt natürlich, dass du die ID einmalig verteilst.
Intel Core 2 Quad 4x2.66 ghz - 4gb ddr2 - nvidia GeForce GTX660 2gb
Intel Atom 1x1.83 ghz - 2gb ddr2 - intel GMA 3150 256mb
AMD A10-5750M 4x2.5 ghz - 8 gb ddr4 - AMD R9 M290x

Gehe zu Seite Zurück  1, 2, 3  Weiter

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group