Got "Double" , expected "LongInt" ::: Brauche Hilfe...

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
MAHO
Beiträge: 1
Registriert: Mo 23. Mai 2016, 16:37

Got "Double" , expected "LongInt" ::: Brauche Hilfe...

Beitrag von MAHO »

Hallo, ich will gerade ein Spiel mit Lazarus programmieren, was ein Clon von Flappy Bird sein soll. Bei der Fallbewegung von dem Vogel (Image1) habe ich jedoch ein Problem
erst einmal:
var fall: double;
fall:=0;

und dann kommt eine prozedur mit Timer:

Code: Alles auswählen

 
procedure TForm1.Timer2Timer(Sender: TObject);
begin
  fall:=fall+0.04;
  Image1.Top:=Image1.Top+fall;
end;   
 

Das Timer Intervall ist 10 millisekunden.
Nun dann kommt die Meldung:
unit1.pas(101,31) Error: Incompatible type for arg no. 1: Got "Double", expected "LongInt"
Anscheinend kann ich für Image.Top keine Fließkommazahlen enthalten und "Double" wird nicht akzeptiert.
Im Timer ist der Code drin, der den Vogel immer schneller runterfallen lässt.
Nach Lazarus dürfte ich also jetzt keine 0.04 benutzen sondern 1 oder höher, damit aber wäre der Vogel viel zu schnell und wenn ich den Intervall höher setzen würde würde man keine fließende saubere Bewegung sehen. :|
Könnt ihr mir bitte irgendwie helfen? Jetzt schonmal vielen dank :)

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: Got "Double" , expected "LongInt" ::: Brauche Hilfe...

Beitrag von wp_xyz »

(1) Überleg doch mal: Wenn der Timer alle 10 ms feuert und der Vogel von Timer zu timer um 0.04 Pixel fällt, bewegt er sich in 1 Sekunde erst mal um 4 Pixel...

(2) Zu deinem Problem: Ja, Bildschirmkoordinaten sind Integer, also Ganzzahlen, du muss "fall" als Integer deklarieren.

(3) Für die meisten Leute ist am Fernseher mit 50 Hz kein Flimmern mehr zu sehen. 50 Hz, das heißt 20 ms pro Bild. Du musst das Timer-Intervall also nicht kleiner als 20 ms machen. Die Fallgeschwindigkeit steuerst du dann über den Wert von "fall". Wieder Gehirn einschalten: Mit fall = 1 bewegt sich das Objekt während 1 Sekunde über eine Distanz von 50 Pixeln - das ist immer noch bequemes Schweben.

(4) Bei einer ganz langsamen Bewegung würde ich "fall" konstant lassen (im Extremfall auf 1) und das Timer-Intervall verlängern.
Zuletzt geändert von wp_xyz am Mo 23. Mai 2016, 17:17, insgesamt 1-mal geändert.

magnetron
Beiträge: 44
Registriert: Di 4. Nov 2014, 14:04

Re: Got "Double" , expected "LongInt" ::: Brauche Hilfe...

Beitrag von magnetron »

Hallo MAHO,

Image.top ist ein Integer. Das image arbeitet ja in Pixeln und kann dazwischen nichts darstellen.
Vorschlag zur Lösung wäre

Code: Alles auswählen

Image1.Top:=Image1.Top+trunc(fall);

oder auch

Code: Alles auswählen

Image1.Top:=round(Image1.Top+fall);


Wichtig ist dem compiler nur, dass dem image.top ein Integer zugewiesen wird.
Grüße, Stefan

Antworten