Schwarz und Farbe

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

Megamag

Betreff: Schwarz und Farbe

BeitragDo, Jan 31, 2008 18:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi, Community!
Wir hatten uns ein kleines Projekt vorgenommen. Es soll z.B.
Eine grün-gelb gestreifte Fläche sein, auf der man rumlaufen
kann. Diese Fläche soll aber schwarz-weiß (mit Graustufen)
sein. Und wenn man eine Taste drückt (z.B. "D") soll ein Tropfen
fallen, da, wo der Player steht, und da, wo der Tropfen auf die
Grau-schwarz-weiße Fläche trifft, soll wieder die eigentliche
Farbe sein. Also ein Tropfen, der die Farbe auf seinem Aufschlagspunkt
wieder herstellt. Wie macht man das? Mit Alpha-Textur, mit
Brushes, mit Multitextur? Kann mir das bitte jemand erklären?

Danke!

EDIT: Etwa so:
user posted image

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Jan 31, 2008 19:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Über 3D würde ich es wie folgt machen:

- Zwei Texturen erstellen. Einmal Schwarz/Weiß und einmal Farbig
- Die Farbige Textur bekommt allerdings Alpha komplett 0 ausgelegt
- Die Farbige Textur wird über der Schwarz/Weiß -Textur gezeichnet
- An gewünschten Stellen einfach die Alpha auf Maxmimum oder Wunsch einstellen.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Megamag

BeitragDo, Jan 31, 2008 20:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Und wie kann man ALpha an bestimmten stellen einstellen?
 

Dreamora

BeitragDo, Jan 31, 2008 20:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Alpha ist ein teil des farbwertes -> farbe bei den entsprechenden Pixeln ändern.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Megamag

BeitragDo, Jan 31, 2008 21:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay, aber wie?
Oder mit welchem Befehl?

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Jan 31, 2008 21:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Siehe dazu:

ql:WritePixelFast
ql:TextureBuffer
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Megamag

BeitragFr, Feb 01, 2008 14:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Ähm, dann muss ich der Textur einen Buffer zuweisen
und die Pixel ändern? Ich versteh' aber immer noch nicht,
wie, denn bei WritePixel fehlt die Z-Koordinate...

kriD

BeitragFr, Feb 01, 2008 14:37
Antworten mit Zitat
Benutzer-Profile anzeigen
is doch nich schlimm, oder?
es gibt ja nich NUR 3D Wink

ich würds wie folgt machen (2D):

-du hast 2 Bilder:eins mit Farbe und eins mit Graustufen
-du malst erst das bunte Bild und darüber das Graustufenbild
-nun sieht man das bunte Bild nichtmehr
-überall dort, wo man es sehen soll zeichnest du im Imagebuffer des grauen Bildes die Tranzparenzfarbe ein (mit writepixel,oder rect oder oval ....)
-an den transparenten Stellen scheint das bunte Bild nun durch

Nachteil:es sind keine Alphawerte möglich, also ganz oder garnicht durchscheinend

MfG kriD
Wenn ich du wäre, wäre ich lieber ich!

Megamag

BeitragFr, Feb 01, 2008 14:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
es gibt ja nich NUR 3D

Es ist aber für ein 3D Spiel. Rolling Eyes
 

Dreamora

BeitragFr, Feb 01, 2008 15:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Wieso solltest du genau eine z koordinate brauchen?
Texturen sind 2D nicht 3D, insofern brauchst du nur X und Y und setzt dort den 4 Farben (ARGB) wert.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Megamag

BeitragFr, Feb 01, 2008 15:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Warum geht dieser Code nicht?
Es wird nur ein weißer Kreis gezeichnet.
Wie kriege ich den jetzt transparent?
Code: [AUSKLAPPEN]
Graphics3D 640,480,0,2
SetBuffer BackBuffer()
camera=CreateCamera()
light=CreateLight(1)
RotateEntity light,90,0,0

cube=CreateCube()
PositionEntity cube,0,0,5
RotateEntity cube,30,30,30

texture1=LoadTexture("texturbunt.bmp")


texture2=LoadTexture("textur.bmp")
SetBuffer TextureBuffer(texture2)
Oval 30,30,200,200
SetBuffer BackBuffer()

EntityTexture cube,texture1,0,0
EntityTexture cube,texture2,0,0

While Not KeyHit(1)
TurnEntity cube,1,1,1
RenderWorld
Flip
Wend
End
 

Dreamora

BeitragFr, Feb 01, 2008 15:43
Antworten mit Zitat
Benutzer-Profile anzeigen
garnicht.
Du kannst nicht die Draw Befehle nutzen.

Wurde oben doch gesagt -> WritePixel(Fast), SetBuffer und LockBuffer
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Silver_Knee

BeitragFr, Feb 01, 2008 15:55
Antworten mit Zitat
Benutzer-Profile anzeigen
weil du ja mit oval nur einen weißen kreis zeichnest^^

Schrittweise zum abhacken:

1) Die Schwarz-Weiß-Textur liegt unten, die bunte via Multitexturing drüber.

