Autor Beitrag
reptile
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 40



BeitragVerfasst: Sa 23.12.06 23:08 
hallo
ich möchte ein minigolf programmieren bei dem sämtliche elemente des spiels auf eine paintbox gezeichnet sind. nun hab ich ein problem damit genaue winkel zu machen weil pixelangaben auf der paintbox ja keine kommazahlen sein dürfen.
vom prinzip her mache ich es so dass ich die koordinaten des balles hab und dann immer nen kleinen x/y wert dazu zähle um die bewegung darzustellen. da diese x/y werte nur integer zahlen sein dürfen gehen eben nur wenige grobe winkel... wie stelle ich auf einer paintbox feinere zwischenwinkel dar?

ich sollte vielleicht noch erwähnen dass ich nicht wirklich ein profi in delphi bin ^^

danke jetzt schonmal

PS: ich HABE die suchfunktion genutzt, allerdings hab ich nur threads zu pong-klonen gefunden und die haben ja immer nur 90° winkel.
personX
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 19

WIN 2000
Delphi 2006
BeitragVerfasst: So 24.12.06 00:47 
Hi,

wenn dir die Lösung nicht zu ungenau ist, dann könntest du es so machen:
Die Koordinaten um Kommawerte erhöhen (z.B.: +0,5) und die Koordinate GERUNDET an die Zeichenfunktion übergeben.
Der Nachteil ist aber, dass bei sehr kleinen Winkeln die Bahn "ruckelnd" gezeichnet wird.
Ich hab dir mal ein Programm dazu geschrieben, dass die diese Winkel simuliert.
ausblenden 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:
implementation

{$R *.dfm}

var x,y,m,n:real;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Timer1.Interval:=5;
  Form1.DoubleBuffered:=true;
  x:=10; y:=10;            // x,y = Koordinaten der Kugel
  m:=StrToFloat(Edit1.Text);  // m,n = Erhöhung des Winkels der Bahn
  n:=StrToFloat(Edit2.Text);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Image1.Canvas.Rectangle(0,0,Image1.Width,Image1.Height);
  Image1.Canvas.Ellipse(round(x),round(y),round(x+10),round(y+10));
  x:=x+m;
  y:=y+n;
  if (round(x)>=Image1.Width) or (round(y)>=Image1.Height) then Timer1.Interval:=0;
end;


Gib in die Edits Werte zwischen 1 und 0 ein (bei größeren Werten wird die Kugel zu schnell) und klick auf den Button. Sind beide Werte gleich groß, wird ein 45° Winkel gezeichnet.
Ich hoffe, das hilft dir weiter.
Einloggen, um Attachments anzusehen!
_________________
"Naturwissenschaft setzt notwendig voraus, dass gleiche Umstände immer auch gleiche Auswirkungen haben. Nun, dem ist nicht so!" - R. Feynman
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: So 24.12.06 02:05 
Naja, du hast mehrere Koordinatensysteme. Das Koordinatensystem in deiner Welt und ein Koordinatensystem auf dem Bildschirm. In deiner Welt rechnest du mit Fliesskommazahlen; für die Bildschirmkoordinaten verwendest du ganze Zahlen.
Dann schreibst du am besten eine Transferfunktion, die deine Weltkoordinaten skaliert, verschiebt (, rotiert, usw.) und schlussendlich rundet.