Problem mit imagesoverlap
Übersicht

![]() |
sbrogBetreff: Problem mit imagesoverlap |
![]() Antworten mit Zitat ![]() |
---|---|---|
sorry für den langen code .
Code: [AUSKLAPPEN] Graphics 800,600 Global schussgeschwindigkeit =8 Const Schussposition = 510 ; Y-position des Schusses Global panzerposition = 375 ; X-position des Panzers Global wartezeit =3000 ; die erste wartezeit (in millisekunden) Global altesmillisecs = MilliSecs() ; ein zeitzähler wird erstellt Global panzer = CreateImage(50,120) ;das Bild eines Panzers wird aus drei Rechtecken erstellt : SetBuffer ImageBuffer(panzer) Rect 0,30,40,50 ; 1. Rumpf Rect 10,0,5,30 ; 2. Rechter Lauf Rect 25,0,5,30 ; 3. Linker lauf Global kugeln =CreateImage(5,5) ; Die kugeln werden durch einen Normalen Kreis dargestellt SetBuffer ImageBuffer(kugeln) Oval 0,0,5,5 Global gegnerschiff=CreateImage(10,10) SetBuffer ImageBuffer(gegnerschiff) Rect 0,0,10,10 ; die Gegner werden durch ein Rechteck dargestellt SetBuffer BackBuffer() Type schuss ; Type für die Kugeln die der Panzer schießt Field x Field y End Type Type gegner ;type für die Gegner Field x Field y End Type ;-------------------------------------Hauptschleife Repeat Cls gegner panzerbewegen schiessen For schiff.gegner = Each gegner For kugel.schuss = Each schuss If ImagesOverlap(kugeln,kugel\x,kugel\y,gegnerschiff,schiff\x,schiff\y) Delete schiff.gegner EndIf Next Next Flip Until KeyHit(1) ;------------------------------------Funktionen Function panzerbewegen() DrawImage panzer,panzerposition,520 ; Der panzer wird gezeichnet If KeyDown(203) ; Wenn Pfeil nach links gedrückt wird panzerposition = panzerposition-4 ;bewegt sich der Panzer um 4 Pixel pro durchlauf nach links EndIf If KeyDown(205) ;Wenn Pfeil nach rechts gedrückt wird panzerposition= panzerposition+4 ; bewegt sich der panzer um 4 Pixel pro durchlauf nach rechts EndIf If panzerposition >800 panzerposition = 600 EndIf If panzerposition < 0 panzerposition = 0 EndIf End Function ;----------------------------------------------------------------------------------------------------- Function schiessen() If KeyHit(57) ;Wenn die Leertaste gedrückt wird, kugel.schuss= New schuss ;wird ein Schuss erstellt, kugel\x = panzerposition+10 kugel\y = schussposition ;der Schuss befindet sich am anfang auf der koordinate 480 EndIf For kugel.schuss = Each schuss ;Jeden Schuss durchgehen DrawImage kugeln,kugel\x,kugel\y DrawImage kugeln,kugel\x+15,kugel\y kugel\y= kugel\y -schussgeschwindigkeit ;Der Schuss wird pro Durchlauf höher gezeichnet If kugel\y<-10 Delete kugel.schuss EndIf Next End Function ;---------------------------------------------------------------------------------------------------- Function gegner() If AltesMillisecs + WarteZeit <= MilliSecs() ;Kleiner trick mit millisecs : wenn die Wartezeit vorüber sind, schiff.gegner = New gegner ; wird ein neuer Gegner erstellt schiff\x=Rnd (750) ; der Gegner erscheint auf einer zufälligen position, schiff\y= 0 ; am oberen Bildschirmrand AltesMillisecs = MilliSecs() ; der timer wird zurückgestellt wartezeit = wartezeit-Rnd(0,3000) ; die wartezeit wird umeine zufällige zahl verringert wartezeit = wartezeit+Rnd(0,2900) ;und wieder um eine Zufällige Zahl erhöht, ; die allerdings kleiner sein muss als die erste. Auf diese Weise wird eine kleine Unregelmäßigkeit ; der Wartezeit erzeugt wegen der Warscheinlichkeisrechnung wird die Wartezeit aber immer kleiner EndIf For schiff.gegner = Each gegner ; jeden Gegner durchgehen Rect schiff\x,schiff\y,20,20 ; die Gegner zeichnen schiff\y=schiff\y+1 ; die Gegner jedesmal ein Pixel weiter unten zeichnen Next End Function ;----------------------------------------------------------------------------------------------------- Ich würde gerne das "if imagesoverlap" so hinbekommen, dass es auch wirklich funktioniert. Ich glaube, mein Problem hängt hiermit zusammen : Code: [AUSKLAPPEN] If KeyHit(57) ;Wenn die Leertaste gedrückt wird, kugel.schuss= New schuss ;wird ein Schuss erstellt, kugel\x = panzerposition+10 kugel\y = schussposition ;der Schuss befindet sich am anfang auf der koordinate 480 EndIf For kugel.schuss = Each schuss ;Jeden Schuss durchgehen DrawImage kugeln,kugel\x,kugel\y DrawImage kugeln,kugel\x+15,kugel\y kugel\y= kugel\y -schussgeschwindigkeit ;Der Schuss wird pro Durchlauf höher gezeichnet If kugel\y<-10 Delete kugel.schuss EndIf Next weil hier das bild der Kugel versetzt 2x gezeichnet wird. |
||
![]() |
Gossi |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn du bei jedem Typ 2 Kugeln zeichnest, musst du auch bei jedem Typ 2 Kollisions-Abfragen machen.
Code: [AUSKLAPPEN] ImagesOverlap(kugeln,kugel\x,kugel\y,gegnerschiff,schiff\x,schiff\y) |
||
Alle Wasser laufen ins Meer, doch wird das Meer nicht voller; an den Ort, dahin sie fließen, fließen sie immer wieder. (...) Was geschehen ist, eben das wird hernach sein. Was man getan hat, eben das tut man hernach wieder, und es geschieht nichts neues unter der Sonne. Geschieht etwas, von dem man sagen könnte: "Sieh, das ist neu"? Es ist längst vorher auch geschehen in den Zeiten, die vor uns gewesen sind. |
![]() |
sbrog |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das ist mir klar.
Ich habe das mit if imagesoverlap(linke kugel...gegner...) or imagesoverlap(rechtekugel...gegner...) gemacht. Allerdings wirkt das nicht so , wie es sollte. Es ist ungenau. Ich denke eher, dass mit meinen koordinaten etwas nicht stimmt |
||
zocker2150 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Genauer ist der Befehl
Code: [AUSKLAPPEN] ImagesCollide(kugeln,kugel\x,kugel\y,0,gegnerschiff,schiff\x,schiff\y,0).
Dabei werden zwei Bilder dann Pixelgenau auf Kolision geprüft. Was natürlich Rechenaufwendiger ist. |
||
![]() |
sbrog |
![]() Antworten mit Zitat ![]() |
---|---|---|
In meinem fall tutdas nichts zur sache | ||
![]() |
Gossi |
![]() Antworten mit Zitat ![]() |
---|---|---|
sbrog hat Folgendes geschrieben: Das ist mir klar.
Ich habe das mit if imagesoverlap(linke kugel...gegner...) or imagesoverlap(rechtekugel...gegner...) gemacht. Allerdings wirkt das nicht so , wie es sollte. Es ist ungenau. Ich denke eher, dass mit meinen koordinaten etwas nicht stimmt Also hier kann ich nichts davon erkennen! Code: [AUSKLAPPEN] For schiff.gegner = Each gegner For kugel.schuss = Each schuss If ImagesOverlap(kugeln,kugel\x,kugel\y,gegnerschiff,schiff\x,schiff\y) Delete schiff.gegner EndIf Next Next Flip Until KeyHit(1) |
||
Alle Wasser laufen ins Meer, doch wird das Meer nicht voller; an den Ort, dahin sie fließen, fließen sie immer wieder. (...) Was geschehen ist, eben das wird hernach sein. Was man getan hat, eben das tut man hernach wieder, und es geschieht nichts neues unter der Sonne. Geschieht etwas, von dem man sagen könnte: "Sieh, das ist neu"? Es ist längst vorher auch geschehen in den Zeiten, die vor uns gewesen sind. |
![]() |
sbrog |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich weiß jetzt, welcher fehler unterlaufen ist.
Ich habe für die linke und für die rechte Kugel je eine kollisionabfrage gemacht, obwohl beide zum selben type gehören |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group