Problem mit imagesoverlap

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

sbrog

Betreff: Problem mit imagesoverlap

BeitragMo, Mai 17, 2004 21:23
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Mai 17, 2004 21:29
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Mai 17, 2004 21:32
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Mai 19, 2004 15:04
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Mai 19, 2004 15:12
Antworten mit Zitat
Benutzer-Profile anzeigen
In meinem fall tutdas nichts zur sache

Gossi

BeitragMi, Mai 19, 2004 15:23
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Mai 19, 2004 17:14
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group