 |
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 |
1igel
Anmeldungsdatum: 15.03.2006 Beiträge: 21
|
Verfasst am: 20.03.2006, 11:41 Titel: Warum zeigt Gfx keinen Text an? |
|
|
Liebe Nutzergemeinde,
folgen Code versuche ich als "Muster" auf meiner Kiste laufen zu lassen:
[code]
type Font
w as integer
h as integer
d as any ptr
end type
extern Font8 alias "fb_font_8x8" as Font
extern Font14 alias "fb_font_8x14" as Font
extern Font16 alias "fb_font_8x16" as Font
sub PrintXY3(byref f as Font, _
byval xpos as integer, _
byval ypos as integer, _
byref text as string, _
byval fgcol as integer=&HFFFFFF, _
byval bgcol as integer=-1, _
byval Size as integer=1, _
byval Filled as integer=1, _
byval Round as integer=0 )
dim as integer i,y,yend,l,code,x,bits,sx
dim row as ubyte ptr
l=len(text)-1:if l<0 then exit sub
yend=f.h-1:if Size<1 then exit sub
screeninfo sx
screenlock
for i = 0 to l
code=text[i]:code*=f.h:row=f.d+code
if Size>1 then
if Filled=0 then
for y = 0 to yend
bits=*row
for x=0 to 7
if (bits and 1) then
if Round=0 then
line (xpos+x*size,ypos+y*size)-step(size,size),fgcol,b
else
circle (xpos+x*size+size*0.5,ypos+y*size+size*0.5),size*0.5,fgcol
end if
elseif bgcol<>-1 then
if Round=0 then
line (xpos+x*size,ypos+y*size)-step(size,size),bgcol,b
else
circle (xpos+x*size+size*0.5,ypos+y*size+size*0.5),size*0.5,bgcol
end if
end if
bits=bits shr 1
next
row+=1
next
xpos+=f.w*Size::
if (xpos-f.w*Size)>sx then
screenunlock:
exit sub
end if
else ' filled
for y = 0 to yend
bits=*row
for x=0 to 7
if (bits and 1) then
if Round=0 then
line (xpos+x*size,ypos+y*size)-step(size,size),fgcol,bf
else
circle (xpos+x*size+size*0.5,ypos+y*size+size*0.5),size*0.5,fgcol,,,,f
end if
elseif bgcol<>-1 then
if Round=0 then
line (xpos+x*size,ypos+y*size)-step(size,size),bgcol,bf
else
circle (xpos+x*size+size*0.5,ypos+y*size+size*0.5),size*0.5,bgcol,,,,f
end if
end if
bits=bits shr 1
next
row+=1
next
xpos+=f.w*Size:
if (xpos-f.w*Size)>sx then
screenunlock
exit sub
end if
end if
else 'no Size
for y = 0 to yend
bits=*row
for x=0 to 7
if (bits and 1) then
pset (xpos+x,ypos+y),fgcol
elseif bgcol<>-1 then
pset (xpos+x,ypos+y),bgcol
endif
bits=bits shr 1
next
row+=1
next
xpos+=f.w:
if (xpos-f.w)>sx then
screenunlock
exit sub
end if
end if
next
screenunlock
end sub
dim as integer Size,y,x,filled,round,fgcol,bgcol,c
dim as double w
'screenres 640,480 ',32
y=10:cls
for Size=1 to 8
print size:sleep 500
x=10 :printxy3 font14 ,x,y,"8x14 ",1 ,,Size
x+=Size*8*4:printxy3 font14 ,x,y,"8x14 ",2 ,,Size,0
x+=Size*8*4:printxy3 font14 ,x,y,"8x14 ",3 ,,Size,1,1
x+=Size*8*4:printxy3 font14 ,x,y,"8x14 ",4 ,,Size,0,1
y+=Size*14
next
sleep 1000,1
y=10:cls
for Size=1 to 8
print size:sleep 500
x=10 :printxy3 font14 ,x,y,"8x14 ",4 ,5,Size
x+=Size*8*4:printxy3 font14 ,x,y,"8x14 ",3 ,6,Size,0
x+=Size*8*4:printxy3 font14 ,x,y,"8x14 ",2 ,7,Size,1,1
x+=Size*8*4:printxy3 font14 ,x,y,"8x14 ",1 ,8,Size,0,1
y+=Size*14
next
sleep 1000,1
do
fgcol = 1+rnd*254
bgcol = rnd*2 :if bgcol>1.0 then bgcol=1 +rnd *254 else bgcol=-1
while fgcol=bgcol:fgcol= 1+rnd*254:wend
for filled=1 to 0 step -1
for round=0 to 1
for w=-3.14 to 3.14 step 6.28/80
size=cos(w)*32+33
cls
printxy3 font8 ,0,0,"Play with font.",fgcol,bgcol,Size,filled,round
printxy3 font16,400,400,"Size=" & str(Size),7,,4,0
print "DO w",w
sleep 50:if len(inkey) then exit do
next
next
next
loop
end
[/code]
Leider werden k e i n e Texte angezeigt, wohl aber Farben und Kästchen. Was muss ich machen, um den Text angezeigt zu bekommen? Die eingebauten Print's zeigen an, dass das Programm nicht hängt.
Ich bin hobby-FB-ler und hoffe, dass die Antwort meine Fähigkeiten nicht übersteigt. |
|
Nach oben |
|
 |
