Objekte kollision, beide Objekte löschen

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

marcel_bohn

Betreff: Objekte kollision, beide Objekte löschen

BeitragSa, Nov 06, 2010 16:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo ich bins nochmal, hab schon wieder ein problem Very Happy

Ich will, das wenn zwei objekte eines verschiedenen typs kollidieren beide objekte gelöscht werden.

bsp.:

Type alien

Field x,y

end type

type rocket

field x,y

end type

Wenn irgendein bild "a.alien" mit einem bild "r.rocket" kollidiert sollen beide verschwinden.
ich bekomm nur hin das ein objekt gelöscht wird Crying or Very sad

ich hoffe ihr versteht mein Problem und könnt mir weiter helfen Very Happy
schon mal danke im Vorraus!

Johannes´

BeitragSa, Nov 06, 2010 16:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Versuche es mal so:
Code: [AUSKLAPPEN]
For r.rocket=Each rocket
   For a.alien=Each alien
      If ImagesCollide(a\bild,a\x,a\y,a\frame,r\bild,r\x,r\y,r\frame) Then
         FreeImage a\bild:Delete a.alien
         FreeImage r\bild:Delete r.rocket
         Exit
      EndIf
   Next
Next
  • Zuletzt bearbeitet von Johannes´ am Sa, Nov 06, 2010 16:49, insgesamt 2-mal bearbeitet

Starwar

BeitragSa, Nov 06, 2010 16:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Für mehrere Objekte, die das selbe Bild zeichnen sollte man aber nicht immer das selbe Bild neu laden. Nur so als Hinweis.
MFG

marcel_bohn

BeitragSa, Nov 06, 2010 16:41
Antworten mit Zitat
Benutzer-Profile anzeigen
hmmm... das geht irgendwie nicht... sobald ich
"delete r.rocket" hin schreibe stürzt das programm bei der kollision ab und gibt die fehlermeldung "objekt doesn't exist" raus. wenn ich das "delete r.rocket" weg mach und nur noch das "delete a.alien" da steht funktioniert es, bloß meine rakete fliegt dann leider ungehindert weiter...

marcel_bohn

BeitragSa, Nov 06, 2010 16:44
Antworten mit Zitat
Benutzer-Profile anzeigen
es funktioniert ja alles, die gegner kommen auf mich zu und ich kann sie kaputt schießen nur will ich halt das die rakete verschwindet wenn sie einen gegner getroffen hat

M0rgenstern

BeitragSa, Nov 06, 2010 16:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Gib deinem Raketen und deinem Alientyp ein Attribut IsDead#
Dann machst du folgendes:

BlitzBasic: [AUSKLAPPEN]
For r.rocket=Each rocket
For a.alien=Each alien
If a\IsDead = 0 And r\IsDead = 0
If ImagesCollide(a\bild,a\x,a\y,a\frame,r\bild,r\x,r\y,r\frame) Then
a\IsDead = 1
r\IsDead = 1
EndIf
Next
Next


Dann brauchst du nur noch sone Funktion für jeden Typ:
BlitzBasic: [AUSKLAPPEN]
Function DeleteDead()
For r.rocket = Each rocket
If r\IsDead = 1 Then Delete r.rocket
Next


Lg, M0rgenstern.

Nebenbei: Vergiss das mit dem Freeimage ganz schnell. Dadurch löschst du das Bild aus dem Speicher und das wäre fatal.

Johannes´

BeitragSa, Nov 06, 2010 16:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Du hast recht, der Code kann nicht funktionieren, da er auch nach dem Löschen einer Rakete versucht, die noch folgenden Aliens mit dieser gelöschten Rakete auf Kollision zu prüfen. Ich habe meinen Code eben geändert, versuche es mal damit.

marcel_bohn

BeitragSa, Nov 06, 2010 17:02
Antworten mit Zitat
Benutzer-Profile anzeigen
alles klar, danke morgenstern Very Happy hat funktioniert. Zum glück hab ich mich endlich in so nem tolen forum angemeldet. jetzt hock ich net mehr 10 stunden vor nem problem und hab immer noch keine lösung.

Vielen Vielen Dank!!!

Johannes´

BeitragSa, Nov 06, 2010 17:08
Antworten mit Zitat
Benutzer-Profile anzeigen
@ Morgenstern:
Ich habe bisher am Anfang immer ein Bild geladen, das dann mit CopyImage kopiert, wenn ich es mehrmals gebraucht habe. Wenn das kopierte Bild nicht mehr gebraucht wurde, dann habe ich es eben mit FreeImage gelöscht.
Was ist am Löschen dann fatal und wie löst du soetwas?

