Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Grafikprogrammierung in C++
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Profi-Forum
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 13.02.2005, 19:41    Titel: Grafikprogrammierung in C++ Antworten mit Zitat

Hallo Leute,
hab mich mal aufgerafft C++ zu lernen. peinlich

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 13.02.2005, 19:49    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 13.02.2005, 19:56    Titel: Grafik in C++ Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 13.02.2005, 20:04    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
helium



Anmeldungsdatum: 10.09.2004
Beiträge: 397
Wohnort: Leverkusen

BeitragVerfasst am: 13.02.2005, 20:16    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 13.02.2005, 20:26    Titel: C++ Antworten mit Zitat

@ 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, 20:36, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Quark48



Anmeldungsdatum: 16.10.2004
Beiträge: 559
Wohnort: Saltendorf a.d. Naab bzw. Teublitz i.d. Oberpfalz / Bayern

BeitragVerfasst am: 13.02.2005, 20:27    Titel: Antworten mit Zitat

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* zwinkern

MfG das Spangengesicht alias Quark48 lächeln
_________________
Grüßle, Stefan lächeln
***
Wenn ein Programm auf nem alten Rechner gut läuft, dann läuft´s auf nem neuen erst recht! happy
Ich habe/hatte keine feste Spange und auch keine Schwester. Der Rest stimmt. Es tut mir leid... :-/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
raffus



Anmeldungsdatum: 14.02.2005
Beiträge: 1
Wohnort: Hamburch

BeitragVerfasst am: 14.02.2005, 22:51    Titel: @helium Antworten mit 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
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 15.02.2005, 17:38    Titel: Antworten mit Zitat

@ 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
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 15.02.2005, 17:42    Titel: Antworten mit Zitat

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. happy Die konventionelle INT10 Methode ist glaub ich auch nicht so viel schneller als QB's PSET, oder?

Viele Grüße!
Sebastian
_________________

Der Markt regelt das! | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 15.02.2005, 17:45    Titel: Antworten mit Zitat

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 zwinkern
_________________
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
Benutzer-Profile anzeigen Private Nachricht senden
Quark48



Anmeldungsdatum: 16.10.2004
Beiträge: 559
Wohnort: Saltendorf a.d. Naab bzw. Teublitz i.d. Oberpfalz / Bayern

BeitragVerfasst am: 15.02.2005, 20:20    Titel: Antworten mit Zitat

Hallo!

Klar, jedem das seine zwinkern
Ich würde in C/C++ eine kleine Bibliothek schreiben, in
denen die Routinen untergebracht sind, die man aus BASIC
vermisst... grinsen
_________________
Grüßle, Stefan lächeln
***
Wenn ein Programm auf nem alten Rechner gut läuft, dann läuft´s auf nem neuen erst recht! happy
Ich habe/hatte keine feste Spange und auch keine Schwester. Der Rest stimmt. Es tut mir leid... :-/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2507
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 15.02.2005, 22:17    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 16.02.2005, 20:15    Titel: Antworten mit Zitat

Thanks @ all!

Der Inline Assebler funzt doch so, oder:
Code:

asm
 {
  blablabla
 }


jb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
helium



Anmeldungsdatum: 10.09.2004
Beiträge: 397
Wohnort: Leverkusen

BeitragVerfasst am: 18.02.2005, 12:41    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
marzec



Anmeldungsdatum: 13.10.2004
Beiträge: 267

BeitragVerfasst am: 18.02.2005, 17:14    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 18.02.2005, 18:43    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
marzec



Anmeldungsdatum: 13.10.2004
Beiträge: 267

BeitragVerfasst am: 18.02.2005, 19:05    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 18.02.2005, 21:27    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 19.02.2005, 10:35    Titel: Antworten mit Zitat

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
Code:

asm {

asm wird allerdings als Schlüsselwort erkannt.

jb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Profi-Forum Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
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.

 Impressum :: Datenschutz