Seite 1 von 1

Hilfe bei der Collision und geschwindigkeit

Verfasst: 09.04.2010 19:26
von Marvin133
guten tag zusammen ich habe mit hilfe vieleer leute hier aus dem forum einn beta version des spiels jump or die programmiert.wen man zu sich zu erst bewegt klappt auch alles ganz flüssig nur wenn man den stern berührt harkt es sehr stark und ich vermute das an der collisions abfrage liegt nur ich kann mir den fehler inicht erklären.

Code: Alles auswählen

InitSprite()
InitSprite3D()
InitKeyboard()
InitSound()
InitMovie()

;Procedure Collision
Procedure BoxKolli(X1,Y1,W1,H1,  X2,Y2,W2,H2)
  If X1<X2+W2 And X1+W1>X2
    If Y1<Y2+H2 And Y1+H1>Y2
    ProcedureReturn 1
    EndIf
  EndIf
ProcedureReturn 0
EndProcedure


#W=16
#H=16
s=16
l=16



;Leveldaten
Dim Feld(#W,#H)
Dim solid(s,l)

For i=0 To 16 Step 1
 solid(i,11)=1
Next

;Variables
audio=100
Score=0


;Screen
ExamineDesktops()
OpenWindow(0,0,0,1024,768,"Basic Ghost v1.0")
OpenWindowedScreen(WindowID(0),0,0,1024,768,0,0,0)

;Sound
LoadSound(0,"sfx\flag.wav")
LoadMovie(0,"sfx\music\background.mp3")

;Jetzt brauchen wir noch ein paar Grafiken
LoadSprite(0,"gfx\player.bmp",0)
TransparentSpriteColor(0,$FFFFFF)

LoadSprite(1,"gfx\stone.bmp",0)
TransparentSpriteColor(1,$FFFFFF)


LoadSprite(2,"gfx\sun.bmp",0)
LoadSprite(20,"gfx\sun.bmp",#PB_Sprite_Texture)

LoadSprite(3,"gfx\door.bmp",0)
TransparentSpriteColor(3,$FFFFFF)

LoadSprite(4,"gfx\next-level.bmp",0)
TransparentSpriteColor(4,$FFFFFF)

CreateSprite3D(1,20)

;Die Variabeln für den Spieler
Define.l PlayerX,PlayerY;Position
Define.f MoveX,MoveY


PlayerW=SpriteWidth(0) ;Breite des Spielers
PlayerH=SpriteHeight(0);Höhe des Spielers

TileW=SpriteWidth(1) ;Breite eines Tiles
TileH=SpriteHeight(1);Höhe eines Tiles

Define.b OnGround;


For i=0 To 10 Step 1
PlayMovie(0,WindowID(0))
Next


Repeat
  
  ExamineKeyboard()
  Start3D()
  
  If IsScreenActive()
  ClearScreen(RGB(100,0,255))
  ExamineKeyboard()
 
    
    If KeyboardPushed(#PB_Key_Escape)
    End
    EndIf
   
 
    MoveX=0
    MoveY+0.5
    
    If KeyboardPushed(#PB_Key_Left)
    MoveX-5
    EndIf
    If KeyboardPushed(#PB_Key_Right)
    MoveX+5
    EndIf
   
    If OnGround
      If KeyboardPushed(#PB_Key_Space)
      MoveY=-15 ;Größerer Wert=Höherer Sprung
      PlaySound(0)
      EndIf
    EndIf
 
 

  ;Variables Player
  PlayerY+MoveY
  OnGround=0
  Hit=0
    
    
    ;***********Not Solid***********
    
    
    ;Collision Y
    
    For x=0 To #W
      For y=0 To #H
        If Feld(x,y)=1 
          If BoxKolli(x*TileW,y*TileH,TileW,TileH,PlayerX,PlayerY,PlayerW,PlayerH) ;
          Feld(x,y)=0
          Score=Score+1
          Hit=1
            If MoveY<0; 
            PlayerY=Y*TileH+TileH;Untere Seite
            ElseIf MoveY>0
            OnGround=1
            PlayerY=Y*TileH-PlayerH;Linke Seite
            EndIf
          EndIf
        EndIf
      Next y
    Next x
    If Hit=1
       MoveY=0
    EndIf

  ;Collision X 
  PlayerX+MoveX
  Hit=0
    For x=0 To #W
      For y=0 To #H
        If Feld(x,y)=1
          If BoxKolli(x*TileW,y*TileH,TileW,TileH,PlayerX,PlayerY,PlayerW,PlayerH)
          Hit=1
            If MoveX<0
            PlayerX=X*TileW+TileW
            ElseIf MoveX>0
            PlayerX=X*TileW-PlayerW
            EndIf
          EndIf
        EndIf
      Next y
    Next x
    If Hit=1
       MoveX=0
    EndIf
    
    
    
    ;***********Solid***********
    
    
    ;Colision Y
    
    For x=0 To s
      For y=0 To l
        If solid(x,y)=1 
          If BoxKolli(x*TileW,y*TileH,TileW,TileH,PlayerX,PlayerY,PlayerW,PlayerH)
              Hit=1
            If MoveY<0
            PlayerY=Y*TileH+TileH;Untere Seite
            ElseIf MoveY>0
            OnGround=1
            PlayerY=Y*TileH-PlayerH;Linke Seite
            EndIf
          EndIf
        EndIf
      Next y
    Next x
    If Hit=1
       MoveY=0
    EndIf

  ;Collision X
    For x=0 To s
      For y=0 To l
        If solid(x,y)=1
          If BoxKolli(x*TileW,y*TileH,TileW,TileH,PlayerX,PlayerY,PlayerW,PlayerH)
          Hit=1
            If MoveX<0
            PlayerX=X*TileW+TileW
            ElseIf MoveX>0
            PlayerX=X*TileW-PlayerW
            EndIf
          EndIf
        EndIf
      Next y
    Next x
    If Hit=1
    MoveX=0
    EndIf
 
    
    
    
    If SpriteCollision(0,PlayerX,PlayerY,3,800,650)=1
       
       DisplayTransparentSprite(4,500,500)
       
       For i=0 To 16 Step 1
         Feld(i,11)=1
       Next
       
       For i=0 To 9 Step 1
         Feld(i,9)=1
       Next
       
       For i=0 To 9 Step 1
         Feld(i,3)=1
       Next
    EndIf
    
 
    ;Draw solid
    For x=0 To s
      For y=0 To l
        Select solid(x,y)
          Case 0
          Case 1
          DisplayTransparentSprite(1,x*TileW,y*TileH)
        EndSelect
      Next y
    Next x


    ;Draw not solid
    For x=0 To #W
      For y=0 To #H
        Select Feld(x,y)
          Case 0
          Case 1
          DisplayTransparentSprite(1,x*TileW,y*TileH)
        EndSelect
      Next y
    Next x 


  ;Display Sprites
 
  DisplayTransparentSprite(0,PlayerX,PlayerY)
  
  DisplayTransparentSprite(3,800,650)
  
  DisplaySprite3D(1,100,100)
  RotateSprite3D(1,2, #PB_Relative)
  
  FlipBuffers()
  EndIf
  
  If KeyboardReleased(#PB_Key_PadEnter)
     PlayerY=32
  EndIf
 
  If KeyboardReleased(#PB_Key_Add)
     audio=audio+10
     MovieAudio(0,audio,0)
  If audio>=100
     audio=100
  EndIf
  EndIf   
  
    If KeyboardReleased(#PB_Key_PadEnter)
     PlayerY=32
  EndIf
 
  If KeyboardReleased(#PB_Key_Subtract)
     audio=audio-10
     MovieAudio(0,audio,0)
  If audio>=100
     audio=100
  EndIf
  EndIf  
  
  If KeyboardReleased(#PB_Key_R)
     For i=0 To 16 Step 1
       Feld(i,11)=1
     Next
     
     PlayerX=0
     PlayerY=0
     MoveY=0
     Score=0
  EndIf
  

  
ForEver

Re: Hilfe bei der Collision und geschwindigkeit

Verfasst: 09.04.2010 21:13
von Mok
Probier's mal mit SpritePixelCollision()

Re: Hilfe bei der Collision und geschwindigkeit

Verfasst: 09.04.2010 21:29
von Marvin133
Leider hab ich eine sprite collision nicht mit einr pb funktion benuttzt sondern eine eigene geschreieb nund ich wüsste nicht wie ich dei collisions abfrage für die ganze mpa machen könnte :(

Ich hoffe ihr habt ein paar einfälle

Mfg. Marvin 133 :D

Re: Hilfe bei der Collision und geschwindigkeit

Verfasst: 09.04.2010 22:38
von STARGÅTE
Marvin133 hat geschrieben:wenn man den stern berührt harkt es sehr stark
Hm, um das zu bestätigen müssten wir den Code ausführen können, was ohne Grafik, Sound, ... nicht geht.

Außerdem was heißt bei dir "harkt es sehr stark"?
- Weil die FPS runtergehen ?
- Weil die Sprites "ruckeln", weil sie dauern verschoben werden ?
- ... ?

Re: Hilfe bei der Collision und geschwindigkeit

Verfasst: 09.04.2010 22:42
von Marvin133
es laggt nicht weil dir fps sich senken, sondern weil sich die collision immer kurz aufhäng und ab und zu kann man sich nicht bewegen.

in etwas so,nachdem hinter einer collisions abfrage ein delay(1000) setzt.

hier ist der link zum source und sprites:


http://em.q-soft.ch/files/get/k-KHI2v7r ... -ghost.zip

Re: Hilfe bei der Collision und geschwindigkeit

Verfasst: 09.04.2010 22:46
von ts-soft
Die Rechtschreibung sollte zumindest soweit stimmen, das Dein Beitrag verstanden werden kann.
Dieser Kauderwelsch ist unverständlich. Also, bitte mehr Mühe geben.

Re: Hilfe bei der Collision und geschwindigkeit

Verfasst: 10.04.2010 10:02
von Marvin133
Ich vermute mal das es an der collision der x achse liegt und zwar von not solid elementen.Aber trotzdem weis ich nicht woran es liegt :(

Bitte versuch doch einmal den fehler zu finden oder mir zu helfen. :mrgreen:

Mfg. Marvin133