@marcel_bohn:
Du musst sie ja nicht verwenden, aber es würde mich jetzt schon interessieren, ob meine Lösung funktioniert.

Hubsi

BeitragSa, Nov 06, 2010 17:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Johannes´ hat Folgendes geschrieben:
Was ist am Löschen dann fatal und wie löst du soetwas?


Dasselbe Bild kann beliebig oft auf den Bildschirm gezaubert oder sonstwie verwendet werden. Was dann einfach den Grakaspeicher entlastet. Ein und denselben Datenhaufen mehrmals in den Speicher zu schaufeln ist Murks Mr. Green
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

marcel_bohn

BeitragSa, Nov 06, 2010 17:26
Antworten mit Zitat
Benutzer-Profile anzeigen
wo hast du denn den code gepostet?

Johannes´

BeitragSa, Nov 06, 2010 17:30
Antworten mit Zitat
Benutzer-Profile anzeigen
@ Hubsi und Morgenstern:
Gut, dann war das Löschen wirklich Murks. Ich habe es wohl zusehr auf den 3D-Bereich bezogen. Danke, ich habe dazugelernt.

@ marcel_bohn:
Ich habe den ersten Code einfach abgeändert. Mit dem Löschen der Bilder scheint aber wirklich Murks zu sein, lass also das FreeImage weg.

marcel_bohn

BeitragSa, Nov 06, 2010 17:50
Antworten mit Zitat
Benutzer-Profile anzeigen
ok also mit exit funzt es genau so gut Smile danke nochmal an euch alle

M0rgenstern

BeitragSa, Nov 06, 2010 18:07
Antworten mit Zitat
Benutzer-Profile anzeigen
@Johannes:
Mit Copyimage?
Das brauchst du nicht.
Du machst einfach folgendes:
BlitzBasic: [AUSKLAPPEN]
Type Gegner
Field img
Field x, y
End Type


Und in der hauptschleife:
BlitzBasic: [AUSKLAPPEN]
Global enemyimg = LoadImage("pfad")
For index = 1 To 5
Local Enemy = New Gegner
Enemy\X = Rand(20,50)
Enemy\Y = Enemy\X
Enemy\img = enemyimg
Next


Du hast somit ne Referenz, also ein Zeiger auf das Bild. Es liegt einmal im Speicher und kann von allen "Gegner" Instanzen genutzt werden.
Wenn du Copyimage machst, dann hast verbrauchst du pro erstellten Gegner einmal den Speicherplatz den das komplette Bild braucht. Mit einem Zeiger belegst du aber gar keinen Speicherplatz.

Lg, M0rgenstern

marcel_bohn

BeitragSa, Nov 06, 2010 18:23
Antworten mit Zitat
Benutzer-Profile anzeigen
@MOrgenstern

ich versteh noch nicht so ganz warum das bild in das objekt geladen wird
Enemy\img = enemyimg kannst du mir das erklären?

M0rgenstern

BeitragSa, Nov 06, 2010 19:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Stück Code das ich da gepostet habe zeigt einen Teil vom Code wie er am Anfang des Programms stehen könnte.
Du lädst erstmal das Bild global ein:
BlitzBasic: [AUSKLAPPEN]
Global enemyimg = LoadImage("pfad")

Dass der Gegner Type ein eigenes Image Feld hat ist einfach praktisch, weil man so schnell Gegner erstellen kann die unterschiedlich aussehen.
Du kannst dem einen Das oben geladene Bild übergeben oder ein anderes.
Dann hast du die Möglichkeit eine DrawMethode zu basteln:
BlitzBasic: [AUSKLAPPEN]
Function DrawEnemies()
For e.enemy = Each enemy
DrawImage(e\img, e\X, e\Y)
Next


Dadurch ist es egal, welches Bild der Gegner geladen hat, es wird immer das Bild gemalt das gerade zur INstanz gehört.
Dadurch kann man halt relativ einfach verschiedene Gegnertypen erstellen.

Lg, M0rgenstern

Johannes´

BeitragSa, Nov 06, 2010 21:38
Antworten mit Zitat
Benutzer-Profile anzeigen
@ M0rgenstern:
Deine Methode ist wirklich um Einiges besser. Ich orientiere mich wohl viel zu sehr am 3D-Bereich.

Aber in der Hauptschleife willst du doch nicht wirklich das Bild laden und die Gegner erstellen? Wink

Ansonsten danke ich dir.

M0rgenstern

BeitragSo, Nov 07, 2010 12:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein, nicht in der Hauptschleife.
Hab mich falsch ausgedrückt, tut mir leid. Ich meinte VOR der Hauptschleife^^

Lg, M0rgenstern

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group