Von B3D zu BMax

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

 

Seven

Betreff: Von B3D zu BMax

BeitragDi, Jan 17, 2012 20:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Da ich nach Ablauf der BMax Demo vermutlich auch hier hin wechseln werde,
lese ich momentan intensiv Tutorials durch und dabei sind mir einige Fragen
gekommen.

1) Es heißt man kann innerhalb von Types Funktionen, bzw. hier bezeichnet als Methoden,
verwenden. Bei den Beispielen sah ich keinen direkten Grund für die Verwendung.
Was kann z.B. in Methoden stehen, dass auch tatsächlich essenziell ist?

2) Was ist der Unterschied zwischen TList und Type?

3) BlitzMax kann sowohl DX, als auch OpenGL verwenden und ich sah einige Threat's,
die speziell die OpenGL Programmierung ansprachen. Wieso muss man sich darum
Gedanken machen, wenn BMax doch für Linux und Mac mit compilieren kann?

4) Wozu genau macht man sich die Mühe z.B. Text in DrawText umzubenennen,
wenn sie doch scheinbar die selbe Funktion haben? o.O

5) Ich vermisse den Befehl CountGfxModes in BMax. Wurde er umbenannt,
oder muss man hier etwas anderes machen?

6) Gibt es in BMax irgendwelche Bugs, die zum Absturz oder zur inkompatibilität führen,
wie bei BB der ImagesCollide Befehl?

7) Gibt es irgendwelche Funktionen, die für komplett neue Möglichkeiten sorgen,
wenn man mal von OOP und Multi Plattform absieht?

Das wars auch schon.
Ich such dann mal erst einmal weiter nach Tutorials:)

ZEVS

BeitragDi, Jan 17, 2012 21:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:

1) Es heißt man kann innerhalb von Types Funktionen, bzw. hier bezeichnet als Methoden,
verwenden. Bei den Beispielen sah ich keinen direkten Grund für die Verwendung.
Was kann z.B. in Methoden stehen, dass auch tatsächlich essenziell ist?

OOP ist immer ein bisschen umstritten. Methoden kann man aber gut mit Vererbung benutzen.
Zitat:
2) Was ist der Unterschied zwischen TList und Type?

In BMax kannst du nicht sämtliche Objekte eines Types durchgehen - deshalb verwaltet man normalerweise in einem seperaten Objekt eine Liste aller Objekte.
Zitat:
3) BlitzMax kann sowohl DX, als auch OpenGL verwenden und ich sah einige Threat's,
die speziell die OpenGL Programmierung ansprachen. Wieso muss man sich darum
Gedanken machen, wenn BMax doch für Linux und Mac mit compilieren kann?

BMax hat zwei Methoden der OpenGL-Programmierung: Einmal mit Max2D (also wie DX) und einmal direkt.
Zitat:
4) Wozu genau macht man sich die Mühe z.B. Text in DrawText umzubenennen,
wenn sie doch scheinbar die selbe Funktion haben? o.O

Ansichtssache. Ich finde es praktisch, meine Variablen "text" nennen zu können, ohne dass diese verwirrend gehighlightet werden.
Zitat:
5) Ich vermisse den Befehl CountGfxModes in BMax. Wurde er umbenannt,
oder muss man hier etwas anderes machen?

-> CountGraphicsModes
Zitat:
6) Gibt es in BMax irgendwelche Bugs, die zum Absturz oder zur inkompatibilität führen,
wie bei BB der ImagesCollide Befehl?

Nicht, dass ich wüsste.
Zitat:
7) Gibt es irgendwelche Funktionen, die für komplett neue Möglichkeiten sorgen,
wenn man mal von OOP und Multi Plattform absieht?

Threading, Exceptions, Funktionspointer etc. Sieh selbst.

Willkommen bei BMax!

ZEVS

BladeRunner

Moderator

BeitragDi, Jan 17, 2012 21:21
Antworten mit Zitat
Benutzer-Profile anzeigen
1. Du kannst innerhalb von Types sowohl Funktionen als auch Methoden verwenden.
Der Unterschied zwischen den beiden ist dass eine Funktion global gilt, wärend eine Methode an eine Instanz, d.h. ein bestimmtes Type-Objewkt gebunden ist.
Ein Beispiel:
Code: [AUSKLAPPEN]
Type a
    field name:string
    function b
       print "hallo"
    endfunction

    method greet()
        print "hello "+name
    end method
end type

local test:a = new a
test.name = "world"
a.b()
'a.greet() würde einen fehler machen, da b eine Methode ist und ein objekt braucht, nicht die "schablone"
test.b() ' geht, denn auch Instanzen haben zugriff auf die Funktionen.
test.greet() 'geet, denn es ist ja eine Instanz.