Tomtitom

Anmeldungsdatum: 20.09.2004 Beiträge: 308
|
Verfasst am: 20.03.2006, 17:40 Titel: |
|
|
also ich sehe nicht so ganz das Problem, bei mir werden auf jeden Fall Schriften angezeigt in unterschiedlichen Farben.
Natürlich muss das ' vor SCREENRES weg - wenn es nicht diese simple Lösung ist, erkläre doch mal bitte genauer, was das Problem ist. |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 20.03.2006, 18:44 Titel: |
|
|
Bei mir nicht:
log hat Folgendes geschrieben: | Command executed:
"C:\FreeBASIC\fbc.exe" "C:\FreeBASIC\999.bas" -r
Results:
Compilation successful
Generated executable: C:\FreeBASIC\999.exe
System:
FBIde: 0.4.6
fbc: FreeBASIC Compiler - Version 0.15 for win32 (target:win32)
OS: Windows XP (build 2600, Service Pack 2) |
Ich sehe zwar die Grafik Effekte, aber nicht den Text.
(Ausser dem Text der über Print kommt)
Ich seh's mir gleich genauer an.
Edit:/
Sorry, ich kann den Code kaum lesen.
Kannst du ihn vielleicht auf http://freebasic.de/fbnp/ hochladen, dann gibt es keine Probleme mehr mit den Eckigen Klammern |
|
Nach oben |
|
 |
