Frage zu Types in Blitzmax

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu Seite 1, 2, 3  Weiter

Neue Antwort erstellen

 

LucySalz

Betreff: Frage zu Types in Blitzmax

BeitragMo, Dez 19, 2011 16:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

wollte mal fragen wie ich das realisiere:

BlitzMax: [AUSKLAPPEN]
Strict

Graphics 800, 600

Type TMonster
Field Art
'Field Energie
'Field x, y
'Field Richtung
End Type

Local I:Int
Local Saurier:TMonster = New TMonster

While Not KeyHit(KEY_ESCAPE) Or AppTerminate()
Cls


For I = 1 To 100
Saurier(I) = New TMonster
Next



Saurier.Art = 1

Flip
Wend




das : Saurier(I) = New TMonster geht ja nicht, ich möchte aber die gleichen objekte haben, denen ich unterschiedliche eigenschaften zuweisen möchte.....

danke schonmal ^^
Lars Kammer

Propellator

BeitragMo, Dez 19, 2011 17:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Mit Linked Lists

BlitzMax: [AUSKLAPPEN]

SuperStrict
Type TMonster
Field derp:Int
EndType

Local SaurierListe:TList = New TList

Local i:Int

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

'Ausgabe
For saurier = EachIn SaurierListe
Print saurier.derp
Next

Propellator - Alles andere ist irrelephant.
Elefanten sind die Könige der Antarktis.

klin

BeitragMo, Dez 19, 2011 17:31
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzMax: [AUSKLAPPEN]
Local I:Int
Local Saurier:TMonster[101] ' Array erstellen

While Not KeyHit(KEY_ESCAPE) Or AppTerminate()
Cls


For I = 1 To 100
Saurier[I] = New TMonster ' Setzten.
Next


Du musst Arrays definieren ( [ ] ). So in etwa wäre es lösbar.

Klin

Edit: Ja, es ist auch mit LinkedLists möglich.
 

PhillipK

BeitragMo, Dez 19, 2011 17:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm ich weiß nicht, wie sowas in BB funktioniert, aber da scheint es ja dran angelehnt zu sein.

Blitzmax verwaltet das etwas anders als BB. Ich glaube, in BB musste man sich keine gedanken machen, wo die dinger referenziert sind, in Blitzmax auf jedenfall.

Dein beispiel lässt sich anders lösen.

Zum einen kannst du wie Propellator vorgeschlagen hat, eine TList verwenden, zum anderen könntest du auch eine kleine Hilfsfunktione schreiben.

BlitzMax: [AUSKLAPPEN]
Strict

Graphics 800, 600

Type TMonster
Global list:TList = CreateList()
Field Art
'Field Energie
'Field x, y
'Field Richtung

'Beispiel 1: Create-funktion welche automatisch die TList füllt.
Function AddMonster:TMonster(art:Int, energie:Int, x:Int, y:Int, richtung:Int)
Local monster:TMonster = New TMonster
monster.x = x
monster.y = y
monster.richtung = richtung
monster.art = art
monster.energie = energie

TMonster.list.AddLast(monster)
Return monster
End Function
End Type

While Not KeyHit(KEY_ESCAPE) Or AppTerminate()
Cls


For Local I:Int = 1 To 100
TMonster.AddMonster(4,25, Rand(0,20),Rand(0,20),Rand(0,1)) 'Merke: Funktionen in einem Type sind 'global' - dh sie sollten nur mit TYPE.FUNKTION aufgerufen werden. Hier: TMonster.AddMonster()
Next

'Anmerkung: Über TMonster.List sind nun alle TMonsterobjekte verfügbar.

Flip
Wend


Wenige änderungen, große auswirkung. Solche Create-funktionen in kombination mit einer Globalen type-internen liste erachte ich als äusserst hilfreich.

eine 2te idee wäre auch, eine TMap zu verwenden.
Eine TMap ist eine andere art 'liste', wo du 2 objekte miteinander assoziieren kannst und über das 'key' objekt einen zugeordneten wert finden kannst. Eachin ist ebenfalls möglich.
Am gängigsten wäre es hier, als key einen string zu verwenden. zb "Dinosaurier".

