ImagesOverlap ? wenn nicht warum trotzdem bumm ?

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Mike84

Betreff: ImagesOverlap ? wenn nicht warum trotzdem bumm ?

BeitragDi, Mai 17, 2005 16:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo erstmal,
Ich bin gans neu hier im Forum und ich sag es lieber gleich, ich habe viele viele rechtschreibfehler also bitte erschlagt mich nicht wenn ihr welche findet. Mr. Green

Ich habe vor einem Monat angefangen zu Progen und versuche mich seit ein paar Tagen an ein WeltraumBallerSpiel. Aber ich komme nicht wirklich weiter . Das problem ist wenn ich einen Schuss abgebe und ich einen Gegner getroffen habe soll er gelöscht werden aber eben nur wenn ich ihn getroffen habe aber im moment ist es so wenn ich schiese macht es bumm und alle Gegner auf dem Bildschierm sind weg aber warum ?
Kann mir da mal jemand einen Tipp geben.
hier ist der code da wo ich denke das der fehler ist habe ich ein paar ## gemalt

Code:

Graphics 800,600
SetBuffer BackBuffer()


Global PlayerX = 380
Global PlayerY = 550
Global Speed   = 2
Global GegnerTimer =0
Global GegnerSetTimer = 160
Global GegnerSpeedX = 0
Global GegnerSpeedY = 2


hintergrund = LoadImage("stars.bmp")
Schiff = LoadImage("spaceship2.bmp")
blaster = LoadImage("blaster.bmp")
gegnerImage = LoadImage("invader2.bmp")

blasterSound = LoadSound("blaster.wav")
ExplodeSound = LoadSound("bumm.wav")



Type Schuss
Field SchussX
Field SchussY
Field SchussSpeedX
Field SchussSpeedY
End Type

Type Gegner
Field GegnerX
Field GegnerY
Field GegnerSpeedX
Field GegnerSpeedY
Field GegnerArmor
End Type


Function AddGegner(x,y,SpeedX,SpeedY,Armor)
Gegner.Gegner  = New Gegner
Gegner\GegnerX = x
Gegner\GegnerY = y
Gegner\GegnerSpeedX = SpeedX
Gegner\GegnerSpeedY = SpeedY
Gegner\GegnerArmor = Armor
End Function


Function AddSchuss(x,y,SpeedX,SpeedY)
Schuss.Schuss       = New Schuss
Schuss\SchussX      = x
Schuss\SchussY      = y
Schuss\SchussSpeedX = SpeedX
Schuss\SchussSpeedY = SpeedY
End Function


Playmusic("boss.mid")

Repeat
Cls

; Hintergrund Malen und Scrollen
H = H+1
If H =200 then H =0
TileBlock hintergrund,0,H


Gosub Benutzereingabe
Gosub Blaster
Gosub Gegner

Text 0,50,"PX " + PlayerX
Text 0,70,"PY " + PlayerY

DrawImage Schiff,PlayerX,PlayerY

Flip
Until KeyDown(1)


.Gegner;---------------------------------

; Gegner nicht vorhanden dan löschen
For Gegner.Gegner = Each Gegner
   If Gegner\GegnerY > 650 : Delete Gegner.Gegner
   ElseIf Gegner\GegnerY < -100 : Delete Gegner.Gegner
   ElseIf Gegner\GegnerX > 850 : Delete Gegner.Gegner
   ElseIf Gegner\GegnerX < -50 : Delete Gegner.Gegner
   EndIf
Next
 
; Gegner Berechnen
GegnerTimer = GegnerTimer +1
If GegnerTimer = GegnerSetTimer Then   
   SeedRnd MilliSecs()
   GegnerX = Rand(20,780)
   GegnerY = -20
   AddGegner(GegnerX,GegnerY,GegnerSpeedX,GegnerSpeedY,2)
   GegnerTimer =0
EndIf
 
 
; Gegner Malen
For Gegner.Gegner = Each Gegner
   DrawImageRect gegnerImage,Gegner\GegnerX,Gegner\GegnerY,74,232,36,48
   Gegner\GegnerY = Gegner\GegnerY + Gegner\GegnerSpeedY
Next


;##########################################################################################
; Blaster Treffer
For Gegner.Gegner = Each Gegner
For Schuss.Schuss = Each Schuss
If ImagesOverlap(blaster,Schuss\SchussX,Schuss\SchussY,gegnerImage,Gegner\GegnerX,Gegner\GegnerY)
   Delete Gegner.Gegner
   PlaySound(explodeSound)
EndIf
Next
Next
; ###########################################################################################

Return


.Blaster;---------------------------------

