|
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 |
oldirty
Anmeldungsdatum: 04.08.2005 Beiträge: 65
|
Verfasst am: 04.08.2005, 17:55 Titel: Anzahl der Bildschirmseiten in Erfahrung bringen? |
|
|
Hallo,
besteht die Möglichkeit über eine(n) Befehl/Funktion in Erfahrung zu bringen, ob der mit dem Befehl Screen(Grafik) erstellte Bildschirm mehr als 1 Seite besitzt?
Mit Screeninfo kann man die Breite, Höhe, Bittiefe usw. aber nicht die Zahl der Bildschirmseiten erfahren, oder irre ich mich?
Danke im Vorraus.
CU
OlDirty |
|
Nach oben |
|
|
Mecki Igel
Anmeldungsdatum: 10.09.2004 Beiträge: 985 Wohnort: Niederbayern
|
|
Nach oben |
|
|
oldirty
Anmeldungsdatum: 04.08.2005 Beiträge: 65
|
Verfasst am: 04.08.2005, 19:41 Titel: |
|
|
Habe nochmal eine alte Offline Referenz auf meiner HD gefunden, die mit folgendem Code Screeninfo erläutert:
Code: |
TYPE SCREENINFOTYPE
driver_name AS STRING
w AS INTEGER
h AS INTEGER
depth AS INTEGER
pitch AS INTEGER
bpp AS INTEGER
mask_color AS INTEGER
num_pages AS INTEGER
flags AS INTEGER
END TYPE
DIM info AS SCREENINFOTYPE PTR
SCREEN 15, 32
' Obtain info about current mode
info = SCREENINFO
PRINT "Bildschirmmodus:"
PRINT STR$(info->w) + "x" + STR$(info->h) + "x" + STR$(info->depth);
PRINT " über " + info->driver_name + "-Treiber"
SLEEP
|
Mit FB 0.14b geht das Bsp. leider nicht mehr.
Syntax-Fehler in der Zeile info = SCREENINFO.
Screeninfo jetzt Anweisung: SCREENINFO [w][,[h][,[depth][,[bpp][,[pitch][,[rate][,driver]]]]]
Bitte um Hilfe, wie der Code umgeschrieben werden muss.
Danke. |
|
Nach oben |
|
|
Dusky_Joe
Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 04.08.2005, 21:45 Titel: |
|
|
Ich vermute mal, dass diese Information nicht mehr zur Verfügung steht, weil du als Programmierer immer selbst festlegst, wie viele Seiten du verwenden willst. Dass diese anzahl einmal unbekannt ist, kann eigentlich nicht sein.
Du kannst vor der initialisierung des Modus i.d.R. immer die Seitenzahl in einer (globalen) Variable zwischenspeichern, und fertig.
... oder mir das gegenteil beweisen
Wozu bräuchtest du diese Info denn? (Codeauszug?) _________________ 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 |
|
|
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 04.08.2005, 21:48 Titel: |
|
|
Hallo.
Ich habe gerade mal was rumprobiert, und habe den Ansatz der Lösung gefunden:
Code: |
screen 18,32,5,0
TYPE SCREENINFOTYPE
driver_name AS STRING
w AS INTEGER
h AS INTEGER
depth AS INTEGER
pitch AS INTEGER
bpp AS INTEGER
mask_color AS INTEGER
num_pages AS INTEGER
flags AS INTEGER
END TYPE
dim info as SCREENINFOTYPE
with info
screeninfo .w,.h,.depth
end with
print info.w,info.h,info.depth
sleep
|
Wie man sieht, wird die Auflösung und die Tiefe angezeigt.
Mfg
Michael
EDIT:
So ists einfacher und umfangreicher:
Code: |
screen 18,32,5,0
SCREENINFO w,h,depth,bpp,pitch,rate,driver$
print w;" *";h;" *";depth;",";bpp;",";pitch;",";rate;",";driver$
sleep
|
_________________
Code: | #include "signatur.bi" |
|
|
Nach oben |
|
|
Dusky_Joe
Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 04.08.2005, 22:00 Titel: |
|
|
Interessant...
ScreenInfoType hat auch eine Adresse, die mit @ScreenInfoType herausgefunden werden kann. Evtl kann man sie so weit dereferenzieren, dass die vergessene Seitenanzahl auftaucht? _________________ 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 |
|
|
oldirty
Anmeldungsdatum: 04.08.2005 Beiträge: 65
|
Verfasst am: 04.08.2005, 22:40 Titel: |
|
|
Hallo,
habe eine ganz einfache Sub-Routine geschrieben, um die Befehle AREA und AREAFILL zu implementieren (Befehle aus der AmigaBasic-Zeit). Da die FÜll-Routine mit Paint bei überlappenden bereichen nicht ganz füllt, habe ich das zeichnen in der 2. Bildebene durchgeführt, mit Get kopiert und anschließend mit Put auf die aktuelle, d. h. sichtbare Bildschirmseite kopiert und mit "or" verbunden.
Da ich die Sub-Routine in verschiedenen Programmen verwenden will, soll eine Überprüfung stattfinden, ob der Screen mehr als eine Bildebene hat und ggf. einen Hinweis ausgeben. Im Moment ist alles nur für den Eigengebrauch, aber man weis ja nie.
Hier mal der Code:
Code: |
'Area und Areafill bereitstellen
'
'*** Es müssen 2 Bildschirmebenen vorhanden sein, damit richtig funktioniert
'
'OlDirty 03/08/2005
dim shared ax,ay,adx,ady,amaxx,amaxy,aminx,aminy,azxy,apx,apy,adurchlauf as integer
declare sub Area(x,y as integer) 'Area-Befehl bereitstellen
declare sub Areafill() 'Areafill-Befehl bereitstellen
dim shared ar(1000*1000*32) 'Speicher für gezeichnetes Area reservieren
'1000x * 1000y * 32 Bit
adx=0 'Für Mittelpunkt
ady=0 'Für Mittelpunkt
adxy=0 'Zähler für Mittelwert
adurchlauf=0 'Wenn =0 dann Beginn des Area
xxx=0
aminx=9999 'Wert für kleinste Position X
aminy=9999 'y
amaxx=0 'Wert für groesste Position X
amaxy=0 'Y
sub Area(ax,ay)
screenset 1,0 'Auf 2. Ebene Zeichnen, 0 = Hauptseite aber anzeigen
'1 = Aktive Seite für Ausgabe (Puffer)
' 0= angezeigte Seite (Hauptseite)
if adurchlauf=0 then
pset (ax,ay) 'Startpunkt 1. Punkt
apx=ax 'Startpunkt x-Achse
apy=ay 'Startpunkt y-Achse
adurchlauf=-1
adx=adx+apx
ady=ady+apy
azxy=1
else
line -(ax,ay) 'Wenn ab 2. Punkt Linie bis...
adx=adx+ax
ady=ady+ay
azxy=azxy+1
end if
if ax<aminx then aminx=ax 'Kleinstes X ermitteln
if ay<aminy then aminy=ay 'Kleinstes Y ermitteln
if ax>amaxx then amaxx=ax 'Groesstes X ermitteln
if ay>amaxy then amaxy=ay 'Groesstes Y ermitteln
screenset 0,0 'Ausgabe wieder auf Hauptseite + Hauptseite zeigen
end sub
sub Areafill
screenset 1,0
line -(apx,apy) 'Polygon schließen
adx=int(adx/azxy) 'Mittelwert berechnen x
ady=int(ady/azxy) 'Mittelwert berechnen y
paint(adx,ady) 'Füllen
GET (aminx,aminy)-(amaxx,amaxy), ar 'Gefülltes Area speichern
cls '2. Bildschirm leeren
screenset 0,0 'Auf Hauptbildschirm schalten
put (aminx,aminy), ar ,or 'Gefülltes Area mit vorhandenem Bild kombinieren
adx=0 'alle Werte auf Anfang
ady=0
azxy=0
apx=0
apy=0
adurchlauf=0
amaxx=0
amaxy=0
aminx=9999
aminy=9999
ax=0
ay=0
end sub
'**************************
'Beispielcode, zeichnet stilisierte Pyramide
screen 16,,2
cls
color 3,0
Area (100,150) 'Zeichnet Polygon(mind. 2 Punkte vorgeben) oder andere Beliebige Form
Area (400,150) 'Zweiter Punkt
Area (250,20) 'dritter Punkt
Areafill 'Füllt anschließend diese Form
color 2,0
Area (100,150)
Area (400,150)
Area (200,180)
Areafill
color 1,0
Area (250,20)
Area (400,150)
Area (450,100)
Areafill
sleep
|
Danke für die schnellen Antworten. |
|
Nach oben |
|
|
psygate
Anmeldungsdatum: 05.04.2005 Beiträge: 304 Wohnort: Wien und der Computer
|
Verfasst am: 05.08.2005, 10:55 Titel: Screenseiten in erfahrung bringen |
|
|
Die einfachste möglichkeit, die ich auch immer benutze, wäre natürlich, die anzahl selbst fest zu legen.
(Weiss nciht ob das jetzt so konstruktiv is... )
Code: |
screen 20,24,3,&h1
'modus: 20
'pixelbittiefe: 24bit
'Bildschirmseitenanzahl:3
'jetzt nur noch screenset und dann ists eigentlich zum arbeiten fertig. |
|
|
Nach oben |
|
|
oldirty
Anmeldungsdatum: 04.08.2005 Beiträge: 65
|
Verfasst am: 05.08.2005, 13:24 Titel: |
|
|
Ich möchte diese Befehle in einer .bas Datei auslagern und ggf. in verschiedenen Programmen über #include "Sub_Area.bas" einbinden. Die eingebundene Datei soll dann selbst ermitteln, ob das Hauptprogramm, in der es eingebunden wurde, den Screen mit mehr als einer Ebene geöffnet hat und ggf. einen Hinweis ausgeben, dass Screen geändert werden muss. |
|
Nach oben |
|
|
psygate
Anmeldungsdatum: 05.04.2005 Beiträge: 304 Wohnort: Wien und der Computer
|
Verfasst am: 05.08.2005, 15:45 Titel: |
|
|
aja, verstehe |
|
Nach oben |
|
|
oldirty
Anmeldungsdatum: 04.08.2005 Beiträge: 65
|
Verfasst am: 07.08.2005, 14:36 Titel: |
|
|
Danke d.j. peters für die Antwort.
Funktioniert, wie gewünscht. |
|
Nach oben |
|
|
oldirty
Anmeldungsdatum: 04.08.2005 Beiträge: 65
|
Verfasst am: 08.08.2005, 16:52 Titel: |
|
|
Um mal wieder in das Programmieren reinzukommen, habe ich alte AmigaBasic Grafik-Bücher rausgekrammt und auf freebasic umgeschrieben.
Unter Freebasic stehen die Funktionen nicht (oder doch?) zur Verfügung. Habe dann eigene Befehle geschrieben.
Über eine Anleitung/Beispiele wäre ich aber dankbar. Sind diese nur über APIs möglich? Gehen diese dann auch auf einen Screen, der nicht übe Apis geöffnet wurde, z. b. mit Screen 16? Bin mit Apis nicht so vertraut, wissen reicht aber zumindest für die Erstellung von MessageBoxen. Grafik- und Fenstersteuerung muss ich noch lernen. Für Anfängerprojekte auch noch nicht erforderlich. Fange erst einmal klein an.
Woher kommt die C Struct bzw. woher fb_mode (EXTERN fb_mode alias "fb_mode" as MODE ptr)? Hilft vielleicht auch für eigene Recherchen. |
|
Nach oben |
|
|
oldirty
Anmeldungsdatum: 04.08.2005 Beiträge: 65
|
Verfasst am: 09.08.2005, 14:08 Titel: |
|
|
Habe noch das Buch von Markt und Technik: 3D-Grafik und Animation.
Programmcode in AmigaBasic und tlw. in C.
Link:
http://www.birdys.de/default.php?page=buecher&kat=15&menu=1
Hier ist ein C-Code enthalten, mit dem man eine Raytracing-Welt rendern lassen kann. |
|
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.
|
|