Ein kleines bissl Code:

BlitzMax: [AUSKLAPPEN]
Type TMonster
'Globales (Über TMonster zu erreichen)
Global list:TMap = CreateMap()


'Felder (über TMonster-objekt zu erreichen)
Field x:Int
Field y:Int
Field energie:Int

Function AddMonster:TMonster(x:Int,y:Int, energie:Int, name:String)
Local m:TMonster = New TMonster
m.x = x
m.y = y
m.energie = energie

Tmonster.list.insert(name, m) 'insert syntax: KEY:object, Value:Object (String ist ebenfalls vom Typ 'Object', somit bieten sich hier namensgebungen an :)
retnur m
End Function

Function CreateByName:TMonster(name:String)
If TMonster.list.contains(name) Then

'Aufgepasst:
'list.valueForKey() liefert unser für 'name' ein 'object'.
'Dieses wird mit TMonster(object) auf den typ Tmonster gecastet und danach per .copy() zurückgegeben.
'Die methode Copy gibt eine neue instanz des Objektes zurück, allerdings mit kopierten werten.
Return TMonster(list.valueForKey(name)).copy()
EndIf

Return Null
End Function

'Kopier-methode. wird benutzt, um die 'Templates' der monster zu kopieren.
Method Copy:TMonster()
Local m:TMonster = New TMonster
m.x = Self.x
m.y = Self.y
m.energie = Self.energie

Return m
End Method

End Type

Tmonster.AddMonster:TMonster(0, 0, 100, "Saurier")
Tmonster.AddMonster:TMonster(50, 100, 10, "Vogel")

Local vogel_eins:TMonster = TMonster.CreateByName("Vogel") 'hier wird die eben erschaffene TMonster instanz mit dem key 'Vogel' gesucht, kopiert und zurückgegeben.
'es ist somit möglich unendlich viele vögel mit vorher eingestellten werten zu kopieren und immer wieder zu 'erschaffen'.
 

LucySalz

BeitragMo, Dez 19, 2011 18:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke erstmal an alle, ich schau mir das mal in Ruhe an, sodass ich lernen kann ^^
Lars Kammer
 

LucySalz

BeitragMo, Dez 19, 2011 18:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Bis auf das letzte Beispiel gehen alle Codes nicht.... das letzte ist für mich zu kompliziert........

entweder wird saurierliste nicht gefunden oder andere sachen....
Lars Kammer
 

Lion

BeitragMo, Dez 19, 2011 18:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Also du musst schon den ganzen Code kopieren Wink
Denn ich seh da nirgends fehler.
Wäre auch echt supi wenn du Hilfe erwartest, dass du sagst, wo dann die 'SaurierListe' nicht gefunden wird oder indem du mal "andere Sachen" ein wenig spezifizierst, sonst wirds nämlich echt schwer zu erraten, was du falsch gemacht hast.
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

Propellator

BeitragMo, Dez 19, 2011 18:42
Antworten mit Zitat
Benutzer-Profile anzeigen
LucySalz hat Folgendes geschrieben:
Bis auf das letzte Beispiel gehen alle Codes nicht.... das letzte ist für mich zu kompliziert........

entweder wird saurierliste nicht gefunden oder andere sachen....


Das ist schade.

Werde dir aber gerne helfen, wenn du mir mitteilen könntest, was falsch sei.

MfG
Propellator - Alles andere ist irrelephant.
Elefanten sind die Könige der Antarktis.
 

LucySalz

BeitragMo, Dez 19, 2011 18:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Compile Error: Identifier 'saurier' not found
(Bei dem SaurierList und so ^^) wenn ich superstrict und strict raus lasse, geht es.



Bei PhiliK's beispiel spuckt mein programm das aus: Compile Error: Identifier 'x' not found.......


Um mein Vorhaben nochmal zu verdeutlichen, ich will mit der maus waypoints setzen, diese möchte ich in types speichern... zb:

