Transparenz-Funktion funktioniert nicht korrekt - Abhilfe?

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

RollingStone

Betreff: Transparenz-Funktion funktioniert nicht korrekt - Abhilfe?

BeitragMo, Okt 05, 2009 20:17
Antworten mit Zitat
Benutzer-Profile anzeigen
hi!

folgendes:

BlitzBasic: [AUSKLAPPEN]

Bild = LoadImage ("optionen.bmp")
MaskImage Bild, 0, 0, 0
DrawImage Bild, 100, 100


die hintergrundfarbe von dem optionen.bmp - bild ist also 0 0 0 - schwarz. diese soll transparent werden.

hier noch das bild:
http://img53.imageshack.us/img53/3551/optionen.png
(hier steht jetzt .png ... das liegt daran, dass ich inzwischen alle möglichen endungen ausprobiert habe...)

wenn ich jetzt in meinem bb-programm eine normale hintergrundfarbe hätte (also zb 0 0 0 - schwarz), könnte ich ja ohne probleme auf diese transparenzfunktionen verzichten.
ich habe allerdings ein großes hintergrundbild im programm drin, deswegen bin ich wohl darauf angewiesen.

wenn ich jetzt den oben genannten code ausführe, werden lange nicht alle schwarzen pixel transparent, sondern nur ein paar. in den buchstaben-zwischenräumen und kurz davor sind überall noch schwarze pixel!

wer hat eine idee?

grüße
und
danke

RS

BladeRunner

Moderator

BeitragMo, Okt 05, 2009 20:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Du hattest es mal als jpg gespeichert, was nicht verlustfrei ist und Artefakte macht ODER Du hast beim Einzeichnen des Wortes Optionen Antialiasing aktiviert gehabt, was Pixel mit Werten nache 0,0,0 erstellt aber nicht genau 0,0,0.
So oder so musst Du Deine Grafik neu erstellen.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Xeres

Moderator

BeitragMo, Okt 05, 2009 20:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich (besser: IrfanView) zählt 17 Farben - auch kein Wunder bei dem Antialias. So wird das so oder so nichts werden, da Blitz nur exakt eine Farbe transparent macht.
Ich würde dir empfehlen die Draw3D von Hectic zu verwenden.

Alternativ von Anfang an in einem Verlustfreien Format abspeichern und harte Kanten in kauf nehmen.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

RollingStone

BeitragMo, Okt 05, 2009 21:11
Antworten mit Zitat
Benutzer-Profile anzeigen
danke euch beiden!
das war's!

RollingStone

BeitragMo, Okt 05, 2009 23:02
Antworten mit Zitat
Benutzer-Profile anzeigen
noch was dazu:

diese bilder, mit transparenz an den rändern, fungieren jetzt als buttons. außerdem bin ich gerade dabei, einen eigenen mauszeiger zu erstellen. (hidepointer)

die pixelgenaue kollisionsabfrage funktioniert auch gut, und zwar so:
BlitzBasic: [AUSKLAPPEN]

MaskImage spitze, 255, 108, 0
DrawImage spitze, MouseX(), MouseY()

If ImagesCollide (spitze, MouseX(), MouseY(), 0, Bild, 250, 250, 0) Then
End If


"spitze" ist also eine 1x1 pixel große schwarze grafik, die es möglich machen soll, dass die bedingung eben nur eintritt, wenn man mit diesem einen pixel, also der eigentlichen mausspitze, über dem button ist.
diese spitze würde ich jetzt gerne transparent machen, dann funktioniert ja allerdings die imagescollide-funktion nicht mehr.

ich könnte höchstens die zweite grafik, also die eigentliche mauszeiger-grafik, über den punkt drüberzeichnen, sodass man diesen nicht mehr sieht.

gibt es auch die möglichkeit, das nur mit der eigentlichen mauszeiger-grafik zu schaffen, ohne dass extra diese spitzen-grafik benötigt wird? oder wie würdet ihr das bewerkstelligen?

danke und gruß
RS

Xeres

Moderator

BeitragDi, Okt 06, 2009 0:10
Antworten mit Zitat
Benutzer-Profile anzeigen
ImagesCollide ist verbugt (näheres hier) - aber zum Problem: Schreib dir eine Funktion, die überprüft, ob die Mauskoordinaten sich in dem Rechteck befinden die das Bild einnehmen. Das ist nicht Pixelgenau aber schnell und einfach.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Nicdel

