Kleines Problem mit Collision bei types
Übersicht

SchrolliBetreff: Kleines Problem mit Collision bei types |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Kleinen Moment ich mach dir mal ein Beispiel. | ||
Schrolli |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
alles klar... Thx... dann warte ich mal ![]() |
||
Matthias |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ok Ich werde ihn etwas auskomentieren.
Ich hoffe du verstehst ihn jetzt besser. |
||
Schrolli |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
mom ich glaub du hast nicht ganz verstanden wie mein shooter abläuft ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Alles klar... funtzt alles top... klasse arbeit, echt spitze...
nochmal danke für alles ![]() ![]() 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... |
||
MatthiasBetreff: s |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Die Demo ist nur dafür da um BlitzBasic kennen zu lernen. | ||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Asooo sry Ok...
Auf nen Ban will ichs dann au nich anlegen... Basti |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group