WaypointA x=30,y=60
WaypointB x=60,y=10
....

1. es gibt vielleicht nur 3 punkte, vielleicht auch 1000.....
2. die namen stehen noch nicht fest, muss sie aber ansprechen können....

ich hoffe das hilft ein wenig ^^
Lars Kammer

Xeres

Moderator

BeitragMo, Dez 19, 2011 18:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde dir empfehlen, erst mal mit TList oder einem Array zu arbeiten.
Komplizierter muss man es sich für Waypoints auch nicht unbedingt machen.

Und: Kein Strict zu benutzen, ist keine Lösung.
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)

ZEVS

BeitragMo, Dez 19, 2011 18:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
ansprechen

Ein denkbar methaphorischer Begriff, wenn du keinen Type-Type-Chat mit Chatbot programmierst.
Willst du die Instanzen unter den Namen WaypointX ansprechen können? Dann nimm Maps.
Willst du einfach nur wissen, welcher WayPoint als nächstes kommt? Ein einfaches Field genügt.
Genügen die Integrer-IDs? Dann nimm eine Liste oder ein Array. Bei Listen hast du es prinzipiell einfacher, wenn du beliebige Zahlen hast, aber bei Arrays bleiben die Indizes konstant.

Mit anderen Worten: Was willst du konkret durchsetzen? Ein paar Methaphern zu Problemen in Beginner-Konzepten (sagt mir zumindest das Forum und die Erfahrung, ich lerne es aber gerne besser) helfen den helfenden nicht.

ZEVS
 

LucySalz

BeitragMo, Dez 19, 2011 19:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich möchte waypoints machen, die erstens unbekannt sind, mit einem linksklick der maus dann erstellt werden und dann sollen die waypoints mit linien verbunden werden.

warum geht es ohne strict? was soll ich nun machen, die codes, die ihr gepostet habt, gehen leider nicht...
Lars Kammer

ZEVS

BeitragMo, Dez 19, 2011 19:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Du speicherst die WayPoints in einer TList. Mit jedem Mausklick fügst du dieser Liste einen Eintrag hinzu.
Zum Zeichnen gibt es zwei Möglichkeiten:
1. Über eine For-Next-Schleife gehst du alle Indizes von 0 bis Count()-2 durch. Anschließend ziehst du eine Linie von WayPoints.ValuAtIndex(index) zu ...(index+1).
2. Du speicherst zu jedem WayPoint den nächsten. Eventuell erübrigt sich so auch die Liste. Nun kannst du einfach zu jedem WayPoint den nächsten ermitteln und entweder mit diesem direkt oder dem nächsten in der Liste fortfahren. Zum Hinzufügen wäre es ratsam, sich den letzten WayPoint zu merken. WayPoints.Last() geht aber natürlich auch.
Ein Problem mit LinkedLists ist aber, dass es immer schwieriger wird, an Elemente heranzukommen, wenn diese weiter hinten sind. Speziell die Index-Variante (1) verwendet oft die immer ineffizienter werdende Funktion ValueAtIndex (mit steigendem Index), wobei man bei 2. auch mit dem Last aufpassen sollte.
Eine hierarchische Struktur hat auch Ihre Tücken, wenn das mit den 1000 kein Witz war, solltest du aber auf Geschwindigkeit achten.

ZEVS
 

Lion

BeitragDi, Dez 20, 2011 2:51
Antworten mit Zitat
Benutzer-Profile anzeigen
LucySalz hat Folgendes geschrieben:
Compile Error: Identifier 'saurier' not found
(Bei dem SaurierList und so ^^) wenn ich superstrict und strict raus lasse, geht es.


Ich sag dir, woran es liegt.
Da fehlt was Wink
Code: [AUSKLAPPEN]

For local saurier:Tmonster = EachIn SaurierListe
   Print saurier.derp
Next

Muss das heißen. Da fehlt das local Smile

So sollte es gehen
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