2. Eine TList ist eine verkettete Liste, die Objekte verwalten kann. Im Gegensatz zu B3D verwaltet BMax die Objekte nicht automatisch, sondern Du musst dafür sorgen. Die TList ist eine der Möglichkeiten dafür.

3. Muss man nicht, wenn man nicht gezielt Teile selbst beeinflussen will. Der Anfänger kommt so klar.

4. Das musst Du Mark Sibly fragen. Vielleicht wollte er die Namensgebung vereinheitlichen.

5. CountGraphicsmodes() - Du kannst dir die Doku zu allen Modulen mal durchstöbern. Da gibt es viel zu entdecken. Ich empfehle HotDocs, das verbessert die Übersicht enorm. Findest Du hier im Forum per Suche als Code.

6. Unter Windows ist BMax sehr stabil, wenn auch nicht perfekt. Linux ist eher lala, Mac OS macht wohl aktuell mit Lion ein paar Probleme. Insgesamt ist BMax aber deutlich zukunftstauglicher, schon allein wegen der offenen Modulstruktur.

7. Wenn Du die Möglichkeiten dieser beiden Neuerungen ausgelotet hast darfst Du gern mal nach mehr fragen Wink
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

Blitzcraft

BeitragDi, Jan 17, 2012 21:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
In BMax kannst du nicht sämtliche Objekte eines Types durchgehen - deshalb verwaltet man normalerweise in einem seperaten Objekt eine Liste aller Objekte.

Zitat:
Eine TList ist eine verkettete Liste, die Objekte verwalten kann. Im Gegensatz zu B3D verwaltet BMax die Objekte nicht automatisch, sondern Du musst dafür sorgen. Die TList ist eine der Möglichkeiten dafür.

Dazu möchte ich auch noch erwähnen dass in BMax alle Variablen,Funktionen,... Objekte sind, die auch bestimmte Methoden(Mehtods) haben mit denen man diese verändern kann.
Beispiel:
Code: [AUSKLAPPEN]
Local text:String = "57"

Local zahl:Int = text.toint()

Wie man sieht ist .toint() so eine kleine Methode um Text in Zahl zu verwandeln.
Wie man auch bei den Variablen sieht ist immer ein :Int oder :String oder was auch immer angehängt, was genau dasselbe ist wie wenn du einen Type erstellst:
Code: [AUSKLAPPEN]
Type Spieler
   Field x,y
End Type

Local var:Spieler

Du kannst also auch jede Variable,... als Type(Objekt) sehen.
Und was macht man um viele Variablen in eins zu bekommen?
Arrow eine Liste erstellen(TList), wo alle Werte abgespeichert sind

Wie du siehst sind Variablen also nichts anderes als Types und was es sonst noch so gibt in BMax

Info: Eine Liste ist auch ein Objekt (Local liste:TList)

Exclamation Korrigiert mich wenn ich falsch liege
Screenshot aus meinem ersten Projekt

skey-z

BeitragDi, Jan 17, 2012 21:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Zu der verwendung von Types in BMax kann ich dir das Tutorial von Jolinah empfehlen, da ist das mit den Methoden, Funktion, Vererbungen etc. gut beschrieben.

Mal ein Beispiel

Um alle Instanzen eines Types zu Zeichnen

Code: [AUSKLAPPEN]
TDeinType.Update()


wird als Funktion aufgerufen und kann zum Beispiel so aussehen

Code: [AUSKLAPPEN]

Type TDeinType
   global typeliste:TList = Createlist()
   field typelink:TLink

   field x:int
   
   'typelink in typelist automatisch eintragen
   Method New()
      typelink = typelist.AddLast(self)
   EndMethod
...

function Create:TDeinType()
    dein:TDeinType = new TDeinType 'die Methode New() wird automatisch aufgerufen
      dein.x = 1
end function

Function Update:TDeinType() 'oder auch :int, :float, :string etc, wenn du etwas zurückgeben möchtest
   for local dein:TDeinType = eachin TDeinType.typelist
     dein.x :+ 1
   next
End Function


Die Methode kann nur von der jeweiligen Instanz aufgerufen werden, wohingegen die Funktion für den Type ansich gilt.

Natürlich kannst du auch weiterhin mit normalen Funktionen arbeiten, aber ich persönlich finde es zum einen übersichtlicher und du kannst auch noch weitere schöne dinge damit machen, wenn du zB mit Abstract und Extends arbeitest.

Am Anfang war es für mich auch sehr verwirrend, aber mit der Zeit lernt man gut damit um zu gehen und möchte es auch nicht mehr missen.
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz
BAC#57: 2. Platz
Twitter
 

