|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
jb
Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 13.02.2005, 20:41 Titel: Grafikprogrammierung in C++ |
|
|
Hallo Leute,
hab mich mal aufgerafft C++ zu lernen.
Aber irgendwie ist mir aufgefallen, dass in vielen Tutorials
nie von Grafik unter C++ geredet wird.
Kann mir jemand vielleicht
- die Initialisierung eines Grafikbildschirms
- die Drawing Primitives
unter C++ erklären, oder mir sagen, wo es ein entsprechendes Tutorial gibt?
Schon mal vielen Dank!!
jb |
|
Nach oben |
|
|
Dusky_Joe
Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 13.02.2005, 20:49 Titel: |
|
|
Tja C/C++ sind sprachen ohne großen funktionsumfang... deswegen läuft der code ja auch so schnell!
Sogar printf is aus ner externen lib (zumindest bei C, mit dem ich mal so gaaaaaaanz vorsichtig angefangen hab... vor ner zeit....)
deswegen denk ich mal, dass es da überhaupt keine grafikbefehle gibt...
versuchs mal mit direktem speicherzugriff:
INT 10h aufrufen, mit AX = 0013h
(geht ja dank inline-assembly)
&HA000 ist das Videosegment
Offset = x + y * 320
=> A000h:Offset => Pixel setzen.
Da SCREEN 13 noch recht lausig ist, hab ich (für QB) mal ne SVGA-Lib angefangen. Bin grademal zum PSET-gekommen.
Wenn du willst, kann ich dir den Code schicken.
Du müsstest den (Assembler-)Code aber ein bisschen umschreiben, da C die Parameter anders übergibt als QB.
... _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
|
jb
Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 13.02.2005, 20:56 Titel: Grafik in C++ |
|
|
Haha,
ich hab mal eine C++ Header-Datei gesehen, die
"Graphics.h"
hieß.
In der waren so Sachen enthalten. Aber irgendwie bin ich daraus nicht wirklich schlau geworden.
jb |
|
Nach oben |
|
|
Dusky_Joe
Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 13.02.2005, 21:04 Titel: |
|
|
Tja, wie gesagt, ich hab mich nur sehr flüchtig mit c auseinandergesetzt. funktionieren dürfte aber die mit dem direkten speicherzugriff auf jeden fall. _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
|
helium
Anmeldungsdatum: 10.09.2004 Beiträge: 397 Wohnort: Leverkusen
|
Verfasst am: 13.02.2005, 21:16 Titel: |
|
|
C++ kennt keinen Bildschirm, keine Tastatur, kein Netzwerk. Es kennt so gut wie garnichts. Das musst du alles aus externen Bibliotheken hohlen. Wenn es um Grafik gehtsolltest du vielleicht mal DirectX ( www.microsoft.com ) oder SDL ( www.libsdl.org ) ansehen. Beide bieten noch deutlich mehr Möglichkeiten, die du vermutlich auch vermissen wirst. _________________ Bevor Sie aufhören sich körperlich zu betätigen sollten Sie ihren Doktor befragen. Körperliche Inaktivität ist abnormal und gefährlich für Ihre Gesundheit. |
|
Nach oben |
|
|
jb
Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 13.02.2005, 21:26 Titel: C++ |
|
|
@ Dusky_Joe
Kannst du mir denn mal zeigen, wie das
PSETen, initialisieren des Gafikmodus mit Hilfe von Inline-Assembly funktioniert??
jb
Zuletzt bearbeitet von jb am 13.02.2005, 21:36, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
Quark48
Anmeldungsdatum: 16.10.2004 Beiträge: 559 Wohnort: Saltendorf a.d. Naab bzw. Teublitz i.d. Oberpfalz / Bayern
|
Verfasst am: 13.02.2005, 21:27 Titel: |
|
|
Hallo!
Ich habe auch mal mit C angefangen. C ist nicht so wie BAISC, in BASIC sind die ganzen Befehle schon fest einprogrammiert. Bei C und C++ braucht man Libarys (In QB: .lib-dateien) und Header (Auch in QB: .bi-Dateien).
Also nochmal zu den Grafiken:
Man muss sich die ganzen Befehle selberschreiben, oder man hat schon eine Bibliothek; Versuch´ mal ein bisschen Assembler dazuzubacken, aber Vorsicht! Viele C/C++ - COmpiler usw. kennen glaube ich "nur" 32-Bit Assembler. Ich kann leider nur 16-Bit-Assembler, aber ich fange bald mal mit 32-Bit an *spangezeig*
MfG das Spangengesicht alias Quark48 _________________ Grüßle, Stefan
***
Wenn ein Programm auf nem alten Rechner gut läuft, dann läuft´s auf nem neuen erst recht!
Ich habe/hatte keine feste Spange und auch keine Schwester. Der Rest stimmt. Es tut mir leid... :-/ |
|
Nach oben |
|
|
raffus
Anmeldungsdatum: 14.02.2005 Beiträge: 1 Wohnort: Hamburch
|
Verfasst am: 14.02.2005, 23:51 Titel: @helium |
|
|
es heisst glaube ich : why is the 10 afraid of the 7..., weil doch die 10 nach der 9 kommt und nicht die 6 |
|
Nach oben |
|
|
Dusky_Joe
Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 15.02.2005, 18:38 Titel: |
|
|
@ jb:
Pset mit Assembler:
Code: |
;initiiere modus 13h = SCREEN 13 für QB-Coder
MOV AX, 0013h
INT 10h
MOV AX, 0A000h
MOV ES,AX
;errechne Offset im Video-Ram
;x, y und c sind die koordinaten bzw die farbe, als parameter übergeben.
MOV AX, y
MUL 320
ADD AX, x
MOV DI, AX
MOV AX, c
MOV ES:[DI], AX
|
Berechnung des offsets geht auch mit den shift-befehlen, aber da weiß ich jetz nix auswendig...
siehe auch die QB-MonFAQ, da gibts nen ziemlich ausführichen eintrag (verschiedenes (oder so ähnlich... das letzte register...)=> Was ist ein Assembler und wie kann ich ihn in qb benutzen)
Das ganze ersetzt die QB-Anweisungen:
Code: |
DEF SEG = &HA000
offset& = CLNG(y * 320 + x)
POKE offset&, c
DEF SEG
|
Das mit dem CLNG is optional, aber ich hab schon ein paarmal probleme bekommen, wo ich des weggelassen hab. auch hier wieder eine empfehlung: Use freeBASIC! (Diesmal wengen den Unsigned-Data) _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 15.02.2005, 18:42 Titel: |
|
|
Hallo.
Zitat: | Pset mit Assembler:
Code: | ;initiiere modus 13h = SCREEN 13 für QB-Coder
MOV AX, 0013h
INT 10h
MOV AX, 0A000h
MOV ES,AX
;errechne Offset im Video-Ram
;x, y und c sind die koordinaten bzw die farbe, als parameter übergeben.
MOV AX, y
MUL 320
ADD AX, x
MOV DI, AX
MOV AX, c
MOV ES:[DI], AX |
|
Mich würde mal ein Geschwindigkeitsoptimierter PSET Code für Screen 12 interessieren. Die konventionelle INT10 Methode ist glaub ich auch nicht so viel schneller als QB's PSET, oder?
Viele Grüße!
Sebastian _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
|
Dusky_Joe
Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 15.02.2005, 18:45 Titel: |
|
|
für screen12 hab ich auch noch keine lösung gesehen... asmpset bringt eigentlich erst was, wenn man über die Qb-modes hinausgeht, z.b. bei svga. sonst is es einfach nur ein gutes beispiel, wie asm funzt, und erklärt auch, wie der video-ram aufgebaut is.
Ob man trotzdem auch für einfachere modi asm benutzt, muss jeder selber wissen, oder _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
|
Quark48
Anmeldungsdatum: 16.10.2004 Beiträge: 559 Wohnort: Saltendorf a.d. Naab bzw. Teublitz i.d. Oberpfalz / Bayern
|
Verfasst am: 15.02.2005, 21:20 Titel: |
|
|
Hallo!
Klar, jedem das seine
Ich würde in C/C++ eine kleine Bibliothek schreiben, in
denen die Routinen untergebracht sind, die man aus BASIC
vermisst... _________________ Grüßle, Stefan
***
Wenn ein Programm auf nem alten Rechner gut läuft, dann läuft´s auf nem neuen erst recht!
Ich habe/hatte keine feste Spange und auch keine Schwester. Der Rest stimmt. Es tut mir leid... :-/ |
|
Nach oben |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2510 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 15.02.2005, 23:17 Titel: |
|
|
Dusky_Joe hat Folgendes geschrieben: | für screen12 hab ich auch noch keine lösung gesehen... |
SCREEN 12 beruht wie SCREEN 7/8/9 auf Bitplanes; siehe dazu
http://beilagen.dreael.ch/QB/VGAPROG/ ("View online")
bzw.
http://beilagen.dreael.ch/QB/VGAPROG.ZIP (alles zum Offline lesen downloaden)
Hinweis: Im VESA-Artikel habe ich sonst auch ein 16-Farbenmodus-Beispiel drin (SUB-Prozedur VesaPsetPlanaer()), allerdings nur in QB selber. Dürfte allerdings überhaupt nicht kompliziert sein, in Assembler umzusetzen. In den VESA-Spezifikationen sind die Codebeispiele sogar in C und Assembler selber. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
|
jb
Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 16.02.2005, 21:15 Titel: |
|
|
Thanks @ all!
Der Inline Assebler funzt doch so, oder:
jb |
|
Nach oben |
|
|
helium
Anmeldungsdatum: 10.09.2004 Beiträge: 397 Wohnort: Leverkusen
|
Verfasst am: 18.02.2005, 13:41 Titel: |
|
|
Zitat: | es heisst glaube ich : why is the 10 afraid of the 7..., weil doch die 10 nach der 9 kommt und nicht die 6 |
Nein.
Zitat: | Klar, jedem das seine
Ich würde in C/C++ eine kleine Bibliothek schreiben, in
denen die Routinen untergebracht sind, die man aus BASIC
vermisst |
NAtürlich. Microsoft hat DirectX nur ganz ausversehen released. Das ist eigentlich totaler schwachsinn. Lieber alles ncohmal selbst schreiben. Weil Man bekommt das ja sowieso selbst viel besser hin.
Statt das Spiel oder was auch immer zu schreiben verschwendet man dann eben seine Zeit damit das ganze irgendwie nachzubauen.
Und wenn ihr dann mal 'ne Datenbank braucht, blos keine fertige nehmen. Das bekommt selbst auch viel besser hin. Wozu es überhaupt fertige gibt.
Und wenn ich das nächste mal einen Text schreiben will schreib ich mir erstmal ne Textverarbeitung. Wozu ich mir überhaupt eine besorgt habe. _________________ Bevor Sie aufhören sich körperlich zu betätigen sollten Sie ihren Doktor befragen. Körperliche Inaktivität ist abnormal und gefährlich für Ihre Gesundheit. |
|
Nach oben |
|
|
marzec
Anmeldungsdatum: 13.10.2004 Beiträge: 267
|
Verfasst am: 18.02.2005, 18:14 Titel: |
|
|
du verstehsts noch immer nicht oder? hier gehts ums lernen und sich selbst mit den innerein zu beschäftigen ist eine äußerst lehrreiche und gute sache. ich glaube kaum das hier jemand so schwachsinnig ist zu sagen er kann eine hardwareunbeschleunigte directx variante mit qb und asm basteln. falls du dir das obige zeugs auch durchgelesen hast wirst du vielleicht bemerkt haben das hier vorrangig ( wenn nicht sogar ausschließlich ) über c++ und grafik unter DOS gesprochen wurde. graphics.h existiert soweit ich weiß nur beim alten borland c/c++, wobei ich mich hier wie immer täuschen kann.
ich möchte hier keinen flamewar lostreten aber deine aussagen hier und auf qbn sind mehr als nur unerträglich. anstatt intensives worddropping zu betreiben trag doch bitte einmal etwas konstruktives bei, z.B. links, code irgendetwas und verschon die menschheit mit deinen einstudierten ansichten zu den verschiedensten programmier paradigmen und dem hundertausendsten quicksort beispiel aus haskell "das ja beweist wie highlevel diese funktionellen sprachen sind"... _________________ Yagl - yet another gameprogramming library |
|
Nach oben |
|
|
jb
Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 18.02.2005, 19:43 Titel: |
|
|
OK, damit hier kein Krieg ausbricht, wieder zurück zum Thema:
Wie funktioniert denn nun der Inline Asembler unter C++?
Ich hab das wie oben gemacht, also so:
Code: |
asm
{
MOV AX, 0013h
INT 10h
MOV AX, 0A000h
MOV ES,AX
MOV AX, y
MUL 320
ADD AX, x
MOV DI, AX
MOV AX, c
MOV ES:[DI], AX
}
|
und mein C++ Compiler faselt etwas von einem 'Parse Error'.
Weiß jemand, was es damit auf sich hat?
@marzec: Ja, die graphics.h ist von einem C++ Compiler, der bei einem Buch dabei war (und natürlich sehr sehr alt ist und nicht funktioniert...)
jb |
|
Nach oben |
|
|
marzec
Anmeldungsdatum: 13.10.2004 Beiträge: 267
|
Verfasst am: 18.02.2005, 20:05 Titel: |
|
|
zu allererst wers interessant zu wissen was für einen compiler du benutzt. z.B. djgpp ( dos c/c++ compiler ), borland c++ 3.1 ( dos/windows ) etc. dann solltest du erwähnen für welches betriebssystem du programmierst ( also dos, windows, linux, whatever ). deinem asm code zur folge versuchst du den biosinterrupt zum initialisieren des mode 13h zu verwenden. das funktioniert nur innerhalb von dos, sprich du mußt mit einem dos compiler arbeiten. soweit ich mich erinnern kann lief djgpp mit dpmi im hintergrund ( ein dosextender ) warum ich jetzt nich genau sagen kann ob dein code damit funktioniert. borland c++ 3.1 sollte keine probleme machen.
zur syntax des inline assmbler. das is leider bei vielen compilern so ein eigengebräu deswegen wärs interessant zu wissen welchen compiler du genau verwendest. und in welcher zeile genau der error gefunden wurde etc. etc. _________________ Yagl - yet another gameprogramming library |
|
Nach oben |
|
|
Dusky_Joe
Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 18.02.2005, 22:27 Titel: |
|
|
Ja, das ist tatsächlich ein bisschen problematisch.. vllt sollten wirs doch lieber mit der graphics.h versuchen. Ich hab die nämlich auch auf meinem rechner.
Ich hab mir die mal kurz angesehen.
Der erste Teil ist eher unwichtig. Das meiste davon ist nur davon da, dass die Farbnummern definiert werden.
Interessant wirds bei den Prozedurdeclarationen.
Die beginnen mit void, int, unsigned, oder einer anderen Datendeklaration.
Die Drawing primitives:
void far _Cdecl circle(int x, int y, int radius);
Entspricht dem QB-Befehl Circle.
im Prog: circle (320, 240, 50)
Zeichnet Kreis an 320|240 mit radius 50
void far _Cdecl cleardevice(void);
void far _Cdecl clearviewport(void);
Sollte ein equivalent zu CLS sein... das zweite dürfte die Grafik löschen, das erste den text.
void far _Cdecl ellipse(int x, int y, int stangle, int endangle,
int xradius, int yradius);
Zeichnet eine Ellipse, entspricht dem QB-Circle mit allen seinen Parametern.
unsigned far _Cdecl getpixel(int x, int y);
Sollte so was wie QB-Point sein
void far _Cdecl initgraph(int far *graphdriver,
int far *graphmode,
char far *pathtodriver);
Dürfte dem QB-Screen ähnlich kommen, ist aber etwas erweitert.
void far _Cdecl line(int x1, int y1, int x2, int y2);
QB-Line, ohne die Box-funktion oder die Stile-bitmaske.
void far _Cdecl putpixel(int x, int y, int color);
Sollte das ganz normale PSET darstellen:
putpixel (100, 300, 15)
Setzt einen Weißen pixel auf 100|300.
Anmerkung:
Ich habe nur winzige grundkenntnisse in c, und habe auch die codes nicht ausprobiert; ich denke aber dass die prozedurdeklarationen eindeutig sind.
Viel glück damit! _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
|
jb
Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 19.02.2005, 11:35 Titel: |
|
|
Danke für die Antworten!
Ich benutze zwei verschiedene C++ Compiler.
Der erste ist für Windows, den hab ich von einem Kollegen bekommen:
"Dev-C++ Bloodshed Software Version 4.9.8.0"
Und der andere, der unter DOS arbeitet, bei einem Buch dabei war, und nicht funktioniert, da er die Headerdateien nicht findet:
"Borland Turbo C++ Light Compiler"
Die Programme sollten in erster Linie unter Windows ablaufen können.
Das Problem: Graphics.h ist nur beim letzteren C++ Compiler enthalten. Müsste aber auch mit dem ersten klappen, oder??
Der Fehler 'Parse Error' kommt in der Zeile
asm wird allerdings als Schlüsselwort erkannt.
jb |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|