Manuelles ImagesCollide

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

Travis

Betreff: Manuelles ImagesCollide

BeitragMo, Aug 09, 2004 22:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Für ein zukünftiges Projekt, habe ich schon mal eine neue Kollisionsprüfung entwickelt, die ohne Imagescollide arbeitet.

Dabei wird für jedes Bild ein Array angelegt, welches für jeden Pixel eine Information enthält, ob und wie er bei der Kollisionsabfrage berücksichtigt werden soll. Das hat den Vorteil, dass man die Koordinaten jedes Pixels, das kollidiert bestimmen kann. Außerdem kann man mehrere Arten von Aktionen bei der Bildkollision ausführen, wenn man im Kollisions-Array noch andere Werte als Null und Eins eintragen würde. Außerdem kann man auch die Stärke der Kollision bestimmen, indem man einfach die kollidierten Pixel zählt.

Vielleicht kann es ja außer mir noch einer gebrauchen. Mir wird es bei meinem nächsten Projekt jedenfalls sehr hilfreich sein. Very Happy


Code: [AUSKLAPPEN]

Global ResX = 640
Global ResY = 480

Graphics ResX,ResY,16,2

AppTitle "Manuelle Kollision by Travis"
Text (ResX/2)-40,ResY/2, "Please wait...": Flip



; --- Spielergrafiken ---
SpielerGfx = CreateImage(30,20)
SetBuffer ImageBuffer(SpielerGfx)
Line 0,0,0,19
Line 0,0,29,10
Line 0,19,29,10
ScaleImage SpielerGfx, .5,.5

Dim Spieler(360)

For i = 0 To 359
 Spieler(i) = CopyImage(SpielerGfx)
 RotateImage Spieler(i), i
 MidHandle Spieler(i)
 MaskImage Spieler(i), 0,0,0
Next
; --- Spielergrafiken ---



; --- Mapgrafik erstellen ---
Global Map = CreateImage(ResX, ResY)
SetBuffer ImageBuffer(Map)

Color 0,0,200
Rect 0,0,ResX,ResY,1

Color 0,0,0
Oval 0,0,ResX,ResY,1

Color 0,0,200
Rect 50, (ResY/2)-10, ResX-100,20,1

Color 0,0,200
Rect (ResX/2)-10, 50, 20, ResY-100

SetBuffer BackBuffer()
; --- Mapgrafik erstellen ---



; ------ Kollisions Maps für Spieler erstellen ------

; Maximale Bilddimensionen ermitteln (für Array)
For i = 0 To 359
 w = ImageWidth(Spieler(i))
 h = ImageHeight(Spieler(i))
 
 If w > maxw Then maxw = w
 If h > maxh Then maxh = h
Next


Dim KollisionSpieler(360,MaxW,MaxH)
Dim KollisionSpielerW(360)
Dim KollisionSpielerH(360)


For i = 0 To 359
 w = ImageWidth(Spieler(i))
 h = ImageHeight(Spieler(i))

 KollisionSpielerW(i) = w
 KollisionSpielerH(i) = h

 For y = 0 To h
  For x = 0 To w
   rgb = ReadPixelFast(x,y,ImageBuffer(Spieler(i)))
   If rgb = -16777216 Then KollisionSpieler(i,x,y) = 0
   If rgb <> -16777216 Then KollisionSpieler(i,x,y) = 1
  Next
 Next

 ; -- zur Kontrolle anzeigen ---
 VisualSpieler = CreateImage(w,h)

 LockBuffer ImageBuffer(VisualSpieler)
  For y = 0 To h
   For x = 0 To w
    If KollisionSpieler(i,x,y) = 1 Then WritePixelFast(x,y,$CC0000,ImageBuffer(VisualSpieler))
   Next
  Next 
 UnlockBuffer ImageBuffer(VisualSpieler)
 
 SetBuffer BackBuffer()
 Cls
  Text 0,0, "Erzeuge Kollisions-Maps für die Spielergrafiken... " + i + "/359"
  Color 255,000,000: Text 0,15, "Kollisions-Map Spieler"
  Color 255,255,255: Text 0,30, "Spielerbild"
  DrawImage Spieler(i), 50,100
  DrawImage VisualSpieler, 100-KollisionSpielerW(i)/2, 100-KollisionSpielerH(i)/2
 Flip
 ; -- zur Kontrolle anzeigen ---

Next
; ------ Kollisions Maps für Spieler erstellen ------



; --- Kollisions Map für Hintergrund erstellen ---
w = ImageWidth(Map)
h = ImageHeight(Map)

Dim KollisionMap(w,h)

LockBuffer ImageBuffer(Map)

For y = 0 To h
 For x = 0 To w
  rgb = ReadPixelFast(x,y,ImageBuffer(Map))
  If rgb = -16777216 Then KollisionMap(x,y) = 0
  If rgb <> -16777216 Then KollisionMap(x,y) = 1
 Next
Next 

UnlockBuffer ImageBuffer(Map)
; --- Kollisions Map für Hintergrund erstellen ---



; --- Spieler erstellen ---
Type Spieler
 Field x#,y#,sx#,sy#,winkel
