AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Schießen meine ich

Ein Thema von Luckie · begonnen am 15. Jun 2002 · letzter Beitrag vom 17. Feb 2015
Antwort Antwort
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

Schießen meine ich

  Alt 15. Jun 2002, 09:06
Bitte nicht lachen. Ich will mal so mein erstes Spiel programmieren. Und da dachte ich mir, ich schieße einfach mal so ein paar Objekte ab, die auf der Form rumschwirren. Aber so weit bin ich noch lange nicht. Alles was ich bisher geschafft habe, ist einen Schuß abzufeuern. Und das auch nur schlecht als recht.
Es ist gerade mal ein Schuß und dann ist Schluß. Zu allen Übel folgt der Schuß, wenn er abgefeuert wurde noch der Waffe (ein einfaches Label am unterem Fensterrand, welches man hin und her bewegen kann). Ich könnte aus der Kugel eine Rakete machen die man ins Ziel steuern muß, dann paßt es wieder, aber das will ich nicht.

Hier erstmal etwas Code:

Delphi-Quellcode:
procedure TForm1.Shoot(x, y: DWORD);
var
  Shot: TShot;
begin
  Shot.x := x;
  Shot.y := y;
  Form1.Refresh;
  Form1.Canvas.Draw(Shot.x ,Shot.y ,bullet);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
   Shoot(lblGun.Left+(lblGun.Width div 2), ypos);
   Dec(ypos, 5);
end;
Der Schuß wird mit der Leertaste ausgelöst, da wird einfach der Timer gestartet. Das es das nicht ist weiß ich auch. Aber ich komme nicht dahinter wie es gehen könnte. Irgendwie muß ich die Schüsse in einem Array halten und in einer Schleife bewegen und mit dem Timer nur den Takt vorgeben. Aber wie?

Ach so, ich glaube, das Spiel hieß "Asterioids" oder so. So soll dass dann mal aussehen.

Ohne DirectX oder so bitte.
Michael
Ein Teil meines Codes würde euch verunsichern.

Geändert von TBx (17. Feb 2015 um 08:13 Uhr) Grund: code-Tag gegen Delphi-Tag getauscht
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#2
  Alt 15. Jun 2002, 10:05
Du musst, beim Abfeuern dir die X und Y Koordinaten merken. Danach sind diese dein Ausgangspunkt. Ein Array würde ich dir da vorerst einmal nicht empfehlen, da man nicht weiß, wieviel Schuss abgefeuert werden, und wenn ein Schuss "ausgelebt" hat, dann musst du bei einem Array alle nachfolgenden Schüsse um ein Element nach vorne schieben. Mit einer dynamischen Liste wie TList, ist das kein Problem.

