(Super-)Kollision

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

Kryan

Betreff: (Super-)Kollision

BeitragMi, Sep 20, 2006 21:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo leutz,

hier ist eine stink normale Funktion, um eine Kollision zu entdecken. Nur eins ist besonders: Die Funktion speichert sich, wo die Kollision stattgefunden hat, und damit kann man dann verschiedene Sachen machen. Hier paar Möglichkeiten zur Verwendung dieser Funktion:

- In einem Kampfspiel will man genau an den Orten, wo der Macker den anderen trifft, eine Animation spielen lassen.
- In einem 2d-JumpnRun-Schießspiel (wie zB Bastard, kennt ihr bestimmt Smile ) will man an der Stelle, wo die Kugel den Gegner trifft, Blut sichtbar werden lassen.

So viel dazu. Hier erstmal ein Screen, wie es in etwa aussieht:

user posted image

Hier die Funktion...Oder erst ne kurze Erklärung der Types:
-Collision: jede Kollisions-Prüfung erstellt ein neues .Collision
-Collision_Pos: merkt sich die Positionen der Kollisionen
Und es seien auch noch die Parameter der Funktion erklärt:
Also img,x und y sind ja logisch. Bck soll die Hintergrundfarbe des Bildes sein (schon als RGB-Wert)....Ok, nun aber die Funktion:

Code: [AUSKLAPPEN]
Type collision
 Field img1,img2,x1,y1,x2,y2
End Type
Type collision_pos
 Field x,y,c.collision
End Type

Function CheckCollision.collision(img1,x1,y1,img2,x2,y2,bck1,bck2)
 x_abw=x1-x2:y_abw=y1-y2
 c.collision=New collision
 c\img1=img1:c\x1=x1:c\y1=y1
 c\img2=img2:c\x2=x2:c\y2=y2
 w1=ImageWidth(img1):h1=ImageHeight(img1)
 w2=ImageWidth(img2):h2=ImageHeight(img2)
 LockBuffer(ImageBuffer(img1))
 LockBuffer(ImageBuffer(img2))
 For x=0 To w1-1
  For y=0 To h1-1
   If x+x_abw>-1 And x+x_abw<w2 And y+y_abw>-1 And y+y_abw<h2 Then
    rgb1=ReadPixelFast(x,y,ImageBuffer(img1))
    rgb2=ReadPixelFast(x+x_abw,y+y_abw,ImageBuffer(img2))
    If rgb1<>bck1 And rgb2<>bck2 Then
     cp.collision_pos=New collision_pos
     cp\x=x+x1
     cp\y=y+y1
     cp\c=c
    End If
   End If
  Next
 Next
 UnlockBuffer(ImageBuffer(img1))
 UnlockBuffer(ImageBuffer(img2))
 Return c
End Function


Es braucht ca. 60 Msek bei den Bildern die ich benutzt habe!
So und hier alles mit einer test.bb noch zusätlich:
https://www.blitzforum.de/upload/file.php?id=510

Viel Spaß,
Kryan
Webspaceanbieter?
Klick hier!
Kultige Spieleschmiede?
Klick hier!

PowerProgrammer

BeitragMi, Sep 20, 2006 21:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Eigentlich der LEISTUNGSFRESSER! Wohl nicht realtime-fähig, Kryan. Der Code gefällt mir aber trotzdem.
www.xairro.com Alles für Webmaster und Programmierer! Es gibt mehr als bloß einen Counter!

Kryan

BeitragMi, Sep 20, 2006 21:18
Antworten mit Zitat
Benutzer-Profile anzeigen
nana, man braucht so eine Funktion ja nicht zu jeder Zeit in seinem Spiel, und außerdem habe ich relativ große Bilder genommen. Wenn man nun dem Beispiel mit den Schüssen Folge leisten würde, dann würden sehr geringe Leistungseinbußungen vorhanden sein Smile
Webspaceanbieter?
Klick hier!
Kultige Spieleschmiede?
Klick hier!

StepTiger

BeitragMi, Sep 20, 2006 22:50
Antworten mit Zitat
Benutzer-Profile anzeigen
ganz gut, jedoch wirklich etwas langsam
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.

Kryan

BeitragDo, Sep 21, 2006 18:03
Antworten mit Zitat
Benutzer-Profile anzeigen
naja, durch bestimmte Einbußungen kann man etwas schneller machen: Nur jeden 2ten Pixel auf der X und auf der Y-Achse abfragen: schon 4mal so schnell!!!
Webspaceanbieter?
Klick hier!
Kultige Spieleschmiede?
Klick hier!

Travis

BeitragDo, Sep 21, 2006 19:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Nicht übel. Ich hatte damals mal ein ähnliches Projekt, allerdings komplett ohne ImagesCollide. Dafür habe ich für die Grafiken einfach ein Array angelegt und jeden Pixel als massiv oder durchlässig gekennzeichnet. Bei der Prüfung habe ich die Arrays dann einfach übereinandergelegt und verglichen. Das war zwar ungemein komplizierter, aber ich denke auch schneller.
www.funforge.org

Ich hasse WASD-Steuerung.

Man kann alles sagen, man muss es nur vernünftig begründen können.

Kryan

BeitragDo, Sep 21, 2006 19:53
Antworten mit Zitat
Benutzer-Profile anzeigen
jo, ich hab ja auch kein ImagesCollide. Ich mach es so ähnlich wie du, nur dass ich es nicht in einem Array zwischenspeichere und die Kollisionsorte halt in einem Type speichere. Letzteres finde ich ja relativ wichtig Smile
Webspaceanbieter?
Klick hier!
Kultige Spieleschmiede?
Klick hier!

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group