Autor Beitrag
bartuc
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Mo 04.12.06 20:48 
Hallo zusammen
Bin neu hier im Forum, deshalb weis ich nicht ob ich hier richtig bin. wenn nicht, bitte verschieben =).

Also habe folgendes Problem.
Muss für die Schule ein Spiel programmieren. Hatte mir vorgenommen ein Jump and Run spiel zu entwickeln. Nur gibt es bei der Steuerung ein Problem.

Wenn ich durch "Space" springe, soll das Bild auf dem unterliegenden objekt (bei mir sind das Shapes) landen und nicht in der Luft stehen.

Hab folgendes geschrieben

ausblenden Delphi-Quelltext
1:
2:
3:
if Key = VK_SPACE then begin
  if Unit2.IstAufDemBoden(image1.TCanvas) then begin
    ImgCartman.YSpeed := -20;


Der Compiler zeigt mir folgeden Fehler an:

ausblenden Delphi-Quelltext
1:
2:
[Pascal Error] Unit1.pas(154): E2066 Missing operator or semicolon
[Pascal Error] Unit1.pas(155): E2003 Undeclared identifier: 'YSpeed'


Ich versteh nicht was der Compiler mir sagen will.
Hat jemand eine Idee und könnte mir helfen endlich mein Bild richtig zum springen zu kriegen?

MFG
Bartuc =)
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Mo 04.12.06 21:39 
1: da fehlt ein semikolon und Yspeed ist nirgends deklariert würde ich sagen ;)
bartuc Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Mo 04.12.06 21:56 
wo soll denn da ein Semikolon fehlen?
und yspeed müsste declariert sein oder?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
private
  FLeft: Integer;
  FTop: Integer;
  FWidth: Integer;
  FHeight: Integer;
  FXSpeed: Integer;
  FYSpeed: Integer;
  FBitmap: Boolean;


ich sitz an der sache schon knapp 3 wochen und habs immernoch nicht hinbekommen *schnüff*
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Mo 04.12.06 22:00 
FYSpeed hast du aber net YSpeed
Ironwulf
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 733
Erhaltene Danke: 2