; Schuss nicht vorhanden dann löschen
For Schuss.Schuss = Each Schuss
   If Schuss\SchussX < -3 : Delete Schuss.Schuss
   ElseIf Schuss\SchussX > 800 : Delete Schuss.Schuss
   ElseIf Schuss\SchussY < 0 : Delete Schuss.Schuss
   ElseIf Schuss\SchussY > 600 : Delete Schuss.Schuss
   EndIf
Next


; Schuss vorhanden dann Malen und um Speed bewegen
For Schuss.Schuss = Each Schuss
   DrawImage blaster, Schuss\SchussX, Schuss\SchussY
   Schuss\SchussX = Schuss\SchussX + Schuss\SchussSpeedX
   Schuss\SchussY = Schuss\SchussY + Schuss\SchussSpeedY
Next

Return


.Benutzereingabe ;---------------------------------

; Bewegung rechts links
If KeyDown(203) And PlayerX >0 Then PlayerX = PlayerX - Speed
If KeyDown(205) And PlayerX <800-imagewidth(Schiff) Then PlayerX = PlayerX + Speed

; Schiesen
If Keyhit(57) Then
   AddSchuss(PlayerX+14,PlayerY-2,0,-2)
   PlaySound(blasterSound)
EndIf


Return



Für jede art von hilfe oder verbesserungsforschläge (auser verbesserungen für rechtschreibung 8) ) bin ich sehr dankbar
 

BlackJack

BeitragDi, Mai 17, 2005 16:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Hast du schon mal probiert bei den Funktionen mit "Add" ein
Return einzufügen und dann Variablen zuweise?
Ich bin mir nciht mehr so sicher...
*Team: StuffMakers by Basic_Progger*
I know what I mean.
 

Mike84

BeitragDi, Mai 17, 2005 17:23
Antworten mit Zitat
Benutzer-Profile anzeigen
An die Function mit Add übergebe ich nur die parameter für die Typen Gegner und Schuss damit ich nicht alles einzeln schreiben muss sie sollen mir eigendlich nichts zurückgeben aber wie gesagt ich Proge erst seit einem Monat und habe noch wenig erfarung Wie müsste es dan ungefär aussehen das mit den rückgabewerten habe ich noch nicht gans verstanden

frigi

BeitragDi, Mai 17, 2005 17:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Du überprüfst alle Gegner, und löschst auch alle, wenn eine Kollision stattfindet, das ist der Fehler
Du musst also prüfen, ob eine Kollision stattfindet und dann nur den Gegner löschen, der getroffen wurde.
 

Mike84

BeitragDi, Mai 17, 2005 18:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm.. ich habe ich dachte das es so geht
Es werden zwar alle überprüft ob eine colision stadtfindet aber da diese bedingung immer nur für einen zutrift nämlich der der Getroffen wird wird auch normal nur der eine gelöscht.
Ich habe jetzt mal ein anderes Image als gegner genommen und da klappt es komischerweise wunderbar. Jetzt vermute ich da ich meinen Gegner aus einer Tileset lade und mit drawImageRect zeichne, dass nicht nur der Gegner den ich sehe auf die collisionsabfrage reagiert sondern auf die Gesamte tielemap.
Also neue Frage:

Wie Bekomme ich es hin wenn ich ein teil einer Image mit DrawImageRect zeichne das bei ImagesOverlaps auch nur der Teil erkannt wierd und nicht die Gesamte tilemap

Alfadur

BeitragDi, Mai 17, 2005 21:05
Antworten mit Zitat
Benutzer-Profile anzeigen
hm, also ich könnte mir denken das es an dem drawimagerect liegt ... ich hab dein programm mal umgeschrieben, vielleicht kannst du was damit anfangen. es funktioniert zumindest jetzt. hab die grafiken mal durch temp. bilder ersetzt ...

BlitzBasic:



Graphics 800,600
SetBuffer BackBuffer()


Global PlayerX = 380
Global PlayerY = 550
Global Speed = 2
Global GegnerTimer =0
Global GegnerSetTimer = 160
Global GegnerSpeedX = 0
Global GegnerSpeedY = 2


Global hintergrund = CreateImage(10,10):SetBuffer ImageBuffer(hintergrund):ClsColor(10,10,10):Cls
Global Schiff = CreateImage(10,10):SetBuffer ImageBuffer(Schiff):ClsColor(50,50,50):Cls
Global blaster = CreateImage(10,10):SetBuffer ImageBuffer(blaster):ClsColor(100,100,100):Cls
Global gegnerImage = CreateImage(10,10):SetBuffer ImageBuffer(gegnerImage):ClsColor(250,250,250):Cls
ClsColor(0,0,0)

