Thema: Delphi Andorra 2D und Frage

Einzelnen Beitrag anzeigen

Sphinx2k

Registriert seit: 13. Mai 2009
6 Beiträge
 
#4

Re: Andorra 2D und Frage

  Alt 14. Mai 2009, 22:12
Ok nach einigem rumprobieren und noch mal Dokumentation schmöckern hab ich es jetzt zumindest in nem kleinen Testaufbau zum Funktionieren bekommen. Der Trick war für mich zu Kapieren das eine Surface auch wie eine Textur verwendet werden kann.

EDIT
Hab es jetzt in meinem Programm so umgesetzt und es Funktioniert wie gehofft bis auf einen Punkt der mit sicherheit nur eine Einstellungsfrage ist.
Jemand der als Admin Autorisiert ist soll natürlich alles sehen können was auf dem Zeichenbereich liegt, muss aber natürlich wissen was die normalen Benutzer sehen und was nicht.
Bis jetzt war es so das ich beim Admin einfach das ganze Halbtransparent gemacht hab, und eben 100% Transparent dort wo alle etwas sehen können. Das möchte ich jetzt wieder erreichen.
Wie müsste ich den unten stehenden Code ändern damit alles was "nicht sichtbar" ist halbtransparent wird und alles was sichtbar ist 100% transparent?
Ich vermute mal das es hiermit zusammen hängt SetStencilOptions(0, $FFFF, asfLessThan); Oder doch ganz wo anders.
Vieleicht hat ja noch jemand eine idee oder einen Tipp.
EDIT

Hier mal der komplette code aus meinem Test Programm vieleicht hab ich ja immer noch etwas zu Kompliziert, aber wenn nicht hilft es vieleicht jemand anderem der so ein Problem hat wie ich.

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, AdDraws, AdClasses, AdTypes, ExtCtrls;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    AdDraw:TAdDraw;
    AdSurf1, AdSurf2: TAdTextureSurface;
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  AdDraw := TAdDraw.Create(Panel1);
  AdDraw.DllName := 'AndorraDX93D.dll';
  if AdDraw.Initialize then
  begin
    AdSurf1:=TAdTextureSurface.Create(AdDraw);
    AdSurf1.SetSize(256,256);

    AdSurf2:=TAdTextureSurface.Create(AdDraw);
    AdSurf2.SetSize(256,256);

  end
  else
  begin
    ShowMessage(AdDraw.GetLastError);
    halt;
  end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  AdDraw.Free;
  AdSurf1.Free;
  AdSurf2.Free;
end;


procedure TForm1.Timer1Timer(Sender: TObject);
begin

if AdDraw.CanDraw then
begin
  AdDraw.ClearSurface(clBlack);

  AdDraw.BeginScene;
 
  //Die Zeichenfläche an sich auf der sich die Grafik hinter der Maske befindet
  if AdSurf1.CanDraw then begin
    AdSurf1.ClearSurface(Ad_ARGB(255,255,255,255));
    with AdSurf1.Canvas do begin
      Pen.Color:=Ad_ARGB(255,0,0,255);
      Brush.Color:=Ad_ARGB(255,0,0,255);
      Ellipse(10,10,30,30);
      Circle (70,70,50);
      Release;
    end;
  end;

  // Das ist meine "Lochmaske" die vor dem Bild steht
  if AdSurf2.CanDraw then begin
    AdSurf2.ClearSurface(Ad_ARGB(0,255,255,255));
    with AdSurf2.Canvas do begin
      Pen.Color:=Ad_ARGB(255,0,0,0);
      Brush.Color:=Ad_ARGB(255,0,0,0);
      Rectangle(20,20,60,60);
      Rectangle(60,65,65,195);
      Release;
    end;
  end;

  //Enable stencil buffer and alpha masking
  AdDraw.Options := AdDraw.Options + [aoStencilBuffer, aoAlphaMask];

   //Increment the stencil buffer value for a pixel, if a pixel is set there
  AdDraw.AdAppl.SetStencilOptions(0, $FFFF, asfAlways);
  AdDraw.AdAppl.SetStencilEvent(asePass, asoIncrement);

  AdSurf2.Image.Draw(AdDraw,0,0,0);

  //Only draw a pixel, if the stencil value is larger than zero
  AdDraw.AdAppl.SetStencilOptions(0, $FFFF, asfLessThan);
  AdDraw.AdAppl.SetStencilEvent(asePass, asoKeep);
  AdDraw.Options := AdDraw.Options - [aoAlphaMask];

  AdSurf1.Image.DrawEx(AdDraw, AdRect(0, 0, 256, 256), AdRect(0, 0, 256, 256), 0, 0, 0, 255, bmAlpha);


  AdDraw.Options := AdDraw.Options - [aoStencilBuffer];

  AdDraw.EndScene;
  AdDraw.Flip;
end;

end;

end.
  Mit Zitat antworten Zitat