Entwickler-Ecke

Multimedia / Grafik - Tetris-Komponente - 3D-Effekt zeichen, aber wie?


galagher - Mo 07.12.15 20:41
Titel: Tetris-Komponente - 3D-Effekt zeichen, aber wie?
Hallo!

Zuerst: Der Code stammt nicht von mir, aber der Autor erlaubt es, seinen Code zu verändern. Also habe ich mir vorgenommen, den Figuren einen 3D-Look zu verpassen. Leider scheitere ich da kläglich: Alles, was ich mit LineTo und MoveTo erhalte, sind Linien, die sich langsam, Pixel für Pixel nach unten bewegen, noch dazu auf dem Hintergrund, ausserhalb der Figur und dabei zu einem Balken werden!

Wie muss ich den folgenden Code abändern, um ein Ergebnis wie in der rechten Hälfte von Grafik Tetris.jpg zu erhalten? Könntet ihr mir da helfen?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
procedure TKozyTetris.DrawPieceTo(Canvas: TCanvas; X, Y: Integer; Piece: TPiece; Erase: Boolean);
var R: TRect;
  I, J: Integer;
  P: TPiece;
begin
  if not Assigned(Piece) then
    Exit;

  P := Piece;

  for I := 1 to P.PieceSize do
    for J := 1 to P.PieceSize do
      if P.Matrix[I, J] then
        begin
          R := Rect(
            (X + I - 2) * FBlockSize + 1,
            (Y + J - 2) * FBlockSize + 1,
            (X + I - 1) * FBlockSize,
            (Y + J - 1) * FBlockSize);

          with Canvas do
            begin
              if Erase then
                Brush.Color := FColor else
                Brush.Color := P.PieceColor;

              FillRect(R);
            end;
        end;
end;


ub60 - Mo 07.12.15 22:17

Nur mal so als Ideen-Anschub (zeichnet links oben einen grauen Schatten):


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
  with Canvas do
    begin
      Brush.Color := clRed;
      FillRect(R);
      Pen.Color:=clSilver;
      // senkrechte Linie
      MoveTo((X + I - 2) * FBlockSize + 1, (Y + J - 2) * FBlockSize + 1);
      LineTo((X + I - 2) * FBlockSize + 1, (Y + J - 1) * FBlockSize);
      // waagerechte Linie
      MoveTo((X + I - 2) * FBlockSize + 1, (Y + J - 2) * FBlockSize + 1);
      LineTo((X + I - 1) * FBlockSize, (Y + J - 2) * FBlockSize + 1);
    end;

Etwas professioneller könnte man statt clSilver die Piece-Farbe nehmen, in RGB zerlegen, diese Anteile (prozentual) etwas verringern (dunkler) oder erhöhen (heller) und dann wieder zu einer Farbe zusammensetzen.

ub60


galagher - Di 08.12.15 10:05

user profile iconub60 hat folgendes geschrieben Zum zitierten Posting springen:
Etwas professioneller könnte man statt clSilver die Piece-Farbe nehmen, in RGB zerlegen, diese Anteile (prozentual) etwas verringern (dunkler) oder erhöhen (heller) und dann wieder zu einer Farbe zusammensetzen.

Ist alles bereits umgesetzt und sieht sehr gut aus!