Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi löcher inner wand (https://www.delphipraxis.net/83439-loecher-inner-wand.html)

Maddin1 2. Jan 2007 21:51


löcher inner wand
 
ich würde gerne einschusslöcher in einer wand (ein image) machen lassen, was muss ich da machen per canvas?

EDatabaseError 2. Jan 2007 21:54

Re: löcher inner wand
 
:? Schon die AGB / Kodex gelesen ;-) Suche benutzen...dann findet man nämlich das:

Delphi-Quellcode:
procedure Circle(Canvas: TCanvas; X, Y, Radius: Word; Color: TColor);
var
  x1, x2, y1, y2, r2, d: integer;
  h: real;
begin
  H := 0.5;
  Y2 := 0;
  d := round((Radius * 3.2) / (SQR(2) + h));
  X2 := Radius * Radius;
  x1 := Radius;
  R2 := X2 + d;
  for y1 := 0 to d do
  begin
    if Y2 + X2 > R2 then
    begin
      X2 := X2 - x1 - x1 + 1;
      x1 := x1 - 1;
    end;
    with Canvas do
    begin
      pixels[X - x1, Y - y1] := Color;
      // ...
    end;
    Y2 := Y2 + y1 + y1 + 1;
  end;
end;
Mit dieser Prozedur kann man z.b. auf das Canvas eines Images einen Kreis zeichen / Einschussloch


Tobi

_frank_ 3. Jan 2007 01:52

Re: löcher inner wand
 
mhm...der code malt bei mir schonmal keinen kreis, sondern nur einen teil einer elipse...warum nicht einfach

Delphi-Quellcode:
procedure Circle(Canvas: TCanvas; X, Y, Radius: Word; Color: TColor);
var
  x1: integer;
begin
  x1:=radius div 2;
  Canvas.Pen.Color:=Color;
  Canvas.Brush.style:=bsClear;
  Canvas.Ellipse(x-radius,y-radius,x+radius,y+radius);
end;
?

besser würde es natürlich aussehen, wenn du dir ein Bild eines Einschusslochs machst und dieses per draw auf die wand kopierst.

HTH Frank

Maddin1 3. Jan 2007 10:45

Re: löcher inner wand
 
Ah dankeschön, das mit dem Kreis werd ich ersteinmal ausprobieren, aber ich saß gestern die ganze Nacht vorm Pc und habs erfolglos versucht, irgendwie tut es mir leid aber wie soll ich das mit dem draw machen? normaler weise lass ich die bmp bilder in der nähe meiner exe weil ich nict weiß wie man diese in eine source datei einbindet. das ist also nun nicht das problem doch wie lade ich nun diese "einschusslöcher"-pics in canvas.draw ein? wenn du mir das noch sagen könntest wäre mir schon sehr geholfen...dankeschön

Hador 3. Jan 2007 11:00

Re: löcher inner wand
 
Hier mal der ungefähre Ablauf, wie du es machen müsstest:
1. Neues TBitmap erstellen (bmp := TBitmap.Create;)
2. Mit LoadFromFile Einschussloch aus der Datei laden (bmp.LoadFromFile(<Dateiname>))
3. Die Bilder jeweils mit draw auf den Zielcanvas kopieren (Canvar.Draw(X, Y, bmp))
4. Am Ende das Bitmap wieder freigeben (bmp.Free)

- Am besten du erstellst das BMP ganz am anfang und zerstörst es bevor dein Prgm. beendet wird.
- Evtl. kannst du dir ja mal Hier im Forum suchenRessourcen angucken. Damit kannst du das Bild dann direkt in dein Prgm. einbinden. Statt LoadFromFile musst du dann lediglich LoadFromRessource verwenden.
- Bei der Syntax von Draw bin ich mir nicht 100%ig sicher. Evtl. musst du die Parameterreihenfolge vertauschen.

Maddin1 3. Jan 2007 11:04

Re: löcher inner wand
 
vielen dank! das es nich aus einer ressource geladen wird ist denke ich nicht all zu schlimm, ich werde das dann auch alles ersteinmal ausprobieren, dankeschön nochmal^^

Maddin1 3. Jan 2007 14:30

ja ich bins nochmal, habe das mit den löchern hinbekommen aber
1. lassen sie sich durch andere images wegwischen
2. habe ich das programm auf einen anderen rechner geöffnet und dort sind die löcher völlig verschoben, ich habe deren koordinaten bei mir auf dem pc mit x-y der mouse.cursorpos und um das genau zu positionieren noch bei x - 34 genommen!
also im klartext Canvas.Draw(X-34, Y, bmp)

bei mir auf dem pc ist jetz ja genau aber auf anderen nicht

Hador 3. Jan 2007 17:19

Re: löcher inner wand
 
Zu deinem ersten Problem:

Wenn du ein Bitmap über ein anderes Kopierst, siehst du das andere logischerwese nicht mehr. Um zu erreichen, dass das Loch von den (vmtl. weißen) Rändern nicht verdeckt wird müsstest du nur Teile des Bildes kopieren.
Das musst du entweder von Hand machen oder dir eine eine entsprechende Komponente suchen. Afaik kann das bspw. die PNG-Lib.

Zu 2:

Vermutlich ermittelst du die "globale" mausposition und nicht die des Formulars. Entweder müsstest du, wenn du mit Mouse.CursorPos... den Anstand des Formulars vom Bildschirmrand (evtl. einen 2. Bildschirm beachten) von der Cursorposition subtrahieren oder du ermittelst direkt die Mausposition vom Formularrand aus gesehen, mit den werden, die in den OnMouseMove, OnMouseDown und OnMouseUp-Ereignissen übergeben werden.

Maddin1 4. Jan 2007 13:21

Also wegen der cursor position also im 2. punkt, weiß ich jetz das die auflösung des bildschirmes auf 1280x1024 gesetzt werden muss damit es nicht mehr verschoben ist.
und zum anderen ist das so das ich ja bewegliche images (als feinde) in meiner form habe und wenn diese hinter oder vor die Wand (mit den Löchern kommen) dann verschwinden die löcher. Dies wäre eigentlich noch das einzige problem neben der auflösung.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:44 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz