Seite 1 von 3

Bild im Uhrzeigersinn aufdecken

Verfasst: 12.08.2009 22:23
von Rubiko
Hallo,

ja, ein etwas verwirrender Titel, aber im Grunde ist die Frage denk ich einfach.
Ob in Strategiespielen wie C&C oder auch in WoW, ihr kennt bestimmt diesen Effekt, wenn etwas nach Benutzung dunkel wird und sich dann wieder im Uhrzeigersinn in einem etwas helleren Ton aufdeckt bis es schließlich wieder wie vorher aussieht.
Die Frage könnte hier besitmmt schon einmal gestellt worden sein, aber mal ehrlich, nach was soll ich suchen?

Wie lässt sich das realisieren? Habe leider keinen blassen Schimmer.

Grüße,
Rubiko

Re: Bild im Uhrzeigersinn aufdecken

Verfasst: 13.08.2009 07:00
von Little John
Rubiko hat geschrieben:Die Frage könnte hier besitmmt schon einmal gestellt worden sein, aber mal ehrlich, nach was soll ich suchen?
Vielleicht nach "Bild aufdecken" oder "Bild umdrehen"? ;-)
Kuck doch mal ob die Suchergebnisse die Du damit bekommst das ist was Du suchst.

Gruß, Little John

Verfasst: 13.08.2009 09:20
von Rubiko
4 Ergebnisse und nur eins möglicherweise relevant...
aber was hat das Umdrehen von Karten oder das Drehen einer Bilddatei mit meiner Frage zu tun? Sorry, aber vielleicht komm ich grade einfach nicht mit?

Es soll ja um ein vorhandenes Bild gehen, dass sich einfach im Uhrzeigersinn 'erhellt'. Ich denke das triffts jetzt am besten.

Verfasst: 13.08.2009 09:33
von NicTheQuick
Soweit ich weiß, gibt es hier im Forum Codes, mit denen man Teilkreise (Piecharts) erstellen
kann. Es müsste Codes mit WinAPI und ohne geben. Ich hab jetzt aber nicht konkret danach
gesucht.
Die Idee wäre allerdings einen Layer mit Alphablending über das zu erhellende Bild zu
setzen. Dabei ist der Layer eben dieser Teilkreis, den du von Zeit zu Zeit eben immer kleiner
machst.
Das Alphablending selbst geht dann ja einfach mittels der Sprite-Library, worüber du auch
einige Beispiele hier finden wirst.

Falls du allerdings die Sprite-Library gar nicht erst nutzen willst, dann gibt es sogar dafür im
Forum Codes, die Images mit Alphablending oder zumindest mit einer einstellbaren
Durchscheinbarkeit darstellen können

Verfasst: 13.08.2009 10:16
von DarkDragon
Hab da mal was gemacht:

Code: Alles auswählen

; http://www.bradan.eu/
; DarkDragon

Procedure rgbClamped(r, g, b)
  If r > 255 : r = 255 : ElseIf r < 0 : r = 0 : EndIf
  If g > 255 : g = 255 : ElseIf g < 0 : g = 0 : EndIf
  If b > 255 : b = 255 : ElseIf b < 0 : b = 0 : EndIf

  ProcedureReturn RGB(r, g, b)
EndProcedure