1igel
Anmeldungsdatum: 15.03.2006 Beiträge: 21
|
Verfasst am: 20.03.2006, 19:44 Titel: |
|
|
sorry, das Hochkomma gehört nicht da hin; trotzdem wird nur der Text nach PRINT angezeigt (neben den farbigen Graphiken). Es wird also kein Schriftzug an wechselden Positionen angezeigt.
1igel |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 20.03.2006, 21:17 Titel: |
|
|
Ich Philosophiere mal etwas:
An den EXIT SUB liegt es wahrscheinlich nicht.
(Ich hab einige Ausgaben gesetzt und die EXIT SUB's wurden nicht aufgerufen bei meinem Test. Das Normale Ende der Sub wird erreicht)
Ein Screenlock/Screenunlock konflikt ist es auch nicht, andere ausgaben gehen ja.
Kannst du mir vielleicht diese Zeilen erklären?
(Quelle Funktion etc.)
Code: | type Font
w as integer
h as integer
d as any ptr
end type
extern Font8 alias "fb_font_8x8" as Font |
Nur um das Verständniss zu sichern:
Du weisst was diese Befehle bewirken?
Code: | bits=bits shr 1
bits=*row |
|
|
Nach oben |
|
 |
Eastler_dart

Anmeldungsdatum: 25.09.2005 Beiträge: 177 Wohnort: Baden-Würtemberg + Sachsen
|
Verfasst am: 20.03.2006, 21:47 Titel: |
|
|
Hi Leute, hi 1igel
hab mal versucht, den Code erst mal leserlicher zu gestalten. dabei sind mir ein kleines Durcheinander aufgefallen.
Somit hier dein Programm mal leserlich eingerückt. Du wirst feststellen, (hab Rems und falls notwendig ein paar Befehle eingefügt), daß du IF-THEN-Schleifen eröffnest, darin FOR-NEXT Schleifen beginnst, und danach die IF-THEN-Schleifen beendest, ohne dir FOR-Next-Schleife zuvor zu beenden.
Oder das FOR steht in einer IF-THEN-Bedingung, das NEXT kommt jedoch erst später, nach dem IF-THEN-ENDE.
Meine Änderungen sind einfach nur die Schreibreihenfolge berichtigend, hab jedoch nicht geprüft, ob die so Sinn machen.
Code: |
type Font
w as integer
h as integer
d as any ptr
end type
extern Font8 alias "fb_font_8x8" as Font
extern Font14 alias "fb_font_8x14" as Font
extern Font16 alias "fb_font_8x16" as Font
sub PrintXY3(byref f as Font, _
byval xpos as integer, _
byval ypos as integer, _
byref text as string, _
byval fgcol as integer=&HFFFFFF, _
byval bgcol as integer=-1, _
byval Size as integer=1, _
byval Filled as integer=1, _
byval Round as integer=0 )
dim as integer i, y, yend, l, code, x, bits, sx
dim row as ubyte ptr
l=len(text)-1:if l<0 then exit sub
yend=f.h-1:if Size<1 then exit sub
screeninfo sx
screenlock
for i = 0 to l
code=text[i]:code*=f.h:row=f.d+code
if Size>1 then
if Filled=0 then
for y = 0 to yend
bits=*row
for x=0 to 7
if (bits and 1) then
if Round=0 then
line (xpos+x*size,ypos+y*size)-step(size,size),fgcol,b
END IF '<----FEHLT HIER
END IF '<----FEHLT HIER
NEXT '<-------HIER FEHLT EIN NEXT !
NEXT '<-------HIER FEHLT EIN NEXT !
else
circle (xpos+x*size+size*0.5,ypos+y*size+size*0.5),size*0.5,fgcol
end if
elseif bgcol<>-1 then
if Round=0 then
line (xpos+x*size,ypos+y*size)-step(size,size),bgcol,b
else
circle (xpos+x*size+size*0.5,ypos+y*size+size*0.5),size*0.5,bgcol
end if
end if
bits=bits shr 1
next
row+=1
'next :'NEXT OHNE FOR, ODER IST DAS FOR im "IF-THEN"Block gemeint?
'NIEMALS EIN FOR-BLOCK innerhalb IF-THEN Beginnen und
'außerhalb IF-THEN beenden(Next) !
xpos+=f.w*Size::
if (xpos-f.w*Size)>sx then
screenunlock:
exit sub
end if ' <-----------ERST ELSE, DANN END IF!!!
'else ' filled <-----------ERST ELSE, DANN END IF!!!
for y = 0 to yend
bits=*row
for x=0 to 7
if (bits and 1) then
if Round=0 then
line (xpos+x*size,ypos+y*size)-step(size,size),fgcol,bf
else
circle (xpos+x*size+size*0.5,ypos+y*size+size*0.5),size*0.5,fgcol,,,,f
end if
elseif bgcol<>-1 then
if Round=0 then
line (xpos+x*size,ypos+y*size)-step(size,size),bgcol,bf
else
circle (xpos+x*size+size*0.5,ypos+y*size+size*0.5),size*0.5,bgcol,,,,f
end if
end if
bits=bits shr 1
next
row+=1
next
xpos+=f.w*Size:
if (xpos-f.w*Size)>sx then
screenunlock
exit sub
end if '<-----------einmal END IF
'end if '<-------zuviel
'else 'no Size
for y = 0 to yend
bits=*row
for x=0 to 7
if (bits and 1) then
pset (xpos+x,ypos+y),fgcol
elseif bgcol<>-1 then
pset (xpos+x,ypos+y),bgcol
END IF :'nicht endif !!! Tippföhler !!
bits=bits shr 1
next
row+=1
next
xpos+=f.w:
if (xpos-f.w)>sx then
screenunlock
exit sub
end if '<----- nur einmal END IF
'end if '<----- IST ZUVIEL!
'next 'KANN KEINEN BEZUG FINDEN
screenunlock
end sub
dim as integer Size,y,x,filled,round,fgcol,bgcol,c
dim as double w
'screenres 640,480 ',32
y=10:cls
for Size=1 to 8
print size:sleep 500
x=10 :printxy3 font14 ,x,y,"8x14 ",1 ,,Size
x+=Size*8*4:printxy3 font14 ,x,y,"8x14 ",2 ,,Size,0
x+=Size*8*4:printxy3 font14 ,x,y,"8x14 ",3 ,,Size,1,1
x+=Size*8*4:printxy3 font14 ,x,y,"8x14 ",4 ,,Size,0,1
y+=Size*14
next
sleep 1000,1
y=10:cls
for Size=1 to 8
print size:sleep 500
x=10 :printxy3 font14 ,x,y,"8x14 ",4 ,5,Size
x+=Size*8*4:printxy3 font14 ,x,y,"8x14 ",3 ,6,Size,0
x+=Size*8*4:printxy3 font14 ,x,y,"8x14 ",2 ,7,Size,1,1
x+=Size*8*4:printxy3 font14 ,x,y,"8x14 ",1 ,8,Size,0,1
y+=Size*14
next
sleep 1000,1
do
fgcol = 1+rnd*254
bgcol = rnd*2 :if bgcol>1.0 then bgcol=1 +rnd *254 else bgcol=-1
while fgcol=bgcol:fgcol= 1+rnd*254:wend
for filled=1 to 0 step -1
for round=0 to 1
for w=-3.14 to 3.14 step 6.28/80
size=cos(w)*32+33
cls
printxy3 font8 ,0,0,"Play with font.",fgcol,bgcol,Size,filled,round
printxy3 font16,400,400,"Size=" & str(Size),7,,4,0
print "DO w",w
sleep 50:if len(inkey) then exit do
next
next
next
loop
end
|
Nimm die Korrekturen mal als Anregung und prüfe, wie eine Berichtigung aussehen sollte, die auch daß als Programm ausführt, was du haben willst.
Wenn du FOR-NEXT IF_THEN_END IF verschachtelst, dann beende jeweils die Zuletzt geöffnete Schleife zuerst
Code: |
'FALSCH WÄRE:
IF Blau% = Rot% THEN
FOR FarbNr% = 1 TO 10
END IF
NEXT FarbNr%
'RICHTIG IST:
IF Blau% = Rot% THEN
FOR FarbNr% = 1 TO 10
NEXT FarbNr%
END IF
|
Als Hilfe könntest du dir das Einrücken der Zeilen (wie hier gezeigt) angewöhnen, ist zwar etwas umständlich beim Tippen aber 10-fach
hilfreich beim Fehlersuchen und lesen(auch für andere!)
Eastler _________________ Kaum macht mans richtig, schon geht's |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 20.03.2006, 21:49 Titel: |
|
|
Das einrücken wurde wahrscheinlich durch Forum Zestört.
(Ohne Code kasten gehen die meisten Formatirungen flotten) |
|
Nach oben |
|
 |
Tomtitom

Anmeldungsdatum: 20.09.2004 Beiträge: 308
|
Verfasst am: 20.03.2006, 22:23 Titel: |
|
|
also jetzt noch mal zum Verständnis: soll das nicht so aussehen?
http://user.blue-cable.de/tomtitom/bsp.png
Ich weiß nämlich nicht, was da sonst noch kommen sollte - die anderen Grafiken kommen auch so wie es meiner meinung nach sein sollte. Es liegt wohl nicht am Code.
bei eastlers code ist dann das ganze ziemlich fehlerhaft.
BTW: die FBIDE kann doch alles schön formatieren, dann muss man es doch nicht extra in fbnp posten. |
|
Nach oben |
|
 |
1igel
Anmeldungsdatum: 15.03.2006 Beiträge: 21
|
Verfasst am: 20.03.2006, 23:09 Titel: |
|
|
Leute,
ich bin Anfänger und habe den Code gefunden bei Freebasic.net, Forum Beginners, Autor eagle, "Resizing text characters in a graphic mode..." und dachte in meiner Einfalt, dass ich das mal ausprobieren möchte, um daran zu lernen.
Ich entschuldige mich, wenn beim posten die Einrück-Struktur auf der Strecke geblieben ist. Halt ein Anfänger!!
Wenn ich sehen würde, was Tomtitom unter http://user.blue-cable.de/tomtitom/bsp.png zeigt, wäre die Welt ja in Ordnung. Aber: ich sehe n i x - nur das Hochzählen des Scheifenzählers.
Irgenwo hatte ich noch ein ähnliches Stückchen gefunden, das auch mit größer und kleiner werdenden Kreisen und Quadraten neben Textdarstellung gespielt hat. Auch dort ging nur die reine Graphik und der Text wurde ebenfalls nicht angezeigt.
Kann es an diesem Teil liegen:
type Font
w as integer
h as integer
d as any ptr
end type
extern Font8 alias "fb_font_8x8" as Font
Habt Dank für alle Mühe und Ratschläge; aber wissen würde ich es schon gerne wollen, warum es bei mir nicht gehen will.
1igel |
|
Nach oben |
|
 |
Tomtitom

Anmeldungsdatum: 20.09.2004 Beiträge: 308
|
Verfasst am: 20.03.2006, 23:25 Titel: |
|
|
aaalllso, dann dürfte klar sein, woran es liegt, welche FB-Version verwendest du denn, ich habe die 0.16b, ich vermute mal, wenn du die 0.15er hast, dürfte es auch noch gehen, aber drunter bestimmt nicht.
Evtl. könnte es auch noch sein, dass mit dem extern noch was eingebunden wird, was du nicht hast, aber damit kenne ich mich jetzt auch nicht so genau aus. |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 21.03.2006, 18:23 Titel: |
|
|
@1igel
Das ist also die Quelle, gib sie das nächste mal bitte an.
http://www.freebasic.net/forum/viewtopic.php?t=3241
Ohne ist echt mühsam rauszufinden wo das Problem ist.
@Tomtitom
Ja, die FBIDE kann sauber einrücken.
Aber wenn der Code Kasten nicht sauber gesetz ist, verschwinden die Leerzeichen halt und das hat nichts mit der IDE zu tun.
Also mit 0.15 geht es bei mir nicht.
Hab eine frische FB installation mit den neusten Daten gemacht, mit denen geht es.
So wie ich das sehe müsste diese Version sein ab der es sicher geht:
FB-v0.16b-mar-04-testing-win32.zip
Wobei ich einem Anfanger drigent davon abrate eine Testing Version zu verwenden. |
|
Nach oben |
|
 |
1igel
Anmeldungsdatum: 15.03.2006 Beiträge: 21
|
Verfasst am: 22.03.2006, 00:07 Titel: |
|
|
danke für tipps und trost,
aber ich sehe es auch so, dass ich von einer Testing Versioon lieber die Finger lassen sollte; dann muss ich eben noch ein wenig warten, bis auch mein Bildschirm Texte an beliebiger Stelle, Größe und Farbe 'malen" kann. Ich hab auch so noch genug FB zu lernen. und wenn's zu übel wird, rollt sich 1igel zur Kugel auf und ist auch zufrieden.
 |
|
Nach oben |
|
 |
max06

Anmeldungsdatum: 05.12.2004 Beiträge: 390 Wohnort: Augsburg
|
Verfasst am: 22.03.2006, 17:39 Titel: Kannst du doch! |
|
|
Such mal in der gfxlib.txt (im docs-ordner) nach GfxPrint. Das müsste bei Rund Zeile 2100 sein... Das hilft dir bestimmt weiter
Grüße
Florian |
|
Nach oben |
|
 |
Eastler_dart

Anmeldungsdatum: 25.09.2005 Beiträge: 177 Wohnort: Baden-Würtemberg + Sachsen
|
Verfasst am: 22.03.2006, 18:07 Titel: |
|
|
Wenn es dir nur darum geht, Schriften mit "eigenem" Schriftbild zu erzeugen und farbig, transparent im Grafikmodus anzuzeigen, dann schau dir auch mal mein FreeFontEdit an.
FreeFontEdit erzeugt beim Speichern auch eine *.Bas-Datei, in der stehen sämtliche Subs, um solche Texte anzuzeigen. Du kannst damit die Schriften fest in den Basic-Code einbinden oder als separate Schriftdatei nachladen.
Schriften kannst du bis zu einer größe von 16 x 32 Pixel erzeugen, also kleine, normale, große, wie du das haben willst.
Die Beschreibung kannst du auf:
http://www.eastler.de/FreeBasic/FreeFontEdit/FreeFont.htm
online nachlesen und das Paket auch downloaden,
Den reinen Download des Programms, der Beispielschriften und Beschreibung als Zip-Archif findest du ebenso hier im Downloadbereicht
vielleicht hilfts
Eastler _________________ Kaum macht mans richtig, schon geht's |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 23.03.2006, 08:24 Titel: |
|
|
@d.j.peters
Welche Compiler Version hast du benutz für diesen Code? |
|
Nach oben |
|
 |
1igel
Anmeldungsdatum: 15.03.2006 Beiträge: 21
|
Verfasst am: 23.03.2006, 12:38 Titel: |
|
|
Hallo,
danke Florian für den Verweis auf die gfxlib. Das Beispiel dort funktioniert!
Ich war ja auch nur neugierig, warum das zuerst gepostete Beispiel nicht geht. Nur so - um dazuzulernen. Meine BASIC-Lebenslauf ist schon recht lang: angefangen hat es vor etwa 30 Jahren mit HP (umgekehrt polnische Notation!!), dann über Turbo-Basic zu QB und nun zu FB. Mit der Hilfe in diesem Forum wird es schon klappen.
Danke sagt 1igel |
|
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.
|
|