End Type

s.spieler = New spieler
s\x = 200
s\y = 120
s\winkel = 270
; --- Spieler erstellen ---



; --- Hauptschleife ---
SetBuffer BackBuffer()
Repeat
 Cls

  DrawImage Map, 0, 0

  UpdateSpieler()

  If KeyHit(57) Then s\sy = 0: s\sx=0 ; SPACE - Spieler anhalten

  Text 0,0, "Use arrow keys to move. Use Space to stop."

 Flip 1
Until KeyHit(1)
End
; --- Hauptschleife ---



; --- Spieler aktualisieren ---
Function UpdateSpieler()
 s.spieler = First spieler
 
 ; Beschleunigen
 If KeyDown(200) Then
  s\sx# = s\sx# + Cos(s\winkel) * .01
  s\sy# = s\sy# + Sin(s\winkel) * .01
 EndIf
 
 ; Abbremsen
 If KeyDown(208) Then
  s\sx# = s\sx# - Cos(s\winkel) * .01
  s\sy# = s\sy# - Sin(s\winkel) * .01
 EndIf

 ; Links
 If KeyDown(203) Then
  s\winkel = s\winkel - 2
 EndIf

 ; Rechts
 If KeyDown(205) Then
  s\winkel = s\winkel + 2
 EndIf

 ; Winkelkorrektur
 If s\winkel < 0 Then s\winkel = 359
 If s\winkel > 359 Then s\winkel = 0

 ; Bewegung
 s\x# = s\x# + s\sx#
 s\y# = s\y# + s\sy#

 ; Bildschirmgrenzen
 If s\x < 0 Then s\x = ResX
 If s\x > ResX Then s\x = 0
 If s\y < 0 Then s\y = ResY
 If s\y > ResY Then s\y = 0

 ; Schiff anzeigen
 DrawImage Spieler(s\winkel), s\x, s\y
 

 ; Kollisionsabfrage
 For y = 0 To KollisionSpielerH(s\winkel)-1
  For x = 0 To KollisionSpielerW(s\winkel)-1
    If x+s\x-(KollisionSpielerW(s\winkel)/2) > 0 And x+s\x-(KollisionSpielerW(s\winkel)/2) < ResX Then   ; Keine ungültigen Werte im Array prüfen
     If y+s\y-(KollisionSpielerH(s\winkel)/2) > 0 And y+s\y-(KollisionSpielerH(s\winkel)/2) < ResY Then  ; Keine ungültigen Werte im Array prüfen

        If KollisionSpieler(s\winkel, x, y) = 1 Then
         If KollisionMap(x+s\x-KollisionSpielerW(s\winkel)/2, y+s\y-KollisionSpielerH(s\winkel)/2) = 1 Then
         Text 100,270, "(es wird nur ein Kollisionspunkt pro Bild angezeigt)"
         Text 150,240, "KOLLISION AM SPIELERBILD: " + x + " " + y
         Text 150,250, "KOLLISION AM MAPBILD    : " + (x+s\x-KollisionSpielerW(s\winkel)/2) + " " + (y+s\y-KollisionSpielerH(s\winkel)/2)
         Color 0,255,0:Plot (x+s\x-KollisionSpielerW(s\winkel)/2), (y+s\y-KollisionSpielerH(s\winkel)/2) ; Kollisionspunkt im Bild anzeigen
         Goto NurEinKoordinatenPaarErmitteln
        EndIf
       EndIf
       
      EndIf
     EndIf
   Next
  Next
 ; Kollisionsabfrage


 .NurEinKoordinatenPaarErmitteln
End Function
; --- Spieler aktualisieren ---


[mod] CodeTags gefixt. BladeRunner[/mod]
www.funforge.org

Ich hasse WASD-Steuerung.

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

judos

Betreff: fehler

BeitragSa, Sep 18, 2004 18:32
Antworten mit Zitat
Benutzer-Profile anzeigen
bei mir löst dieses programm immer ein fehler aus :

blitzcc hat in kernel32.dll einen fehler verursacht...

warum erscheint bei mir diese Fehler meldung ???

Mooch

BeitragMo, Mai 23, 2005 18:15
Antworten mit Zitat
Benutzer-Profile anzeigen
For y = 0 To h
For x = 0 To w
rgb = ReadPixelFast(x,y,ImageBuffer(Spieler(i)))
If rgb = -16777216 Then KollisionSpieler(i,x,y) = 0
If rgb <> -16777216 Then KollisionSpieler(i,x,y) = 1
Next
Next

ist falsch (auf manchen systemen funzt es)

For y = 0 To h-1
For x = 0 To w-1
rgb = ReadPixelFast(x,y,ImageBuffer(Spieler(i)))
If rgb = -16777216 Then KollisionSpieler(i,x,y) = 0
If rgb <> -16777216 Then KollisionSpieler(i,x,y) = 1
Next
Next

so gehts bestimmt auch auf judos pc Wink
Pentium IV 3.0Ghz; nVidia Geforce 6800;
Microsoft Windows XP Home SP2; BlitzBasic 3D

.:: Sites ::.
.:: http://www.fl4sh-clan.de/ ::.


Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group