galagher - Mo 07.12.15 19: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 21: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; MoveTo((X + I - 2) * FBlockSize + 1, (Y + J - 2) * FBlockSize + 1); LineTo((X + I - 2) * FBlockSize + 1, (Y + J - 1) * FBlockSize); 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