Code:
[color=#000080][i]// AllShoots: TList;[/i][/color]

[b]procedure[/b] TForm1.Fire; [color=#000080][i]// Schuss abgeben[/i][/color]
[b]var[/b]
  p: PPoint;
[b]begin[/b]
  New(p);
  p^.x := lblGun.Left + (lblGun.Width [b]div[/b] 2);
  p^.y := lblGun.Top;
  AllShoots.Add(p); [color=#000080][i]// neuen Schuss zu Liste hinzufügen[/i][/color]
[b]end[/b];

[b]procedure[/b] TForm1.DeleteDeadShoots(DeleteAll: Boolean);
[b]var[/b]
  p: PPoint;
  ii: Integer;
[b]begin[/b]
  [b]for[/b] ii := AllShoots.Count -1 [b]downto[/b] 0 [b]do[/b]
  [b]begin[/b]
    p := PPoint(AllShoots.Items[ii]);
    [b]if[/b] (p^.y < 0) [b]or[/b] (DeleteAll) [b]then[/b]
    [b]begin[/b]
       AllShoots.Delete(i); [color=#000080][i]// deswegen die Schleife rückwärts durchlaufen[/i][/color]
       Dispose(p);
    [b]end[/b];
  [b]end[/b];
[b]end[/b];

[b]procedure[/b] TForm1.Timer1Timer(Sender: TObject);
[b]var[/b]
  p: PPoint;
  ii: Integer;
[b]begin[/b]
  [b]for[/b] ii := 0 [b]to[/b] AllShoots.Count -1 [b]do[/b]
  [b]begin[/b]
    p := PPoint(AllShoots.Items[ii]);
    Shoot(p^.x, p^.y);
    Dec(p^.y, 5);
  [b]end[/b];
  DeleteDeadShoots(False);
[b]end[/b];

[b]procedure[/b] TForm1.FormDestroy...
[b]begin[/b]
  DeleteDeadShoots(True); [color=#000080][i]// speicher freigeben[/i][/color]
[b]end[/b];
by Daniel B; ich habe aus den Variablen i, ein ii gemacht, da sonst die Formatierung nicht funktioniert hätte.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3
  Alt 15. Jun 2002, 10:42
Danke schon. das sieht ja so kompliziert aus, das müßte gehen. Aaaaber...

So will ich jetzt einen Schuß mit deinem Code abfeuern, aber das klappt noch nicht:

Code:
[b]procedure[/b] TForm1.FormKeyDown(Sender: TObject; [b]var[/b] Key: Word;
  Shift: TShiftState);
[b]var[/b]
  p: PPoint;
[b]begin[/b]
  [b]case[/b] Key [b]of[/b]
    VK_LEFT: lblGun.Left := lblGun.Left - 5;
    VK_RIGHT: lblGun.Left := lblGun.Left + 5;
    VK_SPACE:
    [b]begin[/b]
      Fire;
      Timer1.Enabled := TRUE;
    [b]end[/b];
  [b]end[/b];
[b]end[/b];
In der letzten Zeile bekomme ich eine AccessViolation bveim Debuggen.
Zitat:
Code:
[b]procedure[/b] TForm1.Fire; [color=#000080][i]// Schuss abgeben[/i][/color]
[b]var[/b] p: PPoint;
[b]begin[/b]
  New(p);
  p^.x := lblGun.Left + (lblGun.Width [b]div[/b] 2);
  p^.y := lblGun.Top;
  AllShoots.Add(p); [color=#000080][i]// neuen Schuss zu Liste hinzufügen <-- HIER[/i][/color]
[b]end[/b];
Aber wie ist das, wenn ich so:
Zitat:
Code:
[b]procedure[/b] TForm1.Shoot(x, y: DWORD);
[b]var[/b]
  Shot: TShot;
[b]begin[/b]
  Shot.x := x;
  Shot.y := y;
  Form1.Refresh;
  Form1.Canvas.Draw(Shot.x, Shot.y, bullet);
[b]end[/b];
schiesse, dann werden ja jedes mal alle Schüsse gelöscht.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#4
  Alt 15. Jun 2002, 11:02
Du musst die TList AllShoots erst im OnCreate Ereignis erzeugen (AllShoots := TList.Create) und im OnDestroy Ereignis über AllShoots.Free (nach dem Aufruf von DeleteDeadShoots) wieder freigeben.

Damit nicht bei jedem Zeichnen eines Schusses, alle anderen gelöscht werden, musst du den Aufruf von Form1.Refresh aus der Funktion Shoot in das OnTimer-Ereignis (vor die Schliefe) verschieben.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5
  Alt 15. Jun 2002, 11:08
*PATSCH*
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
guggly

Registriert seit: 17. Feb 2015
1 Beiträge
 
#6

AW: Schießen meine ich

  Alt 17. Feb 2015, 05:13
ich schreibe gerade an einem Funktionszeichner (hat man vileicht aus meinen früheren Fragen sehen können). Der hat bis jetzt nur einen SChönheitsfehler: Ich zeichne die ganzen Parablen in ein TPaintBox. Nur sieht man da die Pixel sehr schnell. Ich habe so das Gefühl, das die nicht so Detailreich ist.
Sign up with Pass4sure 640-916 ccna for getting incredible online ccie rack rentals courses exam and lynn We also provide best Florida Institute of Technology and selftestengine with guaranteed success.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.056 Beiträge
 
Delphi 12 Athens
 
#7

AW: Schießen meine ich

  Alt 17. Feb 2015, 08:44
Hi Spambot

Quelle: http://www.delphipraxis.net/297-genaue-tpaintbox.html



Die "bunten" Delphi-Codes kann man doch bestimmt nicht mehr reparieren?
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:42 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz