Einen fixierten Type-Eintrag auslesen
Übersicht

![]() |
hecticSieger des IS Talentwettbewerb 2006Betreff: Einen fixierten Type-Eintrag auslesen |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wie kann ich bei BlitzMax auf EINEN BESTIMMTEN Type-Eintrag zugreifen? Bei Blitz3D hatte man dafür das Object/Handle zur Verfügung. Bei BlitzMax gibt es das anscheinend nicht mehr. Oder gibt es dafür eine bessere Alternative?
BlitzMax: [AUSKLAPPEN] Type TNeu Alternativ, falls es nicht gehen sollte, wie kann man in eine Bank einen Wert für TPixmap der von ConvertPixmap(LoadPixmap("image.png"),PF_RGBA8888) zurück gegeben wird speichern? Als Integer geht es schon mal nicht. Danke im Voraus. |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Gewöhne dich dran, Objekte als solche zu verwenden - und Funktionen und Metoden für die Types zu benutzen ![]() Ich würde das wohl so schreiben: BlitzMax: [AUSKLAPPEN] SuperStrict |
||
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich will das ganze Syntax-Zeug da weg haben. Höchstens mit einem alá :TImage bin ich einverstanden.
Angenommen, ich schreibe eine Grafikbibliothek die sich Draw3D2Max nennt, und will nun ein Bild laden das ''auto.png'' heisst. Statt zu schreiben Code: [AUSKLAPPEN] Local Auto:TImage=LoadImage3D("auto.png",2,2)
kommt stattdessen Code: [AUSKLAPPEN] Local Auto:TDraw3D2Max=TDraw3D2Max.LoadImage3D("auto.png",2,2)
Lässt sich das bewerkstelligen indem man die Funktionen wieder auslagert? Die ersten Versuche haben nicht geklappt. |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das Bild lädst du in ein Timage oder TPixmap, und dieses wiederrum in ein TDraw3D2Max Objekt. Oder du erweiterst Timage; was dir sinniger erscheint bzw. je nach dem viel OOP du benutzen möchtest.
BlitzMax: [AUSKLAPPEN] SuperStrict |
||
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Thunder |
![]() Antworten mit Zitat ![]() |
---|---|---|
Zur 1. Frage: Soweit ich weiß erzeugt BlitzBasic für einen Type gleich eine LinkedList. Das musst du in BlitzMax von Hand machen:
BlitzMax: [AUSKLAPPEN] SuperStrict Das ist die einzige Methode die mir dazu einfällt. mfg Thunder |
||
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nagut, eigentlich wollte ich nur den Aufruf etwas verkürzen. OOP ist zwar eine tolle Sache, aber meiner Meinung muss man es nicht überall anwenden wo es überhaupt keinen Vorteil bringt. Und um Bilder in den Speicher zu laden sind Baumstrukturen nicht notwendig.
OOP kommt mir schon langsam wie eine Sekte vor, wo noch so große Nachteile einfach hingenommen werden, und noch so kleine Vorteile in den Himmel gelobt werden. ![]() Aber gut. Ich übertreib mal: Ich möchte lieber folgendes schreiben können: Code: [AUSKLAPPEN] Local I=LoadImage("jeah.png")
Statt eine ganze Geschichte wie folgende schreiben zu müssen: Code: [AUSKLAPPEN] Local I:TGeileOOPListenstruktur=TGeileOOPListenstruktur.LoadImage("oh-no.png")
Und jetzt mal ehrlich. OOP braucht man hier absolut nicht. Selbst die Samples von BlitzMax haben einfachen Aufruf für Bilder (und keiner beschwert sich dabei). Nämlich ein alleiniges: Code: [AUSKLAPPEN] Local I:TImage=LoadImage("noch-ok.png")
Damit könnte ich mich noch anfreunden. Aber es muss doch nicht alles doppelt und dreifach sein. Und nochmal... Um Bilder zu laden braucht man keine Baumstrukturen. Ich bin also auf der Suche: Banken, Types oder irgend einen anderen Mehrfach-Wertespeicher zu suchen, der mir so einen einfachen Aufruf ermöglicht. Eine Bank wäre sogar ideal, nur hab ich noch keinen Weg gefunden, ein Objekt mit dem Rückgabewert von ConvertPixmap(LoadPixmap("bild.png"),PF_RGBA8888) zu speichern. Aber anscheinend wird das alles wohl nicht möglich sein. ![]() Dennoch haben mir Eure Beispiele andere Anwendungsmöglichkeiten eröffnet. Ich bin immer noch interessiert auf weitere Lösungsvorschläge. |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
n-Halbleiter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ConvertPixmap gibt eine TPixmap zurück, wo liegt also das Problem?^^ | ||
mfg, Calvin
Maschine: Intel Core2 Duo E6750, 4GB DDR2-Ram, ATI Radeon HD4850, Win 7 x64 und Ubuntu 12.04 64-Bit Ploing! Blog "Die Seele einer jeden Ordnung ist ein großer Papierkorb." - Kurt Tucholsky (09.01.1890 - 21.12.1935) |
![]() |
Thunder |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich habe hier einen kleinen Code geschrieben der einen Speicherblock reserviert. Darin die Pixeldaten speichert und sie als Pixmap lädt:
BlitzMax: [AUSKLAPPEN] SuperStrict Das ganze geht auch mit Banks, aber das ist etwas komplizierter. Code: [AUSKLAPPEN] BlitzMax ANSI-C-LIB MemAlloc ... malloc MemFree ... free MemExtend ... realloc ... Zeiger dereferenziert man in BlitzMax wie Arrays. mfg Thunder |
||
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Bis auf die Länge deiner beiden Beispielzeilen, sehe ich ehrlich gesagt kaum einen Unterschied, hectic. Das "I" ohne Angabe des Typs funktioniert sowieso nur im non-Strict Modus. Und so sollte man wirklich nicht arbeiten - es ist langsamer und fehleranfälliger. Bei der Funktion als teil des Types ist alles hübsch gekapselt...
Ich weiß auch nicht, was du hier für eine Baumstruktur siehst?! Wenn du - wie auch immer - Handle verwenden willst, dann mittels HandleFromObject, HandleToObject, Release. BlitzMax: [AUSKLAPPEN] SuperStrict |
||
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
das wurgel |
![]() Antworten mit Zitat ![]() |
---|---|---|
hectic hat Folgendes geschrieben: Statt zu schreiben
Code: [AUSKLAPPEN] Local Auto:TImage=LoadImage3D("auto.png",2,2)
kommt stattdessen Code: [AUSKLAPPEN] Local Auto:TDraw3D2Max=TDraw3D2Max.LoadImage3D("auto.png",2,2) Mach einfach in die Hauptdatei deiner Lib ne Funktion die so aussieht: Code: [AUSKLAPPEN] Function LoadImage3D(url:Object, a, b)
Return TDraw3D2Max.LoadImage3D(url,a,b) End Function So macht es BRL auch. |
||
1 ist ungefähr 3 |
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du musst hier ein wenig aufpassen, dass du nicht in gewissen Programmierstrukturen erstarrst, nur weil du dir sie dir gewohnt bist. OOP ist keine 'Sekte' - sieh es als führende Wissenschaft, während Prozedurales Programmieren okkulten Druidenritualen gleicht, bei denen man in dunklen Kellern giftige Hexensüppchen kocht ![]() Ich lehnte früher Javas Klassensystem vehement ab, bis ich mal gezwungen war, es ernsthaft zu benutzen. Wenn sogar ich die Vorteile an Java erkennen kann, würde ich auch BMax mal eine Chance geben. OOP wirst du nicht mehr missen mögen. In deinem Fall scheinst du wohl noch sehr den Handles nachzuhängen. Es ist zwar wahr, dass man ein LoadImage so furchtbar kurz hinbekommt, aber andererseits sind Handles auch sehr gefährlich - ich kann damit rumrechnen, wie ich lustig bin, da es nur ein Int ist. Auch kann ich nie wissen, ob das Objekt, zu dem das Handle ursprünglich gehörte, noch da ist oder nicht - ich verwende einfach frischfröhlich irgendeine Zahl und hoffe, dass nirgends unerwartet das zugehörige Objekt gelöscht wird. Da ist eine echte Referenz natürlich viel toller. Entweder, die Referenz ist Null und zeigt auf gar nichts, oder sie ist nicht Null und zeigt dann auf ein garantiert existierendes Objekt - Ende mit russischem Roulette. Ja, ich muss ein :TImage hinten an die Variablendeklaration anhängen, aber das sollte nun keinen User von der Verwendung der Lib abhalten. In SuperStrict (der Modus, der von jedem nicht masochistischem Entwickler verwendet wird) müsstest du für ein Handle sowieso noch ein :Int hinschreiben, da ist es nicht mehr weit bis :TImage. Ob man nun die Ladefunktion in den Type steckt oder nicht, scheint Geschmackssache zu sein. BMax selbst bietet zwar eigenständige Funktionen an, jedoch liegt das schlicht daran, dass BMax sowieso noch auf Rückwärtskompatibilität zu BB getrimmt ist. In den Funktionen selbst wird aber einfach die Funktion im Type aufgerufen, scheint also eine rein kosmetische Angelegenheit zu sein. Die OOP-igere Variante wäre auf jeden Fall, die Ladefunktion in den Type selbst zu stecken. Der Hintergrundgedanke dabei ist, dass eine Klasse gekapselt sein muss. Im Idealfall kopiert man eine Klasse aus ihrer Originaldatei in ein anderes Projekt hinein und kann sie gleich verwenden, ohne dass man noch alle fünfhundert Funktionen zusammensuchen muss, die irgendwas mit der Klasse zu tun haben. Wenn man eine Lib einbindet, erwartet man eine Handvoll Klassen, die jede ihre eigenen Funktionen mitbringen, die genau auf sie zugeschnitten sind. Alle Funktionen, die für die Verwendung eines Types nötig sind, stecken in besagtem Type drin. Man muss nicht mehr wild in der Dokumentation oder gar im Source wühlen, um herauszufinden, zu welchen Types nun diese verflixte Funktion gehört und was für Handles man da genau angeben muss, sondern es ist immer klar, dass eine Methode auf dem Type ausgeführt wird, zu dem sie gehört. Wenn dir nun ein TImage3D.LoadImage3D zu lange ist, dann überleg mal, was an dem Aufruf zu viel ist. Du weisst ja schon, dass du es mit einem TImage3D zu tun hast - wofür also nochmal im Funktionsnamen verwenden? BlitzMax: [AUSKLAPPEN] Local I:TImage3D=TImage3D.Load("i'm-okay-with-this.png") Ich denke, dass man genau dieselbe Diskussion früher bei Types vs. Arrays oder gar Funktionen vs. GoTos hatte - trotzdem würde heute niemand mehr ernsthaft die letzteren Alternativen verwenden ![]() |
||
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich will jetzt keine VS.-Diskussion lostreten. Mir fällt nur auf, dass egal was für Argumente man findet, von den OOP-Jüngern ausgelacht wird. Egal ob berechtigt oder nicht.
Wenn man beim prozeduralem programmieren einen Fehler verursacht der mit OOP nicht passiert wäre und deswegen 10min länger braucht um das zu debuggen, wird man schnell ausgelacht. Dabei ist es egal ob man mit OOP für das gleiche Problem insgesamt 60min länger am coden ist, nur um sich die ganzen Unterklassen im Internet oder anderen Quellen zusammen zu suchen. Hier stehen +10min vs. +60min, dennoch wird der der schneller voran kommt ausgelacht. Und genau das ist einfach nur dumm. Genau wie der Typ, der eine 2D-Map mit Types realisiert hat. Hauptsache es geht. Noobody hat Folgendes geschrieben: ...dieselbe Diskussion früher bei Types vs. Arrays...
Man muss einfach einsehen, dass Types als auch Array jeweils ihre Daseinsberechtigung haben. Genauso auch Gosub (lassen wir mal Goto bitte weg, sonst können wir gleich noch mit Lochkarten anfangen). Der ganze OOP-Wahn geht bereits so weit, statt einfach eine Variable die für die Positionssteuerung einer Spielfigur (KEIN Multiplayer) dient, nicht als Global deklariert wird, sondern einzig für XPos und YPos mal eine Typeliste erstellt wird. ![]() Ich versuche wirklich nur einen gesunden Mittelweg zu finden. Dieser die Vorteile von prozeduralem als auch die des OOP zusammen führt. Ich will mich nicht auf OOP aufgeilen, sondern deren Vorteile nutzen wenn welche da sind. Aber genug geredet, hier meine bisherige Arbeiten: - - - Mein aktueller Stand (damit daddel ich grad noch rum, funktioniert schon und zeigt Quads an): BlitzMax: [AUSKLAPPEN] SuperStrict - Bei mir waren selbst berechnete Sin/Cos-Werte für die Bilddrehung schneller, als glRotatef(). Nur falls einer wieder kommt. ![]() - Mir gefällt das letzte Beispiel von das wurgel sehr gut und werde versuchen diese Funktionen als Zusatz nachzuliefern. Dann kann jeder selbst entscheiden, ob er den Zusatz mit einbindet, oder lieber darauf verzichtet. |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das Sin/Cos kannst du noch einen Tick schneller machen, wenn du die Werte im Vorhinein berechnest:
BlitzMax: [AUSKLAPPEN] Global Cos_:Float[360], Sin_:Float[360] |
||
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Zitat: Der ganze OOP-Wahn geht bereits so weit, statt einfach eine Variable die für die Positionssteuerung einer Spielfigur (KEIN Multiplayer) dient, nicht als Global deklariert wird, sondern einzig für XPos und YPos mal eine Typeliste erstellt wird.
Ich würde in der Tat einen Type dafür anlegen, um es sauberer zu kapseln, eine Liste hingegen nicht. Types und Listen sind ja nicht miteinander verbunden. Der Mehraufwand beträgt dabei das tippen des jeweiligen scopes (Player.posx statt posx), der Nutzen ist dass ich jederzeit weiß welche x-Position denn gemeint ist. Alle Daten die eine einzelne Struktur meines Spieles betreffen sind an einer Stelle gebündelt, und das finde ich ungemein praktisch. |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich habe dir mal das ganze so umgeschrieben, wie es aussehen könnte. Das umfasst zum einen Vorschläge, wie man es in OOP-Manier umsetzen könnte, als auch Verbesserungen am OpenGL-Part. Der Code ist hoffentlich genügend kommentiert. BlitzMax: [AUSKLAPPEN] SuperStrict Zur ganzen OOP-Diskussion möchte ich eigentlich nichts mehr anfügen. Du hast klar gemacht, dass du relativ wenig davon hältst und dich auch nicht weiter darauf einlassen willst. Das ist zwar schade, aber deine Entscheidung ![]() |
||
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ne, vergiss das mal mit der Diskussion. ![]() Vielen Dank für den lehrreichen Code. Wird mir die nächsten Tage sicherlich viel Spielerei ermöglichen. Hoffentlich ist nun die BMax-Variante schneller, als die bisherige Blitz3D/Draw3D2 nachdem die Mipmaps-Funktionen erstmal weg fallen. |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
So, hab mich schon bei einigen Dingen durchgeschlagen.
Graphics3D LoadImage3D DrawImage3D DrawLine3D DrawQuad3D DrawRect3D sind soweit aus der Blitz3D Draw3D2 funktionstüchtig portiert. Ich hänge nun bei folgendem Code: BlitzMax: [AUSKLAPPEN] Local L1:TDraw3D=TDraw3D.LoadImage3D("__.png") Ich möchte nun ein geladenes Bild dessen UV/Werte neu setzen und in ein eigenem Handle abspeichern. Das Referenzbild soll dabei das selbe bleiben. Local L1:TDraw3D=TDraw3D.LoadImage3D("__.png") Local G1:TDraw3D=TDraw3D.GrabImage3D(L1,16,16,32,32) Aber irgendwie bekomme ich das Handle L1 nicht in GrabImage3D so rein, das ich damit weiter arbeiten kann. Also auf die Typeeinträge aus L1 in G1 übertragen kann. Edit1: Und eines wäre sehr hilfreich, wenn man Texturen skalieren könnte. Also das Pendant zu ScaleTexture ![]() |
||
![]() |
mpmxyz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du möchtest eine Pixmap skalieren?
Dann solltest du ResizePixmap nehmen. Ist dein vorheriges Problem jetzt geklärt oder sehe ich das Problem nicht? Edit: Mit "FDrawHD.TDrawPM" greift man z.B. auf auf die Pixmap des Originalobjektes zu. (Warum haben alle deine Objektvariablen ein T am Anfang und sind so aufgebläht?) mfG mpmxyz PS: GrabImage3D wäre etwas angenehmer zu nutzen, wenn es eine Methode ist. ("TDraw3D" und ein Komma verschwinden.) |
||
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich will aber nicht ein bestehendes geladenes Bild zuschneiden, sondern einen eigenen Handle zu einem bestehendem Bild hinzu haben.
A=LoadImage3D( "Bild.png" ) B=GrabImage3D( A, 10, 10, 30, 30) ... A.DrawImage3D( X1, Y1 ) B.DrawImage3D( X2, Y2 ) Aufgebläht sind die Variablennamen, weil ich zu jeder Art einen Bezeichner vergebe. Dann Draw, damit es zu keinen Kollisionen kommt. Auch wenn es hier zu keinen kommen kann. Ist wohl eine alte Angewohnheit. - - - Wie ziehe ich denn nun die Werte - also das Handle und die Pixmap - zu einem neuem Handle, damit das geladene Bild unberührt bleibt, das gegrabbte Bild auf die Oberreferenz zugreift? Edit1: ResizePixmap hab ich eben ausprobiert. Es ändert die Auflösung des Bildes. Ich möchte aber ein Pendant zu ScaleTexture haben. Das ändert die UV/Skalierung. Das heißt, man hat einen einfachen Weg statt von 0,0 -> 1,1 ein Bild über UV einzugrenzen, sondern von 0,0 -> Width,Height. Das macht restliche Berechnungen einfacher. Man dann auch komplett auf Integer umsteigen und muss nicht ständig mit 1/Usereingaben rumrechnen. |
||
![]() |
mpmxyz |
![]() Antworten mit Zitat ![]() |
---|---|---|
So würde ich eine Kopiermethode schreiben:
BlitzMax: [AUSKLAPPEN] Method CopyImage:TDraw3D() Ob du nun eine Methode oder eine Funktion mit einem zusätzlichen Parameter schreibst, ist von der Funktionsweise gesehen ziemlich egal. (Self habe ich nur der Deutlichkeit halber genutzt und könnte weggelassen werden.) mfG mpmxyz |
||
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group