Varptr und übergabe dieser

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

PhillipK

Betreff: Varptr und übergabe dieser

BeitragMo, Jun 20, 2011 7:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo zusammen Smile

Ich arbeite mich grade durch meine Lernstrecke, die ich mir auferlegt habe und versuche, ein workarround für ein anderes problem zu schreiben.

Da ich direkt auf ein 'bild' malen möchte, schreibe ich mir grade testweise DrawRect() etc für pixmaps um.
Dirty, aber immerhin funktioniert das.

Damit an sich habe ich kein problem, nur mit den verflixten pointern.

GetColor() akzeptiert meine variablen nicht, egal wie ich es schreibe.

Ich schreibe grundsätzlich im superstrict, da kam es schon ein ums andere mal zu problemen, da die ganzen Beispiele etc aus der Hilfe grundsätzlich ohne sind.

Hier meine frage also: WIE zur hölle gibt man Getcolor() nun seine gewünschten 3 parameter?

Im grunde schreibe ich es etwa so:
BlitzMax: [AUSKLAPPEN]
Local r:Byte = 0
Local g:Byte = 0
Local b:Byte = 0

GetColor(Varptr r, Varptr g, Varptr b)


Das sollte eigentlich hinhauen. Allerdings habe ich nie wirklich die handhabung von Ptr begriffen. Es hat nur immer irgendwie durch rumprobieren geklappt. Das kanns nichtmehr sein, ich möchte lernen^^

Entweder meckert Bmax über falsche deklaration, das er eine Variable möchte oder über "Variable for 'Var' parameter is not of matching type"

Was ich weiß:

Pointer sind im grunde Zeiger auf speicheradressen und können wie arrays behandelt werden.
Varptr übergibt statt dem inhalt einer Variable einen Ptr auf eben diese.

Aber was verflixt nochmal ist 'Var', was GetColor() erwartet? Für mich klingt es wie das gegenstück zu pointern.
Bzw ich gebe damit an, das ich eine Variable(speicheradresse) bekomme und keinen Wert für eine neue variable.

hilfe Smile

Gruß, Phillipk

Der Eisvogel

BeitragMo, Jun 20, 2011 8:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Var am Schluss bedeutet lediglich, das BlitzMax selbst als Parameter die Pointer der Variablen übergibt, damit diese, wenn sie in der Funktion gändert werden auch im Aufruf-Bereich geändert werden.

Das heißt schreibst das:
BlitzMax: [AUSKLAPPEN]
GetColor(r, g, b)


Den Rest macht BlitzMax.

MfG
Der Eisvogel
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

mpmxyz

BeitragMo, Jun 20, 2011 8:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Zusatz "Ptr" ist übrigens das Gegenstück zu "Varptr".
-> "Byte Ptr"/"Double Ptr Ptr" für entsprechende Speicherbereiche.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

Midimaster

BeitragMo, Jun 20, 2011 8:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielleicht ist das ja OffTopic für dich, aber es gibt eine ganz einfache Möglichkeit, mit sämtlichen Zeichenbefehlen von BlitzMax ein Bild zu bearbeiten.

Da ja der BlitzMax-Backscreen erst dann zu sehen ist, wenn das FLIP im code erscheint, kannst du jedes Bild direkt auf der Canvas von BlitzMax bearbeiten.

Ich mach dies meist beim Programmstart, habe aber auch viele Programme, wo ich das im laufenden Spielbetrieb hinbekomme.

Der Ablauf ist ja normalerweise so:

BlitzMax: [AUSKLAPPEN]
Repeat
Cls
SpielScreenAufbauen()
Flip
Until...


und wenn es was zu manipulieren gibt:

BlitzMax: [AUSKLAPPEN]
Repeat
ManipulierBild()
Cls
SpielScreenAufbauen()
Flip
Until...

Function ManipulierBild()
DrawImage Bild,0,0
...was auch immer
GrabImage Bild,0,0
End Function


Zwar dauert das Grabben etwas, aber meist überwiegen die Vorteile durch das Malen auf der Canvas

Derzeit erzeuge ich in meinem neuesten Projekt 400 Vorschaubilder (340x80pix auf diese Art und Weise. Alle 30msec wird eines gezeichnet. Dazwischen wird die Kontrolle an das Spiel zurückgegeben.

BlitzMax: [AUSKLAPPEN]
Function ManipulierBild()
If MalZeit<MilliSecs()
MalZeit=MilliSecs() +30
Bild[Nr]=CreateImage(...
...was auch immer
GrabImage Bild[Nr],0,0
EndIf
End Function


12 Sekunden nach Programmstart ist die Aktion vorbei. In der Zwischenzeit könnte der Spieler schon anfangen zu spielen, aber meist schaut man sich ja den Vorspann an, oder stellt noch an den Settings rum. So merken die User gar nichts von der Aktion.
 

PhillipK

BeitragMo, Jun 20, 2011 9:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Midimaster,

die Draw/Grab methode habe ich zur genüge ausgetestet und werde einfach nicht schlau draus, wie ich dies für mein vorhaben nutzen könnte.

Ich versuche grade, eine Landschaft in 64x64 einzelbilder zu zerlegen, nachzulesen in diesem thread von mir.

Da ich eine Landschaftsgröße anpeile, die größer wie die die Bildschirm breite/höhe ist, kann ich anscheinend keine Drawoperationen von Blitzmax verwenden.
Auch die 64x64 bildchen einzeln zeichnen und grabben will nicht so wirklich.

Daher mein umweg über die Pixmap methode, indem ich kleine teile der Draw Methoden von Bmax umschreibe auf ein TPixmap.WritePixel() system.
Zugegeben, das ist mehr wie nur dreckig, aber ich bin mit meinem Latein am ende Sad

Zu den Pointern:

Ich fass es nicht. Ich. Fass. Es. Nicht.
Etwa eine halbe stunde habe ich mich an diesen dämlichen Pointern versucht, und ich muss einfach garnichts Deklarieren?
Das sollte eventuell in den docs vermerkt werden :/ Oder eine entsprechende Superstrict variante eingefügt werden, das hätte mir schon so manchen ärger erspart V.V

mpmxyz

BeitragMo, Jun 20, 2011 9:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Variablenreferenzen sind etwas leicht anderes im Vergleich zu Pointern.
Bei denen geht gerade darum, dass man extern liegende Variablen in einer Funktion ändern kann, ohne explizit Pointer zu erstellen. (ohne Var: eingehender Wert, mit Var: ein- und ausgehender Wert)
In der Dokumentation fehlt in der Tat viel. ("%"=":Int" ist bekannt, aber von "@"=":Byte" bzw. "@@"=":Short" steht dort nichts.)
Trotzdem muss man dann nicht gleich ein Feature, das einem die Arbeit erleichert, entfernen. Wink
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer
 

PhillipK

BeitragMo, Jun 20, 2011 9:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Von entfernen habe ich nichts gesagt Very Happy

Ich habe lediglich anmerken wollen, das ich aufgrund der Hilfe nicht zu einer Lösung kam, da dort alles ohne strict und Superstrict geschrieben ist.
Mir fehlen dort vierlei anhaltspunkte, was jetzt eigentlich für ein Datentyp vorliegt ^^

Nagut, das nächste mal werde ich wohl noch etwas banaler rumtesten. zugegeben, ich programmiere nun von anfang an in Superstrict, das finde ich einfach sauberer.
Darum wäre ich nie auf die Idee gekommen, eine funktion mit nichtexistenten variablen aufzurufen Sad

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group