Kleines Problem mit Collision bei types

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

Schrolli

Betreff: Kleines Problem mit Collision bei types

BeitragMi, Sep 12, 2007 16:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi erstmal bin neu hier...

Ich heiße basti und bin 16 jahre und habe vor 3 tagen mit Blitz Basic angefangen.
Habe aber schon 2-jährige erfahrung in PHP, MySql, Java, usw... Zudem ein wenig C++.

Mein Problem...
Ich bin gerade dabei einen kleinen 2D-Weltraum-Shooter zu proggn.
Klappt soweit auch alles super. Trotz anfänglicher Probleme mit den types hab ich
es nun geschafft das die gegner erstellt werden und auch meine lasergeschosse in einem
weiteren type gespeichert werden...
Zudem hab ich eine abfrage für beide types gebaut, die das jeweilige bild löscht wenn es den bildschirm verlässt.
klappt eigt alles super...

Nur bei der Kollisionsabfrage hab ich riesen Probleme.

So werden die beiden Types definiert:

Code: [AUSKLAPPEN]

;Type shot laden
Type shot          ;erstellt den Type "shot"
 Field shot_x      ;x Koordinate
 Field shot_y      ;y Koordinate
End Type

;Type enemy laden
Type enemy          ;erstellt den Type "enemy"
 Field enemy_x      ;x Koordinate
 Field enemy_y      ;y Koordinate
End Type


Die Kollision wenn mein Shuttle einen Gegner trifft funzt schon... der gegner wird ausgeblendet, und bei
mir der schaden erhöt.
Das habe ich folgendermaßen reallisiert:

Code: [AUSKLAPPEN]

   If ImagesCollide(gegner,info\enemy_x,info\enemy_y,0, shuttle,20,shuttle_y,0) Then
    energy= energy-10 ; Schaden erhöhen
    Delete info.enemy ; Gegner löschen
    enemy_max= enemy_max-1 ; für die funktion irelevant. Nur zu testzwecken
   Else
    If info\enemy_x < -10 Delete info.enemy : enemy_max= enemy_max-1 ; Out of screen? Gegner löschen
   EndIf



Nur die Abfrage, wenn meine Geschosse einen gegner treffen bekomm ich nicht hin...
Könnt ihr mir helfen, oder zumindest mal ne kleinen Denkanstoß geben?

Thx basti...

EDIT:
evtl wichtig... die beiden types werden jeweils in einer seperaten function() bearbeitet...
das wären einmal die create_enemy() und die create_laser()
 

Matthias

BeitragMi, Sep 12, 2007 16:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Hay. Du müstest auf jedenfall eine doppelt verschachtelte For Each Schleife haben. Die jeden Schuss mit jeden Gegner checkt. Allerdings würde dies ziemlich viel CPU Leistung ziehen deshalb wäre es sinnvoll wenn du erst prüftst ob der schuss zb näher als 20px vom gegner entfernt ist und erst dann den ImagesCollide Befehl anwendest.

Aber am besten du Postest mal den gesamten Quellcode.
Mfg Matthias.
 

Schrolli

BeitragMi, Sep 12, 2007 16:39
Antworten mit Zitat
Benutzer-Profile anzeigen
also rein technisch passt des etz wie ich es mit den gegnern und einer kollision mit meinem shuttel gelöst hab?

Zu der anderen? Doppelt verschachtelt....Mhh Ich hab keine Ahnung wie ich da ansetzen soll, und wie ich die dann ineinander programmiern soll.... zudem ich mit types sowieso noch nicht perfekt klar komm...

könntest du mir mal ein prinzip abtippen? das ich dann einfach anpassen bzw einpassen könnte?
wäre echt nett...

Thx Basti
 

Matthias

BeitragMi, Sep 12, 2007 16:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Kleinen Moment ich mach dir mal ein Beispiel.
 

Schrolli

BeitragMi, Sep 12, 2007 17:20
Antworten mit Zitat
Benutzer-Profile anzeigen
alles klar... Thx... dann warte ich mal Cool
 

Matthias

BeitragMi, Sep 12, 2007 17:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Also so nach dem Prinzip kannst du es machen.

Code: [AUSKLAPPEN]

Graphics 800,600,32,2
;--------Erstellt die Images Schüsse-Gegner-Shuttel---------
Global shotImg=CreateImage(16,16):SetBuffer ImageBuffer(ShotImg)
Color 266,255,0:Oval 0,0,16,16:MidHandle(shotImg)