2) Die bunte Textur, die Alpha Informationen haben soll, muss ins PNG-Format (BMP kennt kein Alpha und JPG verursacht Pixelfehler). Zusätzlich machst du mit 'nem "gescheiten" Grafikprogramm (zB GIMP) einen Alphakanal auf(damit Alpha-Werte gespeichert werden können) und danach alles markieren und Deck-Kraft auf 0%. Dann sind die Farben zwar alle da, aber unsichtbar.

3) Nun erst gehts an den Code. Da muss bei LoadTexture der Alpha-wird-beachtet-Flag an (ich glaube das war 2). Und nun kannst du dir die Werte pixelweise aus der Bunten immer mit ReadPixelFast auslesen und sie mit nem Alpha wert von $FF000000 wieder WritePixelFast-mäßig reinmalen. Die Zeile geb ich dir mal
Code: [AUSKLAPPEN]
WritePixelFast x,y,$FF000000 OR ReadPixelFast(x,y);Das OR überschreibt Werte auf True, wo True steht und lässt werte wie sie sind bei False. FF am Anfang überschreibt den Alpha-Wert auf 100% die anderen 00en belassen die rgb-Werte wie sie sind.

Nicht vergessen: Buffer Locken ( Arrow Lockbuffer)

2late -.-

Megamag

BeitragFr, Feb 01, 2008 16:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Das geht aber immer noch nicht.
Ich habe keine Ahnung, wie das gehen soll. Crying or Very sad
Code: [AUSKLAPPEN]
Graphics3D 640,480,0,2
SetBuffer BackBuffer()
camera=CreateCamera()
light=CreateLight(1)
RotateEntity light,90,0,0

cube=CreateCube()
PositionEntity cube,0,0,5
RotateEntity cube,30,30,30

texture1=LoadTexture("texturbunt.png")


texture2=LoadTexture("textur.bmp")
SetBuffer TextureBuffer(texture2)

LockBuffer TextureBuffer(texture2)
WritePixelFast x,y,$FF000000 Or ReadPixelFast(x,y)
UnlockBuffer TextureBuffer(texture2)


SetBuffer BackBuffer()

EntityTexture cube,texture1,0,0
EntityTexture cube,texture2,0,0

While Not KeyHit(1)
TurnEntity cube,1,1,1
RenderWorld
Flip
Wend
End
 

Dreamora

BeitragFr, Feb 01, 2008 16:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Und was geht nicht? du zeichnest da nur einen pixel, könnte also schwer sein irgendwas zu sehen Smile
aber was das "or readpixelfast" soll rall ich net, das ist totaller blödsinn.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Megamag

BeitragFr, Feb 01, 2008 17:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Kannst du den Code richtig machen?
Ich habe keine Ahnung, wie.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragFr, Feb 01, 2008 17:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Code funktioniert soweit, den Rest solltest du schon hingriegen:

Code: [AUSKLAPPEN]
Graphics3D 512,512,0,2
SetBuffer BackBuffer()

Local Timer=CreateTimer(100)
Local Camera=CreateCamera()
Local TextureSW=LoadTexture("imageSW.png",1)
Local TextureFarbe=LoadTexture("imageFa.png",2)
Local Sprite=CreateSprite()

Local TX=TextureWidth(TextureSW)
Local TY=TextureHeight(TextureSW)
Local X,Y,ARGB,MX,MY

EntityTexture Sprite,TextureSW
PositionEntity Camera,0,0,-1
SpriteViewMode Sprite,2
EntityFX Sprite,1+2+8
CameraClsColor Camera,96,64,64




While Not KeyHit(1)
   
   MX=MouseX()
   MY=MouseY()
   
   If MouseDown(1) Then
      For Y=-19 To 19
         For X=-19 To 19
            ARGB=ReadPixel(MX+X,MY+Y,TextureBuffer(TextureFarbe))
            WritePixel MX+X,MY+Y,$FF000000+(ARGB And $00FFFFFF),TextureBuffer(TextureSW)
         Next
      Next
   End If
   
   WaitTimer(Timer)
   RenderWorld
   Flip 0
Wend
End


edit1: Der Ansatz ist im übrigen aus dem Gespräch vorher etwas verändert wordn.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Megamag

BeitragFr, Feb 01, 2008 17:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke, Hectic!
Dann gibt's da noch was.
Kann man WritePixelFast auch mit Alpha-Wert verwenden?
 

Dreamora

BeitragFr, Feb 01, 2008 17:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Da sind automatisch immer alphawerte drin.
Der Int der da geschrieben wird, enthält ARGB -> Alpha Rot Grün Blau
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Megamag

BeitragFr, Feb 01, 2008 18:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, aber ich meine so halbtransparent. Aber
ich glaube, dass das nicht geht...
Ach so, es gibt noch ein großes Problem:
Ich habe euch ja erzählt, dass man auf einer (3D) Fläche
herumlaufen kann, und bei Tastendruck Farbe gemacht wird.
Tja, eine große Fläche (oder auch Terrains) kann man nicht
mit einer Mega-Textur belegen. Da müssen kleine Texturen immer
wieder wiederholt werden. Aber der Code von Hectic zeichnet
auf EINER Textur, was auch richtig wäre, aber da es auf
einem Terrain ja immer dieselbe Textur ist, wird Farbe auch auf
jeder einzelnen Textur gezeichnet, und nicht nur da, wo der
Player steht. Wie macht man denn das?

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group