BeitragDi, Okt 06, 2009 14:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Du kannst also auch RectsOverlap verwenden Wink
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7

RollingStone

BeitragDi, Okt 06, 2009 16:33
Antworten mit Zitat
Benutzer-Profile anzeigen
gesagt, getan. habe das problem jetzt mit rectsoverlap gelöst.

BladeRunner

Moderator

BeitragMi, Okt 07, 2009 12:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Nebenbei hättest Du zum überprüfen der Kollision den Punkt nicht müssen einzeichnen. Dem Befehl reicht die Bitmap, sie muss nicht gezeichnet werden.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

DjDETE

BeitragMi, Okt 07, 2009 13:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Um nur einen Punkt auf die Überlagerung zu überprüfen ist RectsOverlap unnötig. Ich würde dir zu Xeres' Vorschlag raten, so habe ich es in Menüs, etc. bis jetzt auch immer einwandfrei lösen können.
MfG
Aktuelles Projekt: XXX |XXX | 3% der v1b fertig
www.emu-soft.de.vu Für die Homepage suche ich noch Linktauschpartner, bei Interesse einfach melden.

RollingStone

BeitragMi, Okt 07, 2009 18:32
Antworten mit Zitat
Benutzer-Profile anzeigen
ok. habe es jetzt mal so versucht wie ihr gesagt habt. funktioniert auch.

neues problem:

BlitzBasic: [AUSKLAPPEN]

Graphics 240, 240, 32, 2
SetBuffer BackBuffer()

aktiv = 0

Function aktivieren(x, y, breite, hoehe)
If MouseX() >= x And MouseX() <= x + breite And MouseY() >= y And MouseY() <= y + hoehe And MouseDown(1) Then
Return True
End If
End Function

textfeld = LoadImage("textfeld.bmp")
textfeld_aktiv = LoadImage("textfeld_aktiv.bmp")

Repeat
Cls

If aktivieren(20, 20, 200, 50) Then
If aktiv = 0 Then
aktiv = 1
ElseIf aktiv = 1 Then
aktiv = 0
End If
End If

If aktiv = 1 Then
DrawImage (textfeld_aktiv, 20, 20)
Else
DrawImage (textfeld, 20, 20)
End If

Flip

Until KeyDown(1)
End


immer wenn ich auf den button klicke, soll ja die button-grafik geändert werden. doch leider funktioniert das nur sehr unsauber bzw. unregelmäßig, was wohl daran liegt, dass die bedingung einfach immer noch erfüllt ist, wenn die schleife wiederholt durchläuft. daher wohl das flackern.

wie mache ich das besser?

Nicdel

BeitragMi, Okt 07, 2009 18:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Also dazu:

Code: [AUSKLAPPEN]
If aktiv = 0 Then
aktiv = 1
ElseIf aktiv = 1 Then
aktiv = 0
End If


fällt mir folgendes ein:

Code: [AUSKLAPPEN]
aktiv = 1-aktiv


Edit: MouseHit statt MouseDown könnte das Problem lösen.
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7
  • Zuletzt bearbeitet von Nicdel am Mi, Okt 07, 2009 18:45, insgesamt einmal bearbeitet

ComNik

BeitragMi, Okt 07, 2009 18:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]

Global mh1
Global mx
Global my

Main Loop:

mh1 = MouseHit(1)
mx = MouseX()
my = MouseY()

If mh1 ; = True ist aber unnötig
    If mx > button\x And my > button\y
        If mx < button\x + button\width And my < button\y + button\height
            button\state = 1 ; Geklickt
        Else
            button\state = 0
        End If
    Else
        button\state = 0
    End If
End If


Erstmal auf MouseHit(1) überprüfen. Das spart in 90% der Fälle die beiden If abfragen für die Koordinaten. Da das ja nur fällig ist, falls geklickt wurde.

Die Variable mh1 ist nötig, um einen beliebten "Bug" mit der MouseHit() Funktion zu umgehen.

lg
ComNik
WIP: Vorx.Engine

RollingStone

BeitragMo, Nov 02, 2009 18:26
Antworten mit Zitat
Benutzer-Profile anzeigen
auch wenn es jetzt schon einige tage her ist. danke an euch beide!

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group