BeitragDi, Dez 20, 2011 19:16
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzMax: [AUSKLAPPEN]
SuperStrict
Type TMonster
Field derp:Int
EndType

Local SaurierListe:TList = New TList

Local i:Int

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

'Ausgabe
For Local saurier = EachIn SaurierListe
Print saurier.derp
Next


hab jetzt in der letzten for schleife ein local reingeschoben.... nun kommt:
Compile Error: Missing type specifier

wasn das nu????

Achso noch eins: Razz Razz Razz Razz Frohe Weihnachten Laughing Laughing Laughing Laughing Laughing
Lars Kammer

Xeres

Moderator

BeitragDi, Dez 20, 2011 19:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Missing type specifier

Genau das ist das Problem...
Code: [AUSKLAPPEN]
For Local saurier:TMonster = EachIn SaurierListe

Ohne die Angabe TMonster kann der Compiler nicht wissen, was in der Variable stecken soll...

Und bitte: Smilies sind keine Herdentiere.
Happy Chanukka. Wink
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)

klin

BeitragDi, Dez 20, 2011 19:30
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzMax: [AUSKLAPPEN]
SuperStrict
Type TMonster
Field derp:Int
EndType

Local SaurierListe:TList = New TList

Local i:Int

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

'Ausgabe
For Local saurier:TMonster = EachIn SaurierListe
Print saurier.derp
Next


Das bedeutet, dass eine Variabel, die du erstellen möchtest, keine Definition hat. Somit weiß BlitzMax garnicht, was für eine Art diese Variabel sein soll (Type).
Und da du den Type "TMonster" erstellt hat un offenbar eine Liste mit TMonstern durchgehen möchtest, gehe ich davon aus, dass dieses "Local saurier" = ein TMonster sein sollte.

Klin

Ebenfalls.

EDIT: Arghs Oo Schon wieder zu spät...
 

LucySalz

BeitragDi, Dez 20, 2011 19:38
Antworten mit Zitat
Benutzer-Profile anzeigen
so ok hat geklappt, mein verständnis wächst von zeit zu zeit ^^

was ist, wenn ich jetzt schreibe:

If Mousehit(Mouse_left)
Local saurier:TMonster = New TMonster
endif

wie bekomm ich das hin, dass ich zb:

saurier(1) oder saurier(3) .... angesprochen bekomme?

zb möchte ich wissen ob saurier(9) < 9 ist.

Bitte so einfach wie möglich erklären, ich bin echt in types der absolute anfänger ^^
Lars Kammer

Propellator

BeitragDi, Dez 20, 2011 19:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Verstehe ich es richtig, wenn du damit sagen willst, dass du höchstens 9 Saurier haben willst?
Oder wie muss ich es verstehen?

Mit der EachIn-Schleife kannst du innerhalb dieser Schleife jede einzelne Instanz, welcher in die Liste eingetragen wurde, ansprechen. (Deshalb das "Print saurier.derp" als Veranschaulichung)

MfG
Propellator - Alles andere ist irrelephant.
Elefanten sind die Könige der Antarktis.

Xeres

Moderator

BeitragDi, Dez 20, 2011 19:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Arrays werden in BlitzMax mit eckigen Klammern geschrieben.
BlitzMax: [AUSKLAPPEN]
Local saurier:TMonster[10] '* Platz für 10 Monster (von 0 bis 9)

Wenn kein Monster drin ist, zeigt der Eintrag auf NULL...
BlitzMax: [AUSKLAPPEN]
If saurier[0] = Null Then

...und du kannst dort ein neues Objekt rein packen...
BlitzMax: [AUSKLAPPEN]
saurier[0] = New TMonster

...und die Felder setzen...
BlitzMax: [AUSKLAPPEN]
saurier[0].Leben = 100

...vorausgesetzt, das Field wurde in TMonster als Int definiert.

Eine Create-Funktion innerhalb von TMonster wäre zu empfehlen, um die nötigen Fields mit den richtigen Start-Werten zu befüllen.
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)

Gehe zu Seite 1, 2, 3  Weiter

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group