 |
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 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 25.01.2009, 21:32 Titel: Subpixelschnee (mal was zum optimieren für euch :-) ) |
|
|
Es soll folgender maßen laufen:
Schnee fällt von oben. Dabei ist jede schneeflocke in subpixel. also verdreifacht sich die auflösung.
Ich habe hier 2 funktionen die den umgang mit subpixel vereinfachen.
spset(x,y,c) setzt einen subpixel an der position x,y.
spoint(x,y) gibt an ob ein subpixel gesetzt ist und mit welchem wert.
vielleicht kann der eine oder andere die funktionen noch optimieren. ich bin froh das ich das grade noch so mit meinen mathe-kenntnissen hinbekommen hab.
Schaut lustig und vor allem sehr bunt aus
Code: |
sub spset(x as integer,y as integer,c as ubyte)
dim as integer rx,ry = y
dim as ubyte r,g,b
dim oc as uinteger
dim cc as ubyte = (x mod 3)
rx = x \ 3 + iif(cc>0,1,0)
oc = point(rx,ry)
r = oc SHR 16: g = oc SHR 8: b = oc
select case cc
case 1
r = c
case 2
g = c
case 0
b = c
end select
pset(rx,ry), rgb(r,g,b)
end sub
function spoint(x as integer,y as integer) as ubyte
dim as integer rx,ry = y
dim as ubyte r,g,b
dim oc as uinteger
dim cc as ubyte = (x mod 3)
rx = x \ 3 + iif(cc>0,1,0)
oc = point(rx,ry)
r = oc SHR 16: g = oc SHR 8: b = oc
select case cc
case 1
return r
case 2
return g
case 0
return b
end select
end function
dim snow(1 to 1000,1 to 3) as integer
dim snowcount as integer
dim as integer sx,sy
dim t as ubyte
dim in as string
screen 19,32,1
screeninfo sx,sy
line(0,0)-(sx,sy),RGB(255,255,255),B
sx = sx * 3
do
in = inkey
if int(rnd*100) > 50 and snowcount < 1000 then
snowcount = snowcount +1
snow(snowcount,1) = int(rnd*(sx-3))+3
snow(snowcount,2) = 1
end if
screenlock
for i as integer = 1 to snowcount
if snow(i,3) = 4 then snow(i,2) = 2 : snow(i,3) = 0
t = spoint(snow(i,1), snow(i,2) +1)
if t = 0 then
spset(snow(i,1),snow(i,2),0)
snow(i,2) += 1
spset(snow(i,1),snow(i,2),255)
else
t = spoint(snow(i,1)+1, snow(i,2) +1)
if t = 0 then
spset(snow(i,1),snow(i,2),0)
snow(i,2) += 1:snow(i,1) += 1
spset(snow(i,1),snow(i,2),255)
else
t = spoint(snow(i,1)-1, snow(i,2) +1)
if t = 0 then
spset(snow(i,1),snow(i,2),0)
snow(i,2) += 1:snow(i,1) -= 1
spset(snow(i,1),snow(i,2),255)
else
snow(i,3) += 1
end if
end if
end if
next
screenunlock
'screensync
loop until in <> ""
sleep
|
Zuletzt bearbeitet von OneCypher am 25.01.2009, 22:19, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
St_W

Anmeldungsdatum: 22.07.2007 Beiträge: 956 Wohnort: Austria
|
Verfasst am: 25.01.2009, 21:51 Titel: |
|
|
Ist das Absicht, dass am Linken Rand (fast) keine Schneeflocken fallen und diese zuerst in einer schönen Geraden nach rechts ansteigen?
Leider kenne ich mich mit dieser Subpixel-Technik noch nicht so gut aus, dass ich etwas optimieren könnte.
Übrigens Screenshot:
 _________________ Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken) |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 25.01.2009, 22:20 Titel: |
|
|
@ St_W: Sorry, ja habs auch nach ein paar minuten festgestellt das an der ecke was schief läuft. habs korregiert! Da sollte ein weisser kasten drumgemalt werden damit die schneeflocken nicht irgendwo raustropfen..
Hab den Quelltext entsprechend geändert, einfach noch mal probieren!! |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 26.01.2009, 15:05 Titel: |
|
|
sonst keiner eine Idee? |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4703 Wohnort: ~/
|
Verfasst am: 26.01.2009, 15:14 Titel: |
|
|
Mir sagt die ganze Thematik nichts, tut mir leid. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
The_Muh aka Mark Aroni

Anmeldungsdatum: 11.09.2006 Beiträge: 718
|
Verfasst am: 26.01.2009, 17:05 Titel: |
|
|
OneCypher hat Folgendes geschrieben: | sonst keiner eine Idee? |
Doch
Subpixel kannste nicht Weiß machen, das liegt in der Natur der Sache. Ergo kannst du keinen subpixel-schnee fallen lassen, aber du kannst schnee in ganzen pixel fallen lassen und danach in einzelne subpixel zerlegen, um die auflösung der schnee-haufen zu verbessern.
Allerdings besteht immer die gefahr von buten kanten.
/edit:
Und nen sleep 1 im code wäre ganz cool so... _________________ // nicht mehr aktiv // |
|
Nach oben |
|
 |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 27.01.2009, 14:30 Titel: |
|
|
The_Muh hat Folgendes geschrieben: | buten kanten.
|
Häää- "Außenkanten"? Seet wann snackt wi plattdüütsch op QBasic.at ? _________________ Und die Grundgebihr is aa scho drin- DOS is jo nett. |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 27.01.2009, 16:25 Titel: |
|
|
jo, jo dat! aber dat mit den buten und binnen is me he zu weid owen...
me san he in kölle am rinn, do wohd aners jeschwätz... deswejen verstunn isch eusch uch su schläsch!
Su, nu lossma dat sinn und lawern widdo in basic... |
|
Nach oben |
|
 |
The_Muh aka Mark Aroni

Anmeldungsdatum: 11.09.2006 Beiträge: 718
|
Verfasst am: 27.01.2009, 18:57 Titel: |
|
|
Elektronix hat Folgendes geschrieben: | The_Muh hat Folgendes geschrieben: | buten kanten.
|
Häää- "Außenkanten"? Seet wann snackt wi plattdüütsch op QBasic.at ? |
Sry, sollte "Bunte Kanten" heißen.
 _________________ // nicht mehr aktiv // |
|
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.
|
|