BeitragVerfasst: Mo 04.12.06 22:03 
und der erste fehler wird kommen weil du Image1.TCanvas hast und nich Image1.Canvas
bartuc Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Mo 04.12.06 22:30 
habs mal geändert aber der Fehler kommt immernoch an der selben stelle. =(
bartuc Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Mo 04.12.06 23:11 
kennt sonst jemand vielleicht eine alternative um ein bild "springen" zu lassen?
Habs mal mit nem Timer versucht. aber dann ist das "springen" nicht flüssig und ich kann nicht seitwärts springen.

MFG
Bartuc
delphistart
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 119



BeitragVerfasst: Di 05.12.06 00:10 
Titel: Andere Möglichkeit
Du könntest das Bild über eine Schleife bewegen.
Etwa so:
ausblenden Delphi-Quelltext
1:
2:
3:
for i := 0 to 233 do begin
Image1.Left := Image.Left - 1;
pause(5);


Mit der schleife wird dein Bild 233 mal um ein Pixel nach rechts verschoben. Für die Bewegung nach Links müsstest du Image.Left+1 setzen für ein nach oben Image.Top-1 und für eine nach unten Image.Top+1. Die aufgerufen Procedur Pause brauchst du, damit delphi eine Pause zwischen den durchläufen der Schleife macht.

Hier die procedure pause:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.pause(zeit: integer);
var m,n : integer;
begin
  m := gettickcount;
  repeat
    n := gettickcount;
    Application.ProcessMessages;
  until (n-m>zeit);
end;

Die Geschwindigkeit kannst du über den übergebenen Zeitwert in MS ändern.

Für dein Problem mit dem springen kannst du die obere procedure so abändern, dass sie eine Bewegung verursacht, die du für deinen Sprung haben willst. Diese kannst du über Button Tastendruck oder wie auch immer aufrufen.
Wenn das Bild sich über den Bilschirm bewegen soll un der Benutzer dabei über Hindernisse springt, dann Brauchst du also eine Kombination aus mehreren proceduren. Eine die Konstant dein Bild zur Seite bewegt und eine die bei Tastendruck die Bewegung nach oben und auch wieder nach unten auslöst.

Ich hoffe das hilft dir! :wink:
wulfskin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1349
Erhaltene Danke: 1

Win XP
D5 Pers (SSL), D2005 Pro, C, C#
BeitragVerfasst: Di 05.12.06 00:44 
Hallo,

ganz einfaches Zählen könnte so gehen (aus dem Kopf):
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var
  A: Array [0..255of Integer;  //Enthält die Anzahl der Zeichen (ASCII)
  I: Integer;
  S: String;
begin
  S := 'astalavista';
  FillChar(A, SizeOf(A), 0);
  for I := 1 to Length(S) do
    Inc(A[Ord(S[I])]);
end;
Edit: Bitte löschen, bin verrutscht! :(

Gruß Hape!

_________________
Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.


Zuletzt bearbeitet von wulfskin am Di 05.12.06 14:24, insgesamt 1-mal bearbeitet
Ironwulf
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 733
Erhaltene Danke: 2



BeitragVerfasst: Di 05.12.06 00:54 
*hust* du bist im thread verrutscht
bartuc Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Di 05.12.06 14:22 
Mit der pause procedure hat es leider nicht geklappt.

hab es mal wieder mit einem Timer versucht und da kam das raus:

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:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if imgcartman.Top = -100 then begin
timer1.Enabled := false;
timer2.enabled := true;
end
else begin
  repeat
  Imgcartman.Top := Imgcartman.top -5;
until (imgcartman.Top = -100);
end;
end;
procedure TForm1.Timer2Timer(Sender: TObject);
begin
if imgcartman.Top = +100 then begin
timer2.enabled := false;
end
else begin
repeat
  imgcartman.Top := imgcartman.Top +5;
until (imgcartman.Top =  +100);
end;
end;


Timer1 wird gestartet wenn ich die Leertaste drücke:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
    VK_SPACE: begin
      timer1.enabled := true;
      Key := 0;
      end;


aber es tut sich nichts.....
wenn ich die Leertaste drücke friert das Programm ein.
und ich find meinen fehler nicht.
Könnt ihr mir vielleicht weiterhelfen?

MFG
delphistart
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 119



BeitragVerfasst: Di 05.12.06 18:59 
user profile iconbartuc hat folgendes geschrieben:
Mit der pause procedure hat es leider nicht geklappt.


Poste doch mal deinen Quelltext, wo du die Pauseprocedur eingebaut hast. Ich hab die aus einem Programm von mir kopiert, wo eine Figur durch ein Labyrinth läuft. Müsste also eigentlich gehen. Vielleicht finde ich dann den Fehler!

Ansonsten kann ich dir auch gerne mal mein Programm Mailen, wenn du mir deine Asresse gibst.

Gruß Jonas
monster
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 51

Win XP
Delphi 2005 PE
BeitragVerfasst: Di 05.12.06 20:41 
check mal die Zeilen 4 und 5, die kommen mir etwas suspekt vor.

Mit der TTimer-Komponente wirst Du in einer so zeitkritischen Anwendung wie einem Jump'n'Run nicht weit kommen, dazu ist der Timer zu langsam und du musst bedenken, dass sich mehrere Objekte gleichzeitig bewegen... sprich Du brauchst ein paar hundert Zeilen Code, die das alles auch verwalten.

Trotzdem: es gibt 2 Möglichkeiten:
1. Platziere ein TApplicationEvents auf deiner Form und führe die Bewegungen im onIdle aus (setze done auf false).
2. Nimm einen hochauflösenden Timer.

Passender Link: wiki.delphigl.com/in...p/Timebased_Movement

Ich empfehle dir dringend, mit etwas Leichterem anzufangen als ausgerechnet einem Jump'n'Run... das ist nämlich ziemlich hart.
bartuc Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Di 05.12.06 22:10 
Zitat:

1. Platziere ein TApplicationEvents auf deiner Form und führe die Bewegungen im onIdle aus (setze done auf false).


Sry, versteh da nur Bahnhof. TApplicationevents ? onIdle ?

und auf Wikipedia bin ich auch nicht schlauer geworden.

Zitat:

2. Nimm einen hochauflösenden Timer.


wie erstell ich denn einen?
jakobwenzel
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1889
Erhaltene Danke: 1

XP home, ubuntu
BDS 2006 Prof
BeitragVerfasst: Di 05.12.06 22:15 
user profile iconbartuc hat folgendes geschrieben:
Zitat:

1. Platziere ein TApplicationEvents auf deiner Form und führe die Bewegungen im onIdle aus (setze done auf false).


Sry, versteh da nur Bahnhof. TApplicationevents ? onIdle ?

und auf Wikipedia bin ich auch nicht schlauer geworden.

TSpplicationEvents ist eine nicht visuelle Komponente (Regster Win32, IMHO), die dazu dient, verschiedene Ereignisse, die für die gesamte Anwendung gelten, leichter zuweisbar zu machen. In dem Fall ist das OnIdle, das immer aufgerufen wird, wenn dem Prozi grad langweilig ist (der sucht halt beschäftigung :mrgreen:). Wenn du diese Methode benutzt ist es wichtig, den POarameter Done auf in der Prozedur false zu setzen, sonst wird OnIdle erst wieder bei Mausbewegung oder Tastendruck aufgerufen (weil Windows denkt, dass wir fertig sind).

_________________
I thought what I'd do was, I'd pretend I was one of those deaf-mutes.
bartuc Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Do 07.12.06 11:47 
also ich komm mit dem TApplicationevents und onIdle nicht klar....

hab aber noch eine andere Frage.... wenn ich z.b nach rechts gehe und dann springen möchte, soll das bild nicht nur senkrecht springen sondern sich auch gleichzeitig nach rechs bewegen.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
VK_Right: begin
if timer1.Enabled = true then
      begin
        Imgcartman.left := Imgcartman.Left +10;
        Imgcartman.top := Imgcartman.top -10;
      end
      else begin
      ImgCartman.Left := ImgCartman.Left + 10;
      Key := 0;
    end;


Timer 1 startet den Sprung nach oben.

aber es passiert nichts.
wie müsste ich den befehl ändern?