Seven

BeitragMi, Jan 18, 2012 20:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Sind schon mal nette Aussichten
Danke:)

Wie steht es den mit Antialiasing in BMax?
Ich bin kein Freund der Treppchen
und würde Antialiasing lieber benutzen,
als Unschärfeeffekte.

Dann noch was zu MaxGui. Werden hier nur Standart Windows Themes
benutzt, oder hat man auch die Möglichkeit eigene zu nutzen?

Farbfinsternis

BeitragMi, Jan 18, 2012 20:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Antialiasing hat nichts mit BMax zu tun, wenn Dein Treiber AA erzwingt wird es in Max2D Apps auch verwendet.

MaxGUI basiert auf den GUI Systemen der Targets (OSX, Windows, Linux). Das heißt: Unter Linux sieht es aus wie Dreck weil es auf FLTK basiert, auf Windows sieht es aus wie Windows98 weil es garkeine Themes verwendet solange Du keine App Manifest hinzufügst und unter MacOS sieht es halt aus wie MacOS weil es auf Cocoa basiert.
Farbfinsternis.tv

Nicdel

BeitragMi, Jan 18, 2012 20:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Na ja, unter Win 7 sieht MaxGUI nicht wie Win98 aus.
https://www.blitzforum.de/showcase/438/
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7

blackgecko

BeitragMi, Jan 18, 2012 21:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Aber nur wenn man wie gesagt ein Manifest hinzufügt.
Die früheren Versionen von MaxGUI haben das automatisch gemacht, in der aktuellen muss man maxgui.xpmanifest einbinden.
So long and thanks for all the fish.
Fedora 17 | Windows 7 || BlitzPlus | BlitzMax
Rechtschreibflame GO!!! Deppenapostroph | SeidSeit | Deppenakzent | DassDas | Deppenleerzeichen | TodTot | enzigste.info - Ja, ich sammel die.

Midimaster

BeitragDo, Jan 19, 2012 11:31
Antworten mit Zitat
Benutzer-Profile anzeigen
@Farbfinsternis und blackgecko

das höre ich zum ersten Mal. Könnt Ihr das näheres drüber erzählen? Manifest einbinden? Leider gibt es keinen einzigen weiteren Beitrag hier im Forum zu dieser Stichwort.

Bei mir sehem meine eigenen BMax/MaxGui-Programme unter Win7 wie jedes andere Win-7 Programm aus. Wovon sprecht ihr hier genau? Themes? Bitte mehr Input! Das hört sich interessant an.
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe
  • Zuletzt bearbeitet von Midimaster am Do, Jan 19, 2012 22:19, insgesamt einmal bearbeitet

ZEVS

BeitragDo, Jan 19, 2012 16:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Schau dir doch mal die Source von MaxGUI.xpmanifest an! Dort wird nur eine Datei eingebungen (xpmanifest.o; gleicher Ordner), die, wie es aussieht, ein XML-Dokument ist. Bei der Suche nach "Manifest" solltest du alle Optionen finden...

ZEVS
 

Seven

BeitragDo, Jan 19, 2012 17:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Kann man es den durch BMax erzwingen lassen?

Immerhin kommt es in vielen Spielen vor.

Xeres

Moderator

BeitragDo, Jan 19, 2012 18:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Seven, vielleicht solltest du etwas genauer werden, was du mit "Antialiasing benutzen" meinst.
Ich kenne keinen Befehl, der AA für ein Bild oder den ganzen Bildschirm einschaltet - aber wenn du z.B. direkt mit OpenGL arbeitest oder Shader benutzen willst, kannst du auch das machen. Erfordert u.U. etwas mehr Arbeit.
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)

Propellator

BeitragDo, Jan 19, 2012 18:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi, mit OpenGL ist das ganze gar nicht so eine Arbeit, dank pub.glew kann man prinzipiell einfach die OpenGL Dokumentation lesen und danach vorgehen.

Das ganze würde in etwa so aussehen:
BlitzMax: [AUSKLAPPEN]

SuperStrict
Import pub.glew

SetGraphicsDriver(GLMax2DDriver())
Graphics 800,600
SetBlend(Alphablend) ' Wichtig!

glewinit()

Local EnableAA:Int
While Not KeyHit(KEY_ESCAPE)
If KeyHit(KEY_SPACE) Then EnableAA = Not EnableAA
AntiAliase(EnableAA)
DrawPoly([300.0, 300.0, 400.0, 300.0, 350.0, 400.0])
DrawText "AA Enabled = " + EnableAA, 0, 0
Flip 1
Cls
Wend
End