Procedure doEffect(image, angle.d)
  Protected width
  Protected height
  Protected halfWidth
  Protected halfHeight
  Protected x
  Protected y
  Protected color
  Protected pixelAngle.d

  angle = (angle * #PI) / 180.0

  If IsImage(image)
    width  = ImageWidth(image)
    height = ImageHeight(image)
   
    halfWidth  = width >> 1
    halfHeight = height >> 1

    If StartDrawing(ImageOutput(image))

      For x = -halfWidth To halfWidth - 1
        For y = -halfHeight To halfHeight - 1

          ; Es sei <u, v> : (R²)² --> R : (u, v) |--> u.x1 * v.x1 + u.x2 * v.x2
          ; das Standardskalarprodukt. Dann gilt für den Winkel zwischen den 2 Vektoren:
          ; angle = acos(<a, b> / (|a| * |b|))
          pixelAngle = ACos(y / Sqr(x * x + y * y))
         
          If angle < #PI And x > 0
            If pixelAngle < angle
              color = Point(x + halfWidth, height - (y + halfHeight) - 1)
              color = rgbClamped(Red(color) + 50, Green(color) + 50, Blue(color) + 50)
              Plot(x + halfWidth, height - (y + halfHeight) - 1, color)
            EndIf
          Else
            If x > 0
              color = Point(x + halfWidth, height - (y + halfHeight) - 1)
              color = rgbClamped(Red(color) + 50, Green(color) + 50, Blue(color) + 50)
              Plot(x + halfWidth, height - (y + halfHeight) - 1, color)
            ElseIf pixelAngle < angle - #PI
              color = Point(x + halfWidth, y + halfHeight)
              color = rgbClamped(Red(color) + 50, Green(color) + 50, Blue(color) + 50)
              Plot(x + halfWidth, y + halfHeight, color)
            EndIf
          EndIf

        Next y
      Next x

      StopDrawing()
    EndIf
  EndIf
EndProcedure

Define angle.d
Define lastTime
Define currentTime

If OpenWindow(0, 0, 0, 128, 128, "Test")

  If CreateImage(0, 64, 64)

    If StartDrawing(ImageOutput(0))

      Box(0, 0, 64, 64, RGB(255, 192, 32))
      Circle(32, 32, 32, RGB(128, 128, 192))

      StopDrawing()

      angle = 0.0
      lastTime = ElapsedMilliseconds()

      Repeat

        currentTime = ElapsedMilliseconds()
        angle + (currentTime - lastTime) * 0.1
        lastTime = currentTime

        While angle > 360.0
          angle - 360.0
        Wend

        CopyImage(0, 1)

        If IsImage(1)

          doEffect(1, angle)

          If StartDrawing(WindowOutput(0))
            DrawImage(ImageID(1), 32, 32, 64, 64)
            StopDrawing()
          EndIf

          FreeImage(1)
        EndIf

      Until WindowEvent() = #PB_Event_CloseWindow

    EndIf

  EndIf

EndIf
Vielleicht sollte man noch die inneren Bedingungen nach außen ziehen und das ganze etwas anders organisieren.

Verfasst: 13.08.2009 11:36
von dllfreak2001
NicTheQuick hat geschrieben:Soweit ich weiß, gibt es hier im Forum Codes, mit denen man Teilkreise (Piecharts) erstellen
kann. Es müsste Codes mit WinAPI und ohne geben. Ich hab jetzt aber nicht konkret danach
gesucht.
Die Idee wäre allerdings einen Layer mit Alphablending über das zu erhellende Bild zu
setzen. Dabei ist der Layer eben dieser Teilkreis, den du von Zeit zu Zeit eben immer kleiner
machst.
Das Alphablending selbst geht dann ja einfach mittels der Sprite-Library, worüber du auch
einige Beispiele hier finden wirst.

Falls du allerdings die Sprite-Library gar nicht erst nutzen willst, dann gibt es sogar dafür im
Forum Codes, die Images mit Alphablending oder zumindest mit einer einstellbaren
Durchscheinbarkeit darstellen können
Mir ist nicht bekannt, dass das so einfach mit der Sprite-Lib geht.
Man müsste ein Sprite erstellen welches seinen Alphakanal von einem anderen bekommt.

Man kann ja Sprite3Ds aus PNGs mit eigenem Alphakanal erstellen, die Frage ist ob man diesen dann manipulieren kann.

Verfasst: 13.08.2009 13:04
von Rokur
Du kannst auch ein Sprite mit DisplaySprite() darstellen und die Verdunkelung dann mit DisplayShadowSprite() darüber legen.

Verfasst: 13.08.2009 13:11
von Little John
Rubiko hat geschrieben:aber was hat das Umdrehen von Karten oder das Drehen einer Bilddatei mit meiner Frage zu tun?
Sorry, da habe ich Deine Frage wohl falsch verstanden.

Gruß, Little John

Verfasst: 13.08.2009 13:14
von Fluid Byte
Nimm doch lieber vorgerenderte Bilder. In Echtzeit ist das sowieso kaum zu bewerkstelligen es sei denn das Bild mit dem Alphakanal zum überblenden existiert bereits.

Verfasst: 13.08.2009 13:24
von Thorium
dllfreak2001 hat geschrieben: Mir ist nicht bekannt, dass das so einfach mit der Sprite-Lib geht.
Man müsste ein Sprite erstellen welches seinen Alphakanal von einem anderen bekommt.

Man kann ja Sprite3Ds aus PNGs mit eigenem Alphakanal erstellen, die Frage ist ob man diesen dann manipulieren kann.
Jo geht total simpel. Auch normale Sprites unterstützen den Alphakanal, wenn die Graka das mitmacht (was jede DX9 Karte tun sollte). Die rechnen sowieso intern in ABGR, wenn ich mich jetzt nicht irre. Also ich hab in meinem Projekt aktuell garkeine Probleme mit dem Alphakanal. Habe erst auch PNG's verwendet. Bin aber nun auf ein eigenes Bildformat umgestiegen, wofür ich mir ne eigene Catch bzw. Load Prozedur geschrieben hab. Das ist wie gesagt sehr simpel mit dem Alphakanal.