Global blasterSound = LoadSound(\"blaster.wav\")
Global ExplodeSound = LoadSound(\"bumm.wav\")

SetBuffer BackBuffer()

Type Schuss
Field SchussX
Field SchussY
Field SchussSpeedX
Field SchussSpeedY
End Type

Type Gegner
Field GegnerX
Field GegnerY
Field GegnerSpeedX
Field GegnerSpeedY
Field GegnerArmor
End Type


Function AddGegner(x,y,SpeedX,SpeedY,Armor)
Gegner.Gegner = New Gegner
Gegner\GegnerX = x
Gegner\GegnerY = y
Gegner\GegnerSpeedX = SpeedX
Gegner\GegnerSpeedY = SpeedY
Gegner\GegnerArmor = Armor
End Function


Function AddSchuss(x,y,SpeedX,SpeedY)
Schuss.Schuss = New Schuss
Schuss\SchussX = x
Schuss\SchussY = y
Schuss\SchussSpeedX = SpeedX
Schuss\SchussSpeedY = SpeedY
End Function


PlayMusic(\"boss.mid\")

Repeat
Cls

; Hintergrund Malen und Scrollen
;H = H+1
;If H =200 Then H =0
;TileBlock hintergrund,0,H

gegner()
schuss()
collision()
checkkeys()

;Text 0,50,\"PX \" + PlayerX
;Text 0,70,\"PY \" + PlayerY

DrawImage Schiff,PlayerX,PlayerY

Flip 0
Until KeyDown(1)


Function gegner()
GegnerTimer = GegnerTimer+1
If GegnerTimer = GegnerSetTimer Then
GegnerX = Rand(20,780)
GegnerY = -20
AddGegner(GegnerX,GegnerY,GegnerSpeedX,GegnerSpeedY,2)
GegnerTimer =0
EndIf
For Gegner.Gegner = Each Gegner
If Gegner\GegnerY > 650 Or Gegner\GegnerY < -100 Or Gegner\GegnerX > 850 Or Gegner\GegnerX < -50 Then
Delete Gegner.Gegner
Else
DrawImage gegnerImage,Gegner\GegnerX,Gegner\GegnerY
Gegner\GegnerY = Gegner\GegnerY + Gegner\GegnerSpeedY
DebugLog gegner\gegnery
EndIf
Next
End Function

Function collision()
For Schuss.Schuss = Each Schuss
For Gegner.Gegner = Each Gegner
If ImagesOverlap(blaster,Schuss\SchussX,Schuss\SchussY,gegnerImage,Gegner\GegnerX,Gegner\GegnerY)
Delete Gegner
PlaySound(explodeSound)
EndIf
Next
Next
End Function

Function schuss()
For Schuss.Schuss = Each Schuss
If Schuss\SchussX < -3 Or Schuss\SchussX > 800 Or Schuss\SchussY < 0 Or Schuss\SchussY > 600 Then
Delete Schuss
Else
DrawImage blaster, Schuss\SchussX, Schuss\SchussY
Schuss\SchussX = Schuss\SchussX + Schuss\SchussSpeedX
Schuss\SchussY = Schuss\SchussY + Schuss\SchussSpeedY
End If
Next
End Function

Function checkkeys()
If KeyDown(203) And PlayerX >0 Then PlayerX = PlayerX - Speed
If KeyDown(205) And PlayerX <800-ImageWidth(Schiff) Then PlayerX = PlayerX + Speed
If KeyHit(57) Then
AddSchuss(PlayerX+14,PlayerY-2,0,-2)
PlaySound(blasterSound)
EndIf
End Function


ist nicht wunderschön, aber funktioniert. hab ... äh auch die gosubs durch funktionen ersetzt ...
A Cray is the only computer that runs an endless loop in less than four hours.
 

Mike84

BeitragDi, Mai 17, 2005 23:25
Antworten mit Zitat
Benutzer-Profile anzeigen
O.H....
Danke für die mühe die du dir gemacht hast
nur leuft es so etwas zu schnell bei mir ( Schumacher ist ein witz dagegen Laughing )
Auf jedenfall klapt es jetzt.
Nochmals Danke an alle die mir geholfen haben

Alfadur

BeitragMi, Mai 18, 2005 0:23
Antworten mit Zitat
Benutzer-Profile anzeigen
naja, das mit dem hintergrund hab ich ja rausgenommen, das nimmt speed weg... wenns zu schnell läuft, schau dir mal waittimer an...

aber an und für sich ists ja besser wenn was zu schnell läuft, abbremsen geht ja immer .-)

edit : achja, hab nochmal nachgedacht... das meins schneller läuft liegt daran das ich auch text weggelassen habe. text ist ein speed killer, sollte man nach möglichkeit nicht verwenden... wenn du text ausgeben willst, benutz lieber einen bitmapfont...
A Cray is the only computer that runs an endless loop in less than four hours.

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group