Function AntiAliase(enable:Int)
If enable = True Then
glClear (GL_COLOR_BUFFER_BIT);
glEnable (GL_BLEND);
glEnable (GL_POLYGON_SMOOTH);
glDisable (GL_DEPTH_TEST);
Else
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDisable (GL_BLEND);
glDisable (GL_POLYGON_SMOOTH);
glEnable (GL_DEPTH_TEST);
EndIf
EndFunction


Siehe dazu auch diesen Link.

Anmerkung: Eventuell muss man es nicht jeden Schleifendurchlauf ausführen. Je nach dem muss man mit den einzelnen Flags spielen. Wenn man aber etwas mit AA behandeln will, und etwas anderes nicht, kommts sowieso aufs selbe hinaus.
Propellator - Alles andere ist irrelephant.
Elefanten sind die Könige der Antarktis.
 

Macintosh

BeitragDo, Jan 19, 2012 23:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Dazu möchte ich auch noch erwähnen dass in BMax alle Variablen,Funktionen,... Objekte sind, die auch bestimmte Methoden(Mehtods) haben mit denen man diese verändern kann.

Absoluter unsinn!
Funktionen sind _keine_ Objekte.
Und einfache Datentypen wie int, float, short, double... usw. deffinitiv auch nicht.
Strings und Arrays sind es.

Propellator

BeitragFr, Jan 20, 2012 16:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Macintosh hat Folgendes geschrieben:
Funktionen sind _keine_ Objekte.

BlitzMax: [AUSKLAPPEN]
Function Derp:Object(id,data:Object,context:Object)
Print "umad bro?"
EndFunction

Function DoTheFollowingDerp:Object(Something:Object(id,data:Object,context:Object ),context:Object=Null)
Something(id,data:Object,context:Object)
EndFunction

DoTheFollowingDerp(Derp)

...und wer schon mal über "Hello World" hinauskam, wird wissen, dass jeder Datentyp in BMax ausser die Grunddatentypen ein Objekt ist.


Nachtrag zu meinem AA Beispiel: Die verwendete Methode wird von fast keiner Grafikkarte nativ unterstützt, wie ich gestern feststellen musste. (Meine tat es, aus Zufall. Oder der Treiber, wie auch immer.)
Stattdessen sollte man einfach MSAA benutzen.
Propellator - Alles andere ist irrelephant.
Elefanten sind die Könige der Antarktis.

Jolinah

BeitragFr, Jan 20, 2012 17:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist ein Funktionszeiger und im Endeffekt nichts anderes als eine Speicheradresse (Int bzw. Byte Ptr). Aus Sicht von BMax meiner Meinung nach also kein Objekt.

Ausserdem könnte der Compiler bei SuperStrict ein Fehler ausgeben, du rufst Something mit den Parametern id, data und context auf, hast aber innerhalb der Funktion nirgends eine Variable namens id oder data. Nur context ist vorhanden Wink

Propellator

BeitragFr, Jan 20, 2012 17:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Stimmt, das waren Artefakte aus der Tatsache, dass ich es aus .hooks.bmx rauskopierte.
Ein kleiner Hinweis: Obwohl sie Funktionspointer sind, haben sie trotzdem den Datentyp Object(). Das macht sie also zum Objekt. Sorry o/

Fix'd:
BlitzMax: [AUSKLAPPEN]
SuperStrict
Function Derp:Object()
Print "hi."
EndFunction

Function DoTheFollowingDerp:Object(Something:Object())
Something()
EndFunction

DoTheFollowingDerp(Derp)
Propellator - Alles andere ist irrelephant.
Elefanten sind die Könige der Antarktis.

Noobody

BeitragFr, Jan 20, 2012 17:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Achtung: Object() =/= Object!

Object() ist eine Funktion mit Rückgabewert Object - aber immer noch eine Funktion und kein Object (du kannst z.B. kein ToString() auf einem Funktionszeiger aufrufen).

Siehe im folgenden Testcode: BlitzMax: [AUSKLAPPEN]
SuperStrict
Function Derp:Object()
Print "hi."
EndFunction

Local Foo:Object = Derp 'Unable to convert from Object() to Object
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

Jolinah

BeitragFr, Jan 20, 2012 17:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Edit: Sorry, hab den Post von Noobody nicht gesehen.

Da du dir so sicher warst, wollte ich einen Test mit Reflection machen, aber der Compiler gab bereits bei:

Code: [AUSKLAPPEN]
TTypeId.ForObject(funcPtr)


den Fehler aus: Unable to convert from 'Int(Int,Int)' to 'Object' Wink

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group