Global GegnerImg=CreateImage(64,64):SetBuffer ImageBuffer(GegnerImg)
Color 200,0,0:Oval 0,0,64,64:Rect 0,0,64,32:MidHandle(GegnerImg)

Global ShuttelImg=CreateImage(64,64):SetBuffer ImageBuffer(ShuttelImg)
Color 0,255,0:Oval 0,0,64,64:Rect 0,32,64,32:MidHandle(ShuttelImg)

Global Schuttel_Y=500:Schuttel_X=400

;-------Erzeugt 3Gegner und setzt diese zufällig--------
e.enemy=New enemy
e\enemy_x=Rand(50,750)
e\enemy_y=Rand(50,120)
e\RollRi=Rnd(-3,3);Bewegungsrichtung Links oder Rechts

e.enemy=New enemy
e\enemy_x=Rand(50,750)
e\enemy_y=Rand(50,120)
e\RollRi=Rnd(-3,3)

e.enemy=New enemy
e\enemy_x=Rand(50,750)
e\enemy_y=Rand(50,120)
e\RollRi=Rnd(-3,3)


SetBuffer BackBuffer()
Repeat
Cls
If KeyDown(203) Schuttel_X=Schuttel_X-5
If KeyDown(205) Schuttel_X=Schuttel_X+5



;Gegner/Schuss Bewegen
UpdateGegner()
UpdateSchuss()



;Eigender Flieger anzeigen-------
DrawImage ShuttelImg,Schuttel_X,Schuttel_Y


;----SpaceTaste für Schuss nur alle 50ms(Schussrate)
If KeyDown(57) And MilliSecs()>Timer+50 Then
Timer=MilliSecs()
s.shot=New shot
S\shot_x=Schuttel_X
S\shot_y=Schuttel_Y
End If

CheckCollision()


Flip
Until KeyDown(1)=1
End


Function CheckCollision()
;-------Jeden gegner mit jeden Schuss auf Collision prüfen
For e.enemy=Each enemy
   For S.Shot=Each Shot

       ;Vorabfrage ob Schuss im umkreis von 50px am gegner ist
        If S\shot_x>e\enemy_x-50 And S\shot_x<e\enemy_x+50 Then
        If S\shot_y>e\enemy_y-50 And S\shot_y<e\enemy_y+50 Then
 
;-------Schuss befindet sich im näher als 50px am Gegner               
            If ImagesCollide(GegnerImg,e\enemy_x,e\enemy_y,0,shotImg,S\shot_x,S\shot_y,0) Then
           
           ; Wenn der gegner getroffen ist dann kann kein schuss mehr mit ihm
           ;Colliedieren. Deshalb gegnener Löchen und den Schuss Löschen 
                         
           Delete e.enemy:Delete s.shot:Exit
           
 
           End If 
;---------------------------------------------------------------------------



        End If:End If
    Next
Next
End Function
 











Function UpdateGegner()
For e.enemy=Each enemy

DrawImage GegnerImg,e\enemy_x,e\enemy_y
;------Ist gegner zu weit Links oder Rechts dann einfach Richtung Wechseln
         If e\enemy_x<50 Or e\enemy_x>750 Then e\RollRi=e\RollRi*-1

e\enemy_x=e\enemy_x+e\RollRi
Next
End Function

Function UpdateSchuss()
For S.Shot=Each Shot
DrawImage shotImg,S\shot_x,S\shot_y
S\shot_y=S\shot_y-5:If s\shot_y<10 Then Delete s.Shot
Next
End Function




Type shot          ;erstellt den Type "shot"
 Field shot_x      ;x Koordinate
 Field shot_y      ;y Koordinate
End Type

;Type enemy laden
Type enemy          ;erstellt den Type "enemy"
 Field enemy_x      ;x Koordinate
 Field enemy_y      ;y Koordinate
 Field RollRi#
End Type

Und viel Erfolg. Mfg Matthias.
  • Zuletzt bearbeitet von Matthias am Mi, Sep 12, 2007 17:54, insgesamt einmal bearbeitet
 

Schrolli

