Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Kollision/Abschuss (https://www.delphipraxis.net/64699-kollision-abschuss.html)

Koki 7. Mär 2006 08:36


Kollision/Abschuss
 
ich hab schon viele themen dazu in euerm forum gesehn

nun aber mein problem ich versteh es nicht richitg

ich feuer eine kugel ab und die soll solange zu sehn sein bis sie auf ein raumschiff trifft, außerdem sollen mindesten 5 kugeln gleichzeitig unterwegs sein

mgubler 7. Mär 2006 09:21

Re: Kollision/Abschuss
 
wie wäre es denn mit ein wenig code???
ich kann mir leider gerade gar nicts vorstellen.
wie löst du denn das bisher?

Angel4585 7. Mär 2006 09:27

Re: Kollision/Abschuss
 
also ich hab das mal mit Threads gelöst..

ein kleines Spiel mit Panzern.. allerdings fängt es ab 100 Panzern an zu ruckeln.

Du erzeugst für jede Kugel einen Thread und übergibts die Startposition und die Richtung.
Dieser erzeugt wiederum ein TBitmap, wo du die Kugel drauf zeichnest.. ein einfacher Punkt sollte genügen.
Jetzt gehst du im Thread.Execute hin und verschiebst alle 100ms oder so deine Kugel von der aktuellen position um ein paar Pixel in die Richtung. wenn das ganze kollidiert gibst du das Bitmap frei.

inherited 7. Mär 2006 15:11

Re: Kollision/Abschuss
 
Zitat:

ich hab schon viele themen dazu in euerm forum gesehn

nun aber mein problem ich versteh es nicht richitg

ich feuer eine kugel ab und die soll solange zu sehn sein bis sie auf ein raumschiff trifft, außerdem sollen mindesten 5 kugeln gleichzeitig unterwegs sein
Nimmst du DX, DelphiX, Canvas, OpenGL...??? tut mir leid aber damit können wir nichts anfangen,

Koki 13. Mär 2006 12:05

Re: Kollision/Abschuss
 
jo also hier ist mein bisheriger quellcode

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, Menus, Buttons;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Image2: TImage;
    Image3: TImage;
    MainMenu1: TMainMenu;
    Datei1: TMenuItem;
    Start1: TMenuItem;
    Beenden1: TMenuItem;
    Timer1: TTimer;
    Timer2: TTimer;
    Image4: TImage;
    Image5: TImage;
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure Beenden1Click(Sender: TObject);
    procedure Start1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  a,b,i,x,y:integer;

implementation

{$R *.dfm}


procedure TForm1.Start1Click(Sender: TObject);
 begin
  form1.doublebuffered:=true;
  x:=0; y:=0;
  image1.picture.loadfromfile('space4.bmp');
  image2.picture.loadfromfile('player1.bmp');
  image3.picture.loadfromfile('ufo5.bmp');
  image5.picture.loadfromfile('red02.bmp');
  image2.Left:=x;
  image2.Top:=y;
  image4.Left:=a;
  image4.Top:=b;
  timer1.Enabled:=true;
  timer2.Enabled:=true;
 end;


procedure Feuern(c,d:integer);
 begin
  form1.image4.picture.loadfromfile('bullet1.bmp');
  c:=0;
  if c<>0 then
   begin

   end;
 end;

procedure Tform1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
 var h: integer;
 begin
  form1.Caption:=inttostr(key);
  if key=37 then begin x:=x-5; a:=a-5; end;
  if key=38 then begin y:=y-5; b:=b-5; end;
  if key=39 then begin x:=x+5; a:=a+5; end;
  if key=40 then begin y:=y+5; b:=b+5; end;
{  if key=17 then begin Feuern(c,d);   end; }
 end;

procedure Tform1.Timer1Timer(Sender: TObject);
 begin
  image2.Left:=x;
  image2.Top:=y;
 end;

procedure TForm1.Timer2Timer(Sender: TObject);
 begin
  image4.Left:=a;
  image4.Top:=b;
 end;

procedure TForm1.Beenden1Click(Sender: TObject);
 begin
  close;
 end;

end.

inherited 13. Mär 2006 14:38

Re: Kollision/Abschuss
 
Zitat:

Zitat von Koki
Delphi-Quellcode:
procedure TForm1.Beenden1Click(Sender: TObject);
 begin
  close;
 end;

Delphi-Quellcode:
halt;
ist da besser als
Delphi-Quellcode:
close;
Das mit Images zu lösen ist langsam und unschön
Aber wenn du darauf beharrst könnte man das mit überprüfung von Schuss.Top und Schiff.Top...machen
Besser ist jedoch das mit Hier im Forum suchenDelphiX zu machen

Koki 14. Mär 2006 08:10

Re: Kollision/Abschuss
 
jo kann sein aber das ist nur ein info projekt das ich nächsten mittwoch erstmal abgeben muss

bis dahin muss es mit images gehn wenn ich dann nach dem Abi noch zeit und lust hab befasse ich mich vielleicht mit delphi x

könntet ihr mir ein anfang geben im programmcode und wie das aussehn muss ich weiss nähmlich nicht wie die schüsse dann weitelaufen ohne das ich eine taste drücke???

mquadrat 14. Mär 2006 08:55

Re: Kollision/Abschuss
 
Off-Topic: Jetzt weiß ich, warum uns in der Uni immer eingeprügelt wird sprechende Variablenbezeichnungen zu nutzen...

inherited 14. Mär 2006 14:50

Re: Kollision/Abschuss
 
Die unsaubere methode:
Delphi-Quellcode:
if (Schuss.Left < (Schiff.Left+Schiff.Width)) and ((Schuss.Left+Schuss.Width)>Schiff.Left) and (Schuss.Top < (Schiff.Top+Schiff.Height)) and ((Schuss.Top+Schuss.Height)> Schiff.Top) then Collision

Koki 15. Mär 2006 09:16

Re: Kollision/Abschuss
 
danke erstmal dazu aber es gibt noch ein problem: er schiesst einfach nicht, ausserdem bewegt sich mein schiff nicht mehr was kann der fehler sein
-> die procedure mit der Kollision ist noch nicht eingefügt

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, Menus, Buttons;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Image2: TImage;
    Image3: TImage;
    MainMenu1: TMainMenu;
    Datei1: TMenuItem;
    Start1: TMenuItem;
    Beenden1: TMenuItem;
    Timer1: TTimer;
    Timer2: TTimer;
    Image4: TImage;
    Image5: TImage;
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure Beenden1Click(Sender: TObject);
    procedure Start1Click(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  a,b,i,x,y:integer;

implementation

{$R *.dfm}


procedure TForm1.Start1Click(Sender: TObject);
 begin
  form1.doublebuffered:=true;
  x:=0; y:=0;
  image1.picture.loadfromfile('space4.bmp');
  image2.picture.loadfromfile('player1.bmp');
  image3.picture.loadfromfile('ufo5.bmp');
  image4.picture.loadfromfile('bullet1.bmp');
  image4.Visible:=false;
  image5.picture.loadfromfile('red02.bmp');
  image2.Left:=x;
  image2.Top:=y;
  form1.image4.Left:=a;
  form1.image4.Top:=b;
  timer1.Enabled:=true;
  timer2.Enabled:=false;
 end;


procedure Feuern;
 begin
  form1.image4.visible:=true;
  form1.timer2.enabled:=true;
 end;

procedure Tform1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
 var h: integer;
 begin
  //form1.Caption:=inttostr(key);
  if key=37 then begin x:=x-5; end;
  if key=38 then begin y:=y-5; end;
  if key=39 then begin x:=x+5; end;
  if key=40 then begin y:=y+5; end;
  if key=17 then begin Feuern; end;
 end;

procedure TForm1.Timer2Timer(Sender: TObject);
 begin
  a:=a+1;
 end;

procedure TForm1.Beenden1Click(Sender: TObject);
 begin
  close;
 end;

end.

Koki 15. Mär 2006 10:06

Re: Kollision/Abschuss
 
bitte noch einmal helfen

problem siehe beitrag über diesen hier auch von mir

NormanNG 15. Mär 2006 10:50

Re: Kollision/Abschuss
 
Hi,

Wenn dein Timer2 läuft, zählt er die Variable "a" weiter.
Aber sonst auch nichts. Es sieht so aus, als solltest/wolltest du mit Timer1 die Anzeige aktualisieren.
Wenn du dort "a" verwendest, dann bewegt sich evtl. auch was... :-D

TeronG 15. Mär 2006 12:02

Re: Kollision/Abschuss
 
Zitat:

Zitat von inherited

Das mit Images zu lösen ist langsam und unschön
Aber wenn du darauf beharrst könnte man das mit überprüfung von Schuss.Top und Schiff.Top...machen
Besser ist jedoch das mit Hier im Forum suchenDelphiX zu machen

Hat denn DelphiX fertige functionen, um eine Collision zu prüfen?

Koki 19. Mär 2006 17:33

Re: Kollision/Abschuss
 
ich hab schon wieder ein problem bei der kollision die bekomme ich nicht richtig hin

also ich hab erst inherited's vorschlag versucht funktionierte aber nicht, dann hab ich mir nochmal gedanken gemacht und eine weitere procedure ausgedacht und funktioniert auch nicht nun bitte ich euch das mal anzugucken und mir zu helfen aber ich brauch die hilfe schnell denn ich muss das programm bis spätestens übermorgen fertig haben und will noch was verbessern dazu brauche ich aber erst das grundgerüst

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, Menus, Buttons;

type
  TForm1 = class(TForm)
    background: TImage;
    player: TImage;
    enemy1: TImage;
    MainMenu1: TMainMenu;
    Datei1: TMenuItem;
    Start1: TMenuItem;
    Beenden1: TMenuItem;
    Timer1: TTimer;
    bullet1: TImage;
    planet1: TImage;
    bullet2: TImage;
    bullet3: TImage;
    bullet4: TImage;
    bullet5: TImage;
    Timer2: TTimer;
    planet2: TImage;
    enemy2: TImage;
    enemy3: TImage;
    enemy4: TImage;
    enemy5: TImage;
    explosion1: TImage;
    Timer3: TTimer;
    procedure Timer3Timer(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure Beenden1Click(Sender: TObject);
    procedure Start1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  x,y:integer;                                     {Schiff-X/Y Koordinaten}
  e,f,ee,ff:integer;                               {Planet-X/Y Koordinaten}
  c,cc,ccc,cccc,ccccc,d,dd,ddd,dddd,ddddd:integer; {Schuss-X/Y Koordinaten}
  a,aa,aaa,aaaa,aaaaa,b,bb,bbb,bbbb,bbbbb:integer; {Feinde-x/y Koordinaten}
  g,h,k:integer;                                   {Explosion-x/y Koordinate}
  ü:integer;                                       {Sonstige Variablen}
  z:boolean;

implementation

{$R *.dfm}

procedure Schuss;
 begin
  c:=x;     d:=y;
  cc:=x;    dd:=y;
  ccc:=x;   ddd:=y;
  cccc:=x;  dddd:=y;
  ccccc:=x; ddddd:=y;
  form1.bullet1.picture.loadfromfile('bullet1.bmp');
  form1.bullet2.picture.loadfromfile('bullet1.bmp');
  form1.bullet3.picture.loadfromfile('bullet1.bmp');
  form1.bullet4.picture.loadfromfile('bullet1.bmp');
  form1.bullet5.picture.loadfromfile('bullet1.bmp');
  form1.bullet1.Visible:=false;
  form1.bullet2.Visible:=false;
  form1.bullet3.Visible:=false;
  form1.bullet4.Visible:=false;
  form1.bullet5.Visible:=false;
  form1.bullet1.Left:=c;      form1.bullet1.Top:=d;
  form1.bullet2.Left:=cc;     form1.bullet2.Top:=dd;
  form1.bullet3.Left:=ccc;    form1.bullet3.Top:=ddd;
  form1.bullet4.Left:=cccc;   form1.bullet4.Top:=dddd;
  form1.bullet5.Left:=ccccc;  form1.bullet5.Top:=ddddd;
 end;

procedure Planet;
 begin
  e:=random(775); f:=random(375);
  form1.planet1.Left:=e;   form1.planet1.Top:=f;
  form1.planet1.Picture.LoadFromFile('planet5.bmp');
 end;

procedure Enemy;
 begin
  a:=875;    b:=random(700);
  aa:=875;   bb:=random(700);
  aaa:=875;  bbb:=random(700);
  aaaa:=875; bbbb:=random(700);
  aaaaa:=875; bbbbb:=random(700);
  form1.enemy1.Left:=a;   form1.enemy1.Top:=b;
  form1.enemy1.Picture.Loadfromfile('enemy1.bmp');
  form1.enemy2.Picture.LoadFromFile('enemy1.bmp');
  form1.enemy3.Picture.LoadFromFile('enemy1.bmp');
  form1.enemy4.Picture.LoadFromFile('enemy1.bmp');
  form1.enemy5.Picture.LoadFromFile('enemy1.bmp');
 end;

procedure Neu;
 begin
  form1.doublebuffered:=true;
  Enemy; Schuss; Planet;
  x:=0;  y:=150;
  form1.background.picture.loadfromfile('space1.bmp');
  form1.player.picture.loadfromfile   ('player.bmp');
  form1.player.Left:=x;   form1.player.Top:=y;
  z:=true;
 end;

procedure TForm1.Start1Click(Sender: TObject);
 begin
  Neu;
 end;

procedure Kollision;
 begin
  k:=0;
  g:=a; h:=b;
  form1.explosion1.picture.LoadFromFile('explosion1.bmp');
 end;

[b][i]procedure KollisionAb;
 begin
  if (a>c-20)    and (b>d-20)    or (b>d+20)    then form1.enemy1.visible:=false;
  if (a>cc-20)   and (b>dd-20)   or (b>dd+20)   then form1.enemy2.visible:=false;
  if (a>ccc-20)  and (b>ddd-20)  or (b>ddd+20)  then form1.enemy3.visible:=false;
  if (a>cccc-20) and (b>dddd-20) or (b>dddd+20) then form1.enemy4.visible:=false;
  if (a>ccccc-20) and (b>ddddd-20) or (b>ddddd+20) then form1.enemy5.visible:=false;
 end;[/i][/b]

procedure Feuern(ä:integer);
 begin
  c:=x+50;    d:=y+23;
  cc:=x+50;   dd:=y+23;
  ccc:=x+50;  ddd:=y+23;
  cccc:=x+50; dddd:=y+23;
  ccccc:=x+50; ddddd:=y+23;
  if ä=1 then form1.bullet1.visible:=true;
  if ä=2 then form1.bullet2.Visible:=true;
  if ä=3 then form1.bullet3.Visible:=true;
  if ä=4 then form1.bullet4.Visible:=true;
  if ä=5 then form1.bullet5.Visible:=true;
  form1.Timer2.Enabled:=true;
 end;

procedure Tform1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var ö:integer;
begin
  //form1.Caption:=inttostr(key);
  ö:=1;
  if key=113 then Neu;
  if z=true then
   begin
    if ö=5 then ö:=1;
    if key=37  then x:=x-5;
    if key=38  then y:=y-5;
    if key=39  then x:=x+5;
    if key=40  then y:=y+5;
    if key=17  then begin Feuern(ö); ö:=ö+1; end;
   end;
end;

procedure Tform1.Timer1Timer(Sender: TObject);
 begin
  player.Left:=x;
  player.top:=y;
 end;

procedure TForm1.Timer2Timer(Sender: TObject);
 begin
  form1.bullet1.Left:=c;      form1.bullet1.Top:=d;
  form1.bullet2.Left:=cc;     form1.bullet2.Top:=dd;
  form1.bullet3.Left:=ccc;    form1.bullet3.Top:=ddd;
  form1.bullet4.Left:=cccc;   form1.bullet4.Top:=dddd;
  form1.bullet5.Left:=ccccc;  form1.bullet5.Top:=ddddd;
  if c=1000 then
   begin
    c:=x; form1.bullet1.Visible:=false;
   end
  else c:=c+5;
  if cc=1000 then
   begin
    cc:=x; form1.bullet2.Visible:=false;
   end
  else cc:=cc+5;
  if ccc=1000 then
   begin
    ccc:=x; form1.bullet3.Visible:=false;
   end
  else ccc:=ccc+5;
  if cccc=1000 then
   begin
    cccc:=x; form1.bullet4.Visible:=false;
   end
  else cccc:=cccc+5;
  if ccccc=1000 then
   begin
    ccccc:=x; form1.bullet1.Visible:=false;
   end
  else ccccc:=ccccc+5;
 end;

procedure TForm1.Timer3Timer(Sender: TObject);
 begin
  if k<5 then k:=k+1
  else
   begin
    if k<10 then
     begin
      form1.explosion1.picture.LoadFromFile('explosion2.bmp');
      k:=k+1;
     end
    else form1.explosion1.visible:=false;
   end;
 end;

procedure TForm1.Beenden1Click(Sender: TObject);
begin
  close;
end;

end.

Koki 20. Mär 2006 11:31

Re: Kollision/Abschuss
 
ich brauche keine hilfe mehr ich hab problem gefunden

ich musste die abfrage nur in ein timer packen


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:10 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