Bild im Uhrzeigersinn aufdecken

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Rubiko
Beiträge: 943
Registriert: 25.02.2005 19:43
Computerausstattung: Intel i7 2600k
8GB Ram
GeForce GTX 560 Ti
Wohnort: Schwabach

Bild im Uhrzeigersinn aufdecken

Beitrag 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
Ich wollte die Welt verändern, doch Gott gab mir nicht den Quelltext.
Little John

Re: Bild im Uhrzeigersinn aufdecken

Beitrag 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
Benutzeravatar
Rubiko
Beiträge: 943
Registriert: 25.02.2005 19:43
Computerausstattung: Intel i7 2600k
8GB Ram
GeForce GTX 560 Ti
Wohnort: Schwabach

Beitrag 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.
Ich wollte die Welt verändern, doch Gott gab mir nicht den Quelltext.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag 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
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag 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.
Zuletzt geändert von DarkDragon am 13.08.2009 11:50, insgesamt 1-mal geändert.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
dllfreak2001
Beiträge: 2925
Registriert: 07.09.2004 23:44
Wohnort: Bayern

Beitrag 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.
I´a dllfreak2001
Rokur
Beiträge: 167
Registriert: 29.12.2005 09:58
Computerausstattung: Intel Core2 Quad (4x2,4 GHz), 4096 MB RAM, GForce 8800GTX 786 MB
Windows XP 32 Bit, PureBasic 4.40 (x86)

Beitrag von Rokur »

Du kannst auch ein Sprite mit DisplaySprite() darstellen und die Verdunkelung dann mit DisplayShadowSprite() darüber legen.
WinXP 32 Bit, PureBasic 4.40 (x86)
Little John

Beitrag 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
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag 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.
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Beitrag 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.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Antworten