BeitragMi, Sep 12, 2007 17:34
Antworten mit Zitat
Benutzer-Profile anzeigen
sry das ich das jetzt einfach so sag, wo du dir wahrscheinlich so viel mühe gegeben hast =(
aber ich kann dem code leider nciht ganz folgen...
 

Matthias

BeitragMi, Sep 12, 2007 17:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok Ich werde ihn etwas auskomentieren.
Ich hoffe du verstehst ihn jetzt besser.
 

Schrolli

BeitragMi, Sep 12, 2007 18:12
Antworten mit Zitat
Benutzer-Profile anzeigen
JAPP super danke... bin gerade dabei, alles stück für stück in meinen code einzupassen...
aba eine farge hab ich noch: wird in der function wo der gegner geupdatet wird überprüft, ob er den bildschirm verlassen hat?

Basti
 

Matthias

BeitragMi, Sep 12, 2007 18:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein. Wieso soll er dann tot sein wenn dies der fall ist?
Und Sollen deine Gegner auch schiessen können wenn dies der fall ist dann must du natürlich dein igendes schiff als gegner behandeln. Und deine eigenden schüsse mit einer kennung versehen damit du dich nicht selbst abschiest. Und wiederum die Gegner schüsse mit einer Kennung versehen damit die sich nicht abschiessen.
  • Zuletzt bearbeitet von Matthias am Mi, Sep 12, 2007 18:18, insgesamt einmal bearbeitet
 

Schrolli

BeitragMi, Sep 12, 2007 18:17
Antworten mit Zitat
Benutzer-Profile anzeigen
mom ich glaub du hast nicht ganz verstanden wie mein shooter abläuft Laughing ich hab dein script leicht angepasst...

ich steh fest auf der linken seite... kann nur hoch und runter...
die gegner fliegen auf mich zu... das heißt iwann sind sie an mir vorbei und verlassen den bildschirm...
die fliegen von rechts nach links... also muss ich sie ja löschen wenn sie weg sin...^^
wie soll ich das am besten machn?

Thx basti
 

Matthias

BeitragMi, Sep 12, 2007 18:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Aber eigentlich kannst du das Prinzip doch auch umdrehen. Und die Gegner bewegen wie die Schüsse.

Ich werde mal ein Quellcode schreiben und im in Quellcodearchiv stellern. Allerdings nicht mehr heute.
  • Zuletzt bearbeitet von Matthias am Mi, Sep 12, 2007 18:24, insgesamt einmal bearbeitet
 

Schrolli

BeitragMi, Sep 12, 2007 18:22
Antworten mit Zitat
Benutzer-Profile anzeigen
brauchst du eigt gahr nicht... es funtzt super... habs alles ein wenig angepasst...
mir fehlen nur noch 1 sache...

wenn sie mit mir collidieren auch löschen

EDIT: habs selbst hinbekommen, das sie gelöscht werden wenn sie den bildschirm verlassen. habs einfach egnau so gemacht wie bei den schüssen^^
  • Zuletzt bearbeitet von Schrolli am Mi, Sep 12, 2007 18:43, insgesamt einmal bearbeitet
 

Matthias

BeitragMi, Sep 12, 2007 18:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok habe dir den jetzt so umgebaut wie du es woltest

Code: [AUSKLAPPEN]

Graphics 800,600,32,2
;--------Erstellt die Images Schüsse-Gegner-Shuttel---------
Global shotImg=CreateImage(16,16):SetBuffer ImageBuffer(ShotImg)
Color 266,255,0:Oval 0,0,16,16:MidHandle(shotImg)

Global GegnerImg=CreateImage(64,64):SetBuffer ImageBuffer(GegnerImg)
Color 200,0,0:
Oval 0,0,64,64:Rect 32,0,32,64
MidHandle(GegnerImg)

Global ShuttelImg=CreateImage(64,64):SetBuffer ImageBuffer(ShuttelImg)
Color 0,255,0:
Oval 0,0,64,64:Rect 0,0,32,64:
MidHandle(ShuttelImg)

Global Schuttel_X=70,Schuttel_Y=100
Global MaxGeg=20
;-------Erzeugt 3Gegner und setzt diese zufällig--------
SeedRnd(22)


SetBuffer BackBuffer()
Repeat
Cls
If KeyDown(200) Schuttel_Y=Schuttel_Y-5
If KeyDown(208) Schuttel_Y=Schuttel_Y+5



;Gegner/Schuss Bewegen
UpdateGegner()
UpdateSchuss()



;Eigender Flieger anzeigen-------
DrawImage ShuttelImg,Schuttel_X,Schuttel_Y


;----SpaceTaste für Schuss nur alle 50ms(Schussrate)
If KeyDown(57) And MilliSecs()>Timer+50 Then
Timer=MilliSecs()
s.shot=New shot
S\shot_x=Schuttel_X
S\shot_y=Schuttel_Y

End If

CheckCollision()


Flip
Until KeyDown(1)=1
End


Function CheckCollision()
;-------Jeden gegner mit jeden Schuss auf Collision prüfen
For e.enemy=Each enemy
If ImagesCollide(GegnerImg,e\enemy_x,e\enemy_y,0,ShuttelImg,Schuttel_X,Schuttel_Y,0) Then
End
End If

   For S.Shot=Each Shot
       ;Vorabfrage ob Schuss im umkreis von 50px am gegner ist
        If S\shot_x>e\enemy_x-50 And S\shot_x<e\enemy_x+50 Then
        If S\shot_y>e\enemy_y-50 And S\shot_y<e\enemy_y+50 Then
 
;-------Schuss befindet sich im näher als 50px am Gegner               
            If ImagesCollide(GegnerImg,e\enemy_x,e\enemy_y,0,shotImg,S\shot_x,S\shot_y,0) Then
           
           ; Wenn der gegner getroffen ist dann kann kein schuss mehr mit ihm
           ;Colliedieren. Deshalb gegnener Löchen und den Schuss Löschen 
                         
           Delete e.enemy:Delete s.shot:Exit
           
 
           End If 
;---------------------------------------------------------------------------



        End If:End If
    Next


Next
End Function
 





Function SetNeuerGegner()
e.enemy=New enemy
e\enemy_x#=Rand(900,750)
e\enemy_y#=Rand(50,550)
e\Speed#=Rnd(.3,2)




End Function





Function UpdateGegner()
For e.enemy=Each enemy

DrawImage GegnerImg,e\enemy_x,e\enemy_y
;------Ist gegner zu weit Links oder Rechts dann einfach Richtung Wechseln


e\enemy_x=e\enemy_x-e\Speed
If e\enemy_x<0 Then Delete e.enemy



GegZa=GegZa+1
Next

NeuGeg=MaxGeg-GegZa
If NeuGeg>0 Then
For I=0 To NeuGeg
SetNeuerGegner()
Next
End If

End Function

Function UpdateSchuss()
For S.Shot=Each Shot
DrawImage shotImg,S\shot_x,S\shot_y
S\shot_x=S\shot_x+5:If s\shot_x>790 Then Delete s.Shot
Next
End Function




Type shot          ;erstellt den Type "shot"
 Field shot_x      ;x Koordinate
 Field shot_y      ;y Koordinate
End Type

;Type enemy laden
Type enemy          ;erstellt den Type "enemy"
 Field enemy_x#      ;x Koordinate
 Field enemy_y#     ;y Koordinate
 Field Speed#
End Type


Mfg Matthias
 

Schrolli

BeitragMi, Sep 12, 2007 18:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Alles klar... funtzt alles top... klasse arbeit, echt spitze...

nochmal danke für alles Very Happy Wink

basti


EDIT: sry für die blöde Frage etz hinterher... Ich arbeite nur mit der DEMO von BB2D... mir müsste das ganze dann iwann noch wer compillern... da ich als shüler im moment leider nicht das geld für eine vollversion aufbringen kann...
 

Matthias

Betreff: s

BeitragMi, Sep 12, 2007 19:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Demo ist nur dafür da um BlitzBasic kennen zu lernen.

BladeRunner

Moderator

BeitragMi, Sep 12, 2007 20:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
EDIT: sry für die blöde Frage etz hinterher... Ich arbeite nur mit der DEMO von BB2D... mir müsste das ganze dann iwann noch wer compillern... da ich als shüler im moment leider nicht das geld für eine vollversion aufbringen kann...

Nope, ist nicht zulässig und würde zum Ban führen.
Wenn Du .exe erstellen willst wirst Du das Geld investieren müssen.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

Schrolli

BeitragDo, Sep 13, 2007 14:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Asooo sry Ok...
Auf nen Ban will ichs dann au nich anlegen...

Basti

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group