Autor Beitrag
J:org
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Mo 01.12.03 12:19 
Hallo zusammen,

bisher kann ich mein bild wild auf dem form bewegen jedoch sollte das ganze nun in eine art raster gesteckt werden, wie auf einem schachbrettartigen feld eben.
sprich das image soll zB. nur 50 pixel nach vorne oder 60 quer oder 50 rechts etc.
ist mein ansatz richtig oder würdet ihr dies total anders realisieren?

eine andere möglichkeit wäre natürlich das image anklicken, dann das entsprechende feld anklicken und dann wandert die figur. wäre das so einfacher?

mit welchen functionen geht sowas?

vielen dank!

J:org
Andreas Pfau
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 997



BeitragVerfasst: Fr 05.12.03 21:24 
Hallo,

welcher Ansatz...? Also, nimm doch einfach die gewünschte Position des Users, teile sie durch 50 (X und Y separat), runde die Zahl, und wieder mit 50 multiplizieren. Die neuen Koordinaten passen genau auf dein 50x50-Raster.

Der Code ungefähr:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  NewX, NewY: Integer;
begin
  NewX := Round(X / 50) * 50;
  NewY := Round(Y / 50) * 50;
end;

Und an [NewX, NewY] kannst du dein Image zeichnen.

_________________
Life is a bad adventure, but the graphic is really good!
Theophilus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16


D6
BeitragVerfasst: Fr 05.12.03 22:08 
Eine andere Möglichkeit wäre, die Berechnung erst beim MouseUp-Event durchzuführen. Da bewegt sich die Figur mit der Maus und sucht sich beim Auslassen die richtige Position.
Andreas Pfau
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 997



BeitragVerfasst: Fr 05.12.03 22:28 
Hallo,

ja, je nach dem, ob man einen "Hot-Track-Effekt" haben will oder nicht. Wenn nein ist klar, dass man es in OnMouseUp() setzt.

Wenn man aber HotTrck will (also schon beim bewegen der Muas zeichnen), unbdedingt zuerst in ein Speicher-Bitmap rendern, nicht direkt auf die Zeichenfläche im Fenster (sei es ein Image oder eine PaintBox oder was auch immer). Wenn du direkt zeichnest kommt es zu enormem Flimmern!

_________________
Life is a bad adventure, but the graphic is really good!
J:org Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Mo 08.12.03 11:08 
hallo, danke für eure hilfe es funktioniert jetzt soweit.
allerdings, wie du schon gesagt hast, flimmert es jetzt... wie kann ich das denn rendern? hab schon die suche benutzt aber nix gefunden.
CodeWicht
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 90

Win98, WinXP
D6
BeitragVerfasst: Mo 08.12.03 12:27 
Versuche es doch mal mit

Form1.DoubleBuffered := True; *

*keine Gewähr auf Richtigkeit der Syntax!

_________________
The equal is true.
Andreas Pfau
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 997



BeitragVerfasst: Mo 08.12.03 17:28 
Hallo,

nein, das wird nichts bringen - sobald du pro Frame mehr als einein Zeichenbefel aufrufst, flimemrt es. Das geht nur, wenn du Objekte verschiebst. Aber da du mindestens 2 Zeichenbefehle brauchst (Raster zeichnen, Spielfigur zeichnen), flimmert es.

Was du machen musst: erzeuge ein Bitmap, zeichne da rein. Wenn alles gezeichnet ist, das Bitmap auf die Zeichenfläche kopieren (TCanvas.Draw()). Am besten, du verwendest als Zeichenfäche eine TPaintBox (Reigster "System"). Bei einem TImage wäre ich mir nicht so sicher, ob das dann nicht trotzdem flimmert. Und bei einer Paintbox beachten: in OnPaint() jedesmal das Speicherbitmap neu reinkopieren!!!

_________________
Life is a bad adventure, but the graphic is really good!
J:org Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Mi 10.12.03 09:46 
ausblenden Quelltext
1:
Form1.DoubleBuffered := True;					


funktioniert auch.

danke
Andreas Pfau
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 997



BeitragVerfasst: Mi 10.12.03 16:38 
Hallo,

na ja, es ist aber so, zeig' mal den code, den du zum Zeichnen verwendest. Das flimmert nur dann nicht, wenn du Delphi-Objekt (z.B. ein Panel) verschiebst. Wenn du selber zeichnest, wie soll das gehen? Du zeichnest den Hintergrund, du siehst den Hintergrund. Du zeichnest das Objekt, du siehst das Objekt. Du siehst 2 Bilder nacheinander. Das nennt man flimmern.

Villeicht reden wir aber auch aneinander vorbei, ich weiß nicht, bitte zeig' mal deinen code, ich meine, wenn er wirklich nicht flimmert, wäre ich begeistert.

_________________
Life is a bad adventure, but the graphic is really good!
J:org Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Mi 10.12.03 17:04 
ich glaub wir haben aneinander vorbei geredet, ich zeichne das Bild nicht. es ist ein Bitmap in einem TImage. Sprich ich zeichne keinen Hintergrund und kein Kreis in den Hintergrund (oder dergleichen).

ich denke deshalb geht es mit diesem doublebuffered -> true.

oder meintest du es flimmert auch wenns n bitmap ist?
Andreas Pfau
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 997



BeitragVerfasst: Mi 10.12.03 17:47 
Hallo,

du hast also 2 Images: eines mit dem Hintergrund, eines mit dem bewegten Objekt? Ja, das geht. Ich dachte, es soll selber gezeichnet werden. Sorry...

_________________
Life is a bad adventure, but the graphic is really good!
J:org Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Do 11.12.03 08:43 
ja stimmt fast, der hintergrund wird gezeichnet (schachbrett), figuren sind images.