TileImageRect

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

Kabelbinder

Sieger des WM-Contest 2006

Betreff: TileImageRect

BeitragMi, Okt 04, 2006 16:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier eine Funktion, die ich für den Mapeditor von Wing Avenger geschrieben habe. Sie zeichnet ein Quadrat auf dem Bildschirm, dass mit einem bestimmten Bild ausgefüllt ist.

Also soähnlich, wie DrawImageRect, nur dass man bei TileImageRect auch über die Grenzen des Bildes hinaus gehen kann.

Code: [AUSKLAPPEN]
AppTitle "TileImageRect"
Graphics 640,480,16,2
SeedRnd MilliSecs()

Global bild

Function uter(a1,a2,opera$)
Select opera
Case "kleiner"
If a1<=a2 Then
Return a1
Else
Return a2
EndIf

Case "größer"
If a1>=a2 Then
Return a1
Else
Return a2
EndIf
End Select
End Function

Function TileImageRect(img,cx,cy,br,ho)
imbr = ImageWidth(img)
imho = ImageHeight(img)

For x = 0 To Floor(br/imbr)-1
For y = 0 To Floor(ho/imho)-1
DrawImage img,cx+x*imbr,cy+y*imho
Next
Next

For x = 0 To Floor(br/imbr)-1
DrawImageRect img,cx+x*imbr,cy+Floor(ho/imho)*imho,0,0,imbr,ho Mod imho
Next
For y = 0 To Floor(ho/imho)-1
DrawImageRect img,cx+Floor(br/imbr)*imbr,cy+y*imho,0,0,br Mod imbr,imho
Next
DrawImageRect img,cx+Floor(br/imbr)*imbr,cy+Floor(ho/imho)*imho,0,0,br Mod imbr,ho Mod imho
End Function

bild = CreateImage(100,50)
Function neubild()
SetBuffer ImageBuffer(bild)
For i = -50 To 100 Step 2
Color Rand(10)*25,Rand(10)*25,Rand(10)*25
Line i,0,i+50,50
Next
SetBuffer BackBuffer()
End Function

SetBuffer BackBuffer()
Repeat
mx = MouseX()
my = MouseY()

If MouseHit(1) = 1 Then
If fix = 0 Then
fix = 1
fixpunktx = mx
fixpunkty = my
neubild()
EndIf
EndIf
If MouseDown(1)=0 Then fix = 0

If fix = 1 Then TileImageRect(bild,uter(mx,fixpunktx,"kleiner"),uter(my,fixpunkty,"kleiner"),Abs(fixpunktx-mx),Abs(fixpunkty-my))

Flip
Cls
Until KeyHit(1)
End


(Die Function braucht die beiliegende Funktion uter() nicht als Unterfunktion. Die wird nur hier im Hauptprogramm verwendet)
<Wing Avenger Download> ◊◊◊ <Macrophage Download>
 

Ava

Gast

BeitragMi, Okt 04, 2006 17:03
Antworten mit Zitat
Womöglich habe ich da jetzt etwas entscheidenes übersehen - aber ist es nicht eigentlich sehr viel unkomplizierter, wenn man einfach ein TileImage in einen Viewport zeichnet?

Hat Deine Lösung einen grösseren Geschwindigkeitsvorteil? Smile

+ Ava +

Kabelbinder

Sieger des WM-Contest 2006

BeitragMi, Okt 04, 2006 18:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi

Hm.. darauf bin ich garnicht gekommen.
Wusste nicht, dass das auch geht Smile .

Die Geschwindigkeit hab ich eben einfach mal getestet. Meine Funktion war bei 10000 ausgegebenen Rects 2 Millisekunden schneller Laughing .
(Viewport 1586 ms, TileImageRect 1548 ms). Wechselt sich aber auch von mal zu mal ab.
<Wing Avenger Download> ◊◊◊ <Macrophage Download>

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group