Entwickler-Ecke

Multimedia / Grafik - Canvas Größe ändern


mg4all - Mi 29.12.10 08:27
Titel: Canvas Größe ändern
Hallo Leute !

Habe wieder mal eine grundlegende Frage :

In meinem Spiel werden Figuren auf einem TImage plaziert (wenn die Farbe <> clfuchsia ist). Alles kein Problem, wenn sich aber die Bildschirmauflösung ändert und ich TImage.strech = true; gesetzt habe bleibt meine Figur auf der gleichen Höhe stecken, kann mir jemand sagen wo das Problem liegt ?

Hier noch ein bischen Quelltext :


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm3.raupesetzen;
for i := 0 to 5000 do
 if spielfeld.Canvas.Pixels[image1.left,i] <> clfuchsia then
 begin
  image1.Top := i - image1.Height;
  break;
 end;
end;
:?: :?: :?: :?: :?: :?: :?: :?:

Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt
Moderiert von user profile iconMartok: Topic aus VCL (Visual Component Library) verschoben am Mi 29.12.2010 um 16:04


JDKDelphi - Mi 29.12.10 09:07

Hallo,

ich hatte mal so gelöst:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure TAXBitmap.RefreshAX;
var abmp : TBITMAP;
   x,y : integer;
begin
  x := width;
  y := height;
  image1.Width := x;
  image1.Height:= y;
  fgui.USR_WINDOW(0,x,0,y);
  fgui.USR_SCALE(-1,flength,fwidth,-1);
  //------ Größe ändern
  abmp := tbitmap.Create;
  abmp.Height := image1.Height;
  abmp.Width  := image1.Width;
  image1.Picture.Bitmap := abmp;
  abmp.Free;
  fgui.Move_2D(0,0,image1.Canvas);
end;

//fGui. xxxx   // eigene GUI-Verwaltung
// ab abmp   wirds interessant




Gruß


bummi - Mi 29.12.10 09:28

Du greifst per Canvas.Pixels immer auf das zugrundeliegende Bitmap zu, nicht auf die Darstellung.
Wenn Du z.B. ein BMP mit 100*100 Punkten hast und auf 200*200 Strechet, greift Du schon mit Pixels[100,100] in einen ungültigen Bereich.
Da das ganze nach Animation klingt, vielleicht kannst Du das brauchen:
http://www.delphipraxis.net/156716-grafiken-sehr-einfach-animieren-sprites-mit-drehung-und-zoom.html


mg4all - Fr 31.12.10 00:59

:D Danke für die Antworten :D

Ich habe das Problem jetzt so gelöst :


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure TForm3.spielfeldwandeln;
var tmpbmp: TBitmap;
    rechteck: TRect;
begin
rechteck.Left := 0;
rechteck.Top := 0;
rechteck.Right := form3.ClientWidth;
rechteck.Bottom := form3.ClientHeight;
tmpbmp := TBitmap.Create;
tmpbmp.Width := form3.ClientWidth;
tmpbmp.Height := form3.ClientHeight;
tmpbmp.Canvas.StretchDraw(rechteck,spielfeld.Picture.Graphic);
BitBlt(spielfeld.Canvas.Handle,0,0,screen.Width,screen.Height,tmpbmp.Canvas.Handle, 00, SRCCOPY);
spielfeld.Picture := nil;
spielfeld.Picture.Bitmap := tmpbmp;
tmpbmp.Free;
end;

Und hiermit hatte ich Erfolg:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm3.raupesetzen;
begin
image1.Left := 5;
for i := 1 to 5000 do
 if spielfeld.Canvas.Pixels[image1.left,i] <> clfuchsia then
 begin
  image1.Top := i - image1.Height;
  break;
 end;
end;


Wenn Jemand eine andere Lösung hat die schneller ist, bitte Posten :!: :!: :!:


platzwart - Fr 31.12.10 01:34

Benutz die graphics32. Das ist eine Sammlung von Komponenten für Grafik (Image, Paintbox, Bitmap, also alles, was Delphi auch so hat, bloß sind diese Komponenten unglaublich schnell).

Abgesehen davon solltest du mit Scanline arbeiten, einfach mal danach suchen ;)


der organist - Fr 31.12.10 10:54

wofür hast du da ein break drin? So ne for schleife mit Abfrage lässt sich doch auch mit ner while-Schleife vereinfachen...


Delphi-Quelltext
1:
2:
3:
k:=1;
while((k<5001)AND(spielfeld.Canvas.Pixels[image1.left,i] <> clfuchsia))then
  image1.Top:=k-image1.Height;


jaenicke - Fr 31.12.10 11:41

Ich frage mich eigentlich eher, ob man das ganze nicht auch anders lösen kann. Wofür dient denn diese Abfrage nach einer Farbe?

Das sieht fast so aus als würdest du damit quasi versuchen zu kompensieren, dass du vergessen hast die Daten zu speichern was bisher passiert ist. :gruebel: Wenn dem so ist, ist das so ungefähr die ungünstigste und langsamste Lösungsmöglichkeit, die mir einfällt...