frage zu SpritePixelCollision()

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
True29
Beiträge: 283
Registriert: 18.08.2012 19:18
Computerausstattung: Windows 8 64bit .Profan x2,Purebasic 5.5
Wohnort: Worms
Kontaktdaten:

frage zu SpritePixelCollision()

Beitrag von True29 »

Hallo , ich wollte spritepixelcollision nehmen und zu prüfen ob ein ball ein tor berührt um ihm so abbrallen zu lassen.
Dafür habe ich eine Rechteckige grafik gemalt mit einer offenen seite als tor.

Code: Alles auswählen

Fehlerbehandlung(CatchSprite(#spritegoaldumpb,?goaldumpb,#PB_Sprite_PixelCollision),"Fehler beim laden von Grafik")      

ZoomSprite(#spritegoaldumpb,70,160)
DisplayTransparentSprite(#spritegoaldumpb,torb.playField\line_left,torb.playField\line_top)   

Debug SpritePixelCollision(#sprite_ball,ball\posx,ball\posy,#spritegoaldumpb,torb.playField\line_left,torb.playField\line_top)      
was gibts es da zu beachten ich bekomme obwohl der ball über der tor grafik liegt immer eine 0 beim debug :(
wenn ich nun spritelcollision nehme funktioniert es , erkennt aber nicht die transparente farbe.
Das Tor is natürlich weiß. falls das hilft.

Bin dankbar für hilfe und ratschläge.
Grüße.
i7,12gb ram , Windows 10 ,Purebasic 5.50
Drago
Beiträge: 148
Registriert: 02.02.2010 18:22
Computerausstattung: Win XP SP3, AMD Sempron (MMX) 1.2 GHz, 512 MB, Nvidia GeForce FX 5200, 128 MB, DirectX 9.0c
Wohnort: Westerwald

Re: frage zu SpritePixelCollision()

Beitrag von Drago »

Hallo ersteinmal... :)

Es wäre sehr hilfreich, wenn du ein ausführbares Beispiel postest, damit man es nachvollziehen kann.
Am besten lieferst du dann die Grafiken auch gleich mit....

Was für eine Grafik hast du ? ( .bmp, .jpg, .png u.s.w. )
In der Hilfe steht, das Spritepixelcollision z.B. keine Transparenz von z.B. .png Grafiken unterstützt.
Benutzt du ein anderes Format, könnte es daran liegen, welche Farbe du als Transparente Farbe
angegeben hast. Wenn du nichts anderes als Transparente Farbe angegeben hast, ist als Defaultwert
RGB( 0,0,0 ) eingestellt, also Schwarz.
Möchtest du eine andere Transparente Farbe, so kannst du sie mit
TransparentSpriteColor(#Sprite, Farbe)
einstellen.
Ich hoffe, es hilft dir....

LG Drago
True29
Beiträge: 283
Registriert: 18.08.2012 19:18
Computerausstattung: Windows 8 64bit .Profan x2,Purebasic 5.5
Wohnort: Worms
Kontaktdaten:

Re: frage zu SpritePixelCollision()

Beitrag von True29 »

ok hier mal der code .
hab nun mal ein jpg bild eingefügt.
geh trotzdem nich davor hatte ich ein jpg bild.

Grafiken:
http://gravitygame.de/files/gfx.rar

fehler is bei zeile 656 diese soll eine kollision mim tor erkennen und halt den ball zurückschicken.

Code: Alles auswählen

;****************************************************************************************************** 
;- *** Konstants *** 
;****************************************************************************************************** 

EnableExplicit

UseBriefLZPacker() : UseJPEGImageDecoder() : UsePNGImageDecoder() : UseOGGSoundDecoder()


#Gametitel = "Minifootball"
#window_heigh = 400
#window_weight = 400

;Defines for game

#PLAYER_WALKSPEED = 0.2 ;Pixel seconds 
#PLAYER_RUNSPEED = 0.7 ;Pixel seconds 
#BALL_SPEED = 1 ;Pixel seconds 
#PLAYER_SIZE = 15 ;Pixel
#Ball_SIZE = 10 ;Pixel
#POWER_NEED_WALK = 1 ;Kost for shoot
#SHOOT_RANGE = 25 ;pixel
#GRAS_VALUE = 1 ;eigenschaft gras



Enumeration ;GFX
  #maussprite
  #spritegoal
  #spritegoaldump
  #spritegoaldumpa
  #spritegoaldumpb
  #fieldsprite
  #fieldbackgroundsprite
  #playersprite_black
  #playersprite_white
  #playersprite_red
  #playersprite_brown
  #player_mark
  #sprite_ball
EndEnumeration

Enumeration ;directions
  #UP
  #DOWN
  #LEFT
  #RIGHT
EndEnumeration

Enumeration ;Gamestate
  #GAME_RUNNING
  #GAME_PAUSE
  #GAME_PRE  
  #GAME_STOP
  #GAME_ENDE
  #GAME_MENU
EndEnumeration

Enumeration ;Matchstatus
  #MATCH_RUNNING
  #MATCH_BRAKE
  #MATCH_RUNNING2
  #MATCH_END
  #MATCH_PREPARE
EndEnumeration

Enumeration ;playerstate
  #PLAYER_Stand
  #PLAYER_Walking
  #PLAYER_Running  
  #PLAYER_ECKE
  #TOR
  #PLAYER_ACTION_STAND
  #PLAYER_ACTION_WALK
  #PLAYER_ACTION_RUN
  #PLAYER_ACTION_PASS
  #PLAYER_ACTION_LOOP
  #PLAYER_ACTION_TRIBBLE
  #PLAYER_ACTION_SCRETCH
  #PLAYER_ACTION_ATTACK
  #PLAYER_ACTION_SHOOT
  #PLAYER_ACTION_KOPFBALL
  #PLAYER_ACTION_SPEZACTION
  #PLAYER_ACTION_SPEZACTION1
  #PLAYER_ACTION_SPEZACTION2
  #CARD_RED
  #CARD_YELLOW
  #CARD_YELLOW_2
  #PLAYER_MIDFIELD
  #PLAYER_L_MIDFIELD
  #PLAYER_R_MIDFIELD
  #PLAYER_TOR
  #PLAYER_FRONT
  #PLAYER_R_FRONT
  #PLAYER_L_FRONT
  #PLAYER_R_SIDE
  #PLAYER_L_SIDE
  #PLAYER_R_DEF
  #PLAYER_L_DEF
  #PLAYER_M_DEF
  #PLAYER_BANK_1
  #PLAYER_BANK_2
  #PLAYER_BANK_3
  #TEAM_A
  #TEAM_B
EndEnumeration

Structure player
  myplayer.i
  posx.f
  posy.f
  targetx.f
  targety.f
  direction.i
  velo.f
  starttime.i
  sprite.i
  team.i
  power.i ;0-100
  type.i
  hasball.i
  playercard.i ;0 , 1 ,2 3 > keine , gelb , 2 gelbe , rot
  hurtdmg.i ;0-100
  state.i ;0 stand ,1 walking, 2 running ;
  shootpower.f ;rnd 3
EndStructure

Structure ball
  posx.f
  posy.f
  starttime.i
  targetx.f
  targety.f
  state.i
  direction.i
  speed.f
  out.i
  stickat_team.i
  stickat_player.i
EndStructure


Structure playField
  Color.i
  size.i
  pos_top.i
  pos_right.i
  pos_down.i
  pos_left.i  
  line_top.i
  line_right.i
  line_down.i
  line_left.i
EndStructure

Structure Animation
  speed.f
  starttime.i
  targetx.f
  targety.f
EndStructure

Define NewList Playermove.Animation()  
Define NewList Player1.player()
Define field.playField
Define border.playField
Define tora.playField
Define torb.playField
Define ball.ball
Define game_finish.i = #True
Define tor_me = 0
Define tor_cpu = 0
Define nowplaytime = 0
Define breaktime = 45
Define totalplaytime = 90
Define Spielstatus.s
Define Debuging = #False
Define timerproc.i
Define checktime.i
Define Gamestatus = #GAME_MENU
Define.i fieldWidth,fieldHeight,fieldstartx,fieldstarty



;****************************************************************************************************** 
;- *** Includes *** 
;****************************************************************************************************** 

;DLL / Definitionen / Include
Procedure Fehlerbehandlung(Ergebnis.i, Text.s)
  Define Ergebnis.i
  If Ergebnis = 0
    MessageRequester("Fehler", Text, #PB_MessageRequester_Ok)
    End
  EndIf
EndProcedure

Procedure inverse(zahl)
  ProcedureReturn -zahl
EndProcedure

Procedure spritesladen()
  ;GUI
  Fehlerbehandlung(CatchSprite(#maussprite,?Maus),"Fehler beim laden von Grafik")      
  ;game
  Fehlerbehandlung(CatchSprite(#spritegoal,?goal),"Fehler beim laden von Grafik")      
  Fehlerbehandlung(CatchSprite(#spritegoaldump,?goaldump,#PB_Sprite_PixelCollision),"Fehler beim laden von Grafik")      
  ;Fehlerbehandlung(CatchSprite(#spritegoaldumpa,?goaldumpa,#PB_Sprite_PixelCollision),"Fehler beim laden von Grafik")      
  ;Fehlerbehandlung(CatchSprite(#spritegoaldumpb,?goaldumpb,#PB_Sprite_PixelCollision),"Fehler beim laden von Grafik")      
  
  
  Fehlerbehandlung(CatchSprite(#fieldbackgroundsprite,?field1),"Fehler beim laden von Grafik")      
  Fehlerbehandlung(CatchSprite(#fieldsprite,?field0),"Fehler beim laden von Grafik")      
  ;Players
  Fehlerbehandlung(CatchSprite(#playersprite_black,?player_black),"Fehler beim laden von Grafik")      
  Fehlerbehandlung(CatchSprite(#playersprite_red,?player_red),"Fehler beim laden von Grafik")      
  Fehlerbehandlung(CatchSprite(#playersprite_white,?player_white),"Fehler beim laden von Grafik")      
  Fehlerbehandlung(CatchSprite(#playersprite_brown,?player_brown),"Fehler beim laden von Grafik")      
  Fehlerbehandlung(CatchSprite(#player_mark,?player_mark),"Fehler beim laden von Grafik")      
  Fehlerbehandlung(CatchSprite(#sprite_Ball,?player_white),"Fehler beim laden von Grafik")      
EndProcedure

Procedure ADDPLAYER(type.i,team,sprite.i,List Player1.Player(),myplayer.i)  
  If AddElement(Player1())    
    With Player1()
      \type = type.i    
      \sprite = sprite.i
      \team = team.i
      \myplayer = myplayer.i
      \power = 100
    EndWith    
  EndIf  
EndProcedure

Procedure MOVEPLAYER(speed.f,targetx,targety,List Playermove.Animation())  
  If AddElement(Playermove())    
    With Playermove()
      \targetx = targetx
      \targety = targety
      \speed = speed

    EndWith    
  EndIf  
EndProcedure


Procedure.f FPS()
  Static time.i = -1
  Protected currentTime.i = ElapsedMilliseconds()
  Protected timeDiff.i = currentTime - time
  time = currentTime
  If timeDiff > 0    
    ProcedureReturn   1000. / timeDiff   
  EndIf
EndProcedure

;****************************************************************************************************** 
;- *** INIT GAME FIELD *** 
;****************************************************************************************************** 
field.playField\size = 100
field.playField\Color = #Green
border.playField\Color = #Gray

ExamineDesktops()
fieldstartx.i = DesktopWidth(0)/4-100
fieldstarty.i = DesktopHeight(0)/4

fieldHeight.i = (field.playField\size*10)/2
fieldWidth.i = (field.playField\size*10)

;Startposi für ball
ball\posx = (fieldstartx + (fieldWidth/2)) - 6
ball\posy = (fieldstarty + (fieldHeight/2)) - 2

;Ränder definieren
field.playField\pos_top = 230
field.playField\pos_right = 1337
field.playField\pos_down = 781
field.playField\pos_left = 289   

;Aus linie definieren
field.playField\line_top = 264
field.playField\line_right = 1316
field.playField\line_down = 760
field.playField\line_left = 648 

;left side
tora.playField\line_top = 440
tora.playField\line_right = 400
tora.playField\line_down = 583
tora.playField\line_left = 340 

;right side
torb.playField\line_top = 436
torb.playField\line_right = 1291
torb.playField\line_down = 590
torb.playField\line_left = 1233 

;****************************************************************************************************** 
;- *** init *** 
;****************************************************************************************************** 

;Initalisiere
If InitMouse() = 0 Or InitSprite() = 0 Or InitKeyboard() = 0 Or InitSound() = 0 Or InitMovie() = 0
  MessageRequester(#Gametitel, "Can't open DirectX 7-9", 0)
  End
EndIf

OpenScreen(DesktopWidth(0),DesktopHeight(0),DesktopDepth(0),#Gametitel,0,DesktopFrequency(0))

If Debuging = #True
  OpenWindow(0,0,0,1500,800,"test")
  OpenWindowedScreen(WindowID(0),0,0,1500,800)
EndIf

spritesladen()
  
;****************************************************************************************************** 
;- *** Set Fonts *** 
;****************************************************************************************************** 
LoadFont(1,"Arial",24)  

;****************************************************************************************************** 
;- *** Main loop *** 
;****************************************************************************************************** 


Repeat    
  Define time = ElapsedMilliseconds() 
    ClearScreen(RGB(0,0,0))

    ;****************************************************************************************************** 
    ;- *** Controll *** 
    ;****************************************************************************************************** 
    ExamineMouse()    
    ExamineKeyboard() 
    
    If KeyboardReleased(#PB_Key_Escape)
      Gamestatus = #GAME_ENDE    
    ElseIf (KeyboardReleased(#PB_Key_N) And (game_finish = #True));check for next game
      game_finish = #False
      Gamestatus = #GAME_PRE                                
    Else 
      ResetList(Player1())
      While NextElement(Player1())
        With Player1()    
          If \myplayer = #True             
              ;****************************************************************************************************** 
              ;- *** Player selected
              ;******************************************************************************************************               
              
              If KeyboardPushed(#PB_Key_Up)
                If (field.playField\pos_top <= \posy - #PLAYER_WALKSPEED)                
                  \direction = #UP                    
                  \posy = \posy - #PLAYER_WALKSPEED
                  \state = #PLAYER_ACTION_RUN                  
                  If \hasball = #True
                    ball\posy = ball\posy - #PLAYER_WALKSPEED
                  EndIf                                
                EndIf
              EndIf
              
              If KeyboardPushed(#PB_Key_Down)
                If (field.playField\pos_down >= \posy + #PLAYER_WALKSPEED + #PLAYER_SIZE)                
                  \direction = #DOWN                                         
                  \posy = \posy + #PLAYER_WALKSPEED                      
                  \state = #PLAYER_ACTION_RUN
                  If \hasball = #True
                    ball\posy = ball\posy + #PLAYER_WALKSPEED
                  EndIf
                EndIf
              EndIf  
              
              If KeyboardPushed(#PB_Key_Right)
                If (field.playField\pos_right >= \posx + #PLAYER_WALKSPEED + #PLAYER_SIZE)                
                  \direction = #RIGHT                                      
                  \posx = \posx + #PLAYER_WALKSPEED                        
                  \state = #PLAYER_ACTION_RUN
                  If \hasball = #True
                    ball\posx = ball\posx + #PLAYER_WALKSPEED
                  EndIf
                EndIf 
              EndIf 
              
              If KeyboardPushed(#PB_Key_Left)                
                If (field.playField\pos_left <= \posx - #PLAYER_WALKSPEED)                
                  \direction = #LEFT      
                  \posx = \posx - #PLAYER_WALKSPEED                          
                  \state = #PLAYER_ACTION_RUN
                  If \hasball = #True
                    ball\posx = ball\posx - #PLAYER_WALKSPEED
                  EndIf
                EndIf
              EndIf
                            
          ;****************************************************************************************************** 
          ;- *** Player has ball *** 
          ;****************************************************************************************************** 
          If SpriteCollision(#sprite_ball,ball\posx,ball\posy,\sprite,\posx,\posy)
            \hasball = #True
            ball\stickat_player = #True
            ball\stickat_team = \team
          EndIf                
          
          ;****************************************************************************************************** 
          ;- *** Shoot control *** 
          ;****************************************************************************************************** 
          
          If ((KeyboardPushed(#PB_Key_Space)) And (\hasball = #True ) And (\power >= 5)) ;shoot                        
            If \shootpower < 100  
              If \power > Int(\shootpower)
                \shootpower + 0.1
              EndIf
            EndIf                                         
          EndIf
          
          If ((KeyboardReleased(#PB_Key_Space)) And (\hasball = #True ) And (\power >= 5)) ;shoot                                    
            If Debuging = #True              
              Debug "schuss"
            EndIf
            
            ;\shootpower = (\shootpower/10)*Random(50,1)            
            ball\starttime = time
            \state = #PLAYER_ACTION_SHOOT            
            
            ;Set Direction and shoot.
            If \direction = #UP
              ball\targety = \shootpower
              ball\direction = #UP
              ball\posy - 5
            EndIf
            
            If \direction = #DOWN
              ball\targety =  \shootpower
              ball\direction = #DOWN
              ball\posy + 5
            EndIf
            
            If \direction = #RIGHT
              ball\targetx = \shootpower
              ball\direction = #RIGHT
              ball\posx + 5
            EndIf
            
            If \direction = #LEFT
              ball\targetx =  \shootpower
              ball\posx - 5
              ball\direction = #LEFT
            EndIf      
            
            ;Ball goes away             
            \power = \power - Int(\shootpower)
            \hasball = #False
            \shootpower = 0                           
          EndIf
          
          EndIf
          ;****************************************************************************************************** 
          ;- *** POWER RELOAD OF PLAYER *** 
          ;****************************************************************************************************** 
          
          ;RELOAD PLAYER POWER
          If ((timerproc = #False) And (\power < 100))
            \power + 5
          EndIf
                    
          ;Kollision mit objecten spielern rand !
          ;If SpriteCollision(#sprite_ball,ball\posx,ball\posy,\sprite,\posx,\posy)           
          ;EndIf          
          
        EndWith
      Wend
      
    EndIf
    
    
    ;****************************************************************************************************** 
    ;- *** game ablauf *** 
    ;****************************************************************************************************** 
    
    
    
    If Gamestatus = #GAME_MENU  
      Spielstatus = "MENÜ"      
    ElseIf Gamestatus = #GAME_PRE            
      Spielstatus = "Vorbereitung"      
      #PLAYER_TEAMSIZE = 2
      
      ;TEAM ERSTELLEN
      ADDPLAYER(#PLAYER_FRONT,#TEAM_A,#playersprite_red,Player1(),#True)            
      ADDPLAYER(#PLAYER_MIDFIELD,#TEAM_A,#playersprite_red,Player1(),#False)            
      ADDPLAYER(#PLAYER_TOR,#TEAM_A,#playersprite_red,Player1(),#False)                  
      
      ResetList(Player1())

      ;Add Playerpositions                  
      While  NextElement(Player1())
        With Player1()
        If \team = #TEAM_A
        Select \type            
          Case #PLAYER_M_DEF
            \posX = (fieldstartx + (fieldWidth/2))-300
            \posY = fieldstarty + (fieldHeight/2)                        
          Case #PLAYER_L_DEF
            \posX = (fieldstartx + (fieldWidth/2))-300
            \posY = fieldstarty + (fieldHeight/2)-50                          
          Case #PLAYER_R_DEF
            \posX = (fieldstartx + (fieldWidth/2))-300
            \posY = fieldstarty + (fieldHeight/2)+50  
          Case #PLAYER_MIDFIELD
            \posX = (fieldstartx + (fieldWidth/2))-200
            \posY = fieldstarty + (fieldHeight/2)  
          Case #PLAYER_FRONT
            \posX = (fieldstartx + (fieldWidth/2))-100
            \posY = fieldstarty + (fieldHeight/2)              
          Case #PLAYER_TOR            
            \posX = fieldstartx + 60
            \posY = fieldstarty + (fieldHeight/2)                                   
        EndSelect  
       ElseIf \team = #TEAM_B 
        
       EndIf
      EndWith 
      Wend
      
     
                           
      Gamestatus = #GAME_RUNNING              
    ElseIf Gamestatus = #GAME_RUNNING
      
      If Not Spielstatus = "2 Spielzeit"
        Spielstatus = "Läuft"  
      EndIf
    ;****************************************************************************************************** 
    ;- *** CALC GAMETIME ***
    ;****************************************************************************************************** 
  
        If game_finish = #False
          If timerproc = #False
            timerproc = #True
            checktime = time
          EndIf  
          If time -checktime > 1000
            timerproc = #False 
            nowplaytime + 1 
          EndIf        
        EndIf
        If nowplaytime >= breaktime          
          Spielstatus = "Pause 3 MIN"    
          If nowplaytime + 3 >= breaktime 
            nowplaytime = 0
            Spielstatus = "2 Spielzeit"
          EndIf
        EndIf
        
    ;****************************************************************************************************** 
    ;- *** CALC BALL ***
    ;****************************************************************************************************** 
    If ball\out = #False ;Check ball im aus ?
      
      ;****************************************************************************************************** 
      ;- *** BALL MOVE ***
      ;****************************************************************************************************** 
            
      ;v = v_0 * Exp(-(b*t)/m) d*t Formel ballgeschwindigkeit
      
       ;v = v_0 * Exp(-(b*Time)/50) d*time
              
       If ball\targetx > 0        
         If ball\direction = #RIGHT
          ball\speed + 0.02
          ball\posx + ball\speed
          ball\targetx - 1        
        ElseIf ball\direction = #LEFT
          ball\posx - 1
          ball\targetx - 1        
        EndIf  
      EndIf      
      
      If ball\targety > 0        
        If ball\direction = #UP
          ball\posy - 1
          ball\targety - 1
        ElseIf ball\direction = #DOWN
          ball\posy + 1
          ball\targety - 1        
        EndIf  
      EndIf
      
      ;****************************************************************************************************** 
      ;- *** DETECT MOVE END ***
      ;****************************************************************************************************** 
    EndIf
    
        ResetList(Player1())
        While NextElement(Player1())
          With Player1()    
            If \myplayer = #True                              
                    ;****************************************************************************************************** 
                    ;- *** Player MOVE ***
                    ;****************************************************************************************************** 
                          
;                             
;                     If \targetx > 0        
;                       If \direction = #RIGHT
; 
;                       ElseIf \direction = #LEFT
;        
;                       EndIf  
;                     EndIf      
;                     
;                     If \targety > 0        
;                       If \direction = #UP
; 
;                       ElseIf \direction = #DOWN
;        
;                       EndIf  
;                     EndIf
      
               If ball\out = #False
                If (ball\targetx = 0 And ball\targety = 0)
                  ball\stickat_player = #False
                  \state = #PLAYER_ACTION_STAND
                EndIf
              EndIf
            EndIf
          EndWith
        Wend        
      
     
    ;****************************************************************************************************** 
    ;- *** CHECK BALL OUT ***
    ;******************************************************************************************************   
    
    If Not SpriteCollision(#sprite_ball,ball\posx,ball\posy,#fieldsprite,fieldstartx,fieldstarty)      
      ball\out = #True      
      ;Ball steht
      ball\targety = 3 
      ball\targetx = 3 
    Else
      ball\out = #False
    EndIf
    
    ;****************************************************************************************************** 
    ;- *** CHECK BALL TOUCH TOR ***
    ;******************************************************************************************************    
    
    ;TOR A
    ;TransparentSpriteColor(#spritegoaldump,#PB_Default)
    If SpritePixelCollision(#sprite_ball,ball\posx,ball\posy,#spritegoaldump,fieldstartx,fieldstarty)                  
      
      If Debuging = #True
        Debug "touch tor"
      EndIf
      
      If Not ball\targety = 0
        ball\targety = inverse(ball\targety)         
      EndIf  
      If Not ball\targetx = 0
        ball\targetx = inverse(ball\targetx)
      EndIf  
    EndIf 
    
    ;TOR B
;     If SpritePixelCollision(#sprite_ball,ball\posx,ball\posy,#spritegoaldumpb,torb.playField\line_left,torb.playField\line_top)      
;       End
;       
;       If Debuging = #True
;         Debug "touch tor"
;       EndIf
;       If Not ball\targety = 0
;         ball\targety = inverse(ball\targety)         
;       EndIf  
;       If Not ball\targetx = 0
;         ball\targetx = inverse(ball\targetx)
;       EndIf  
;     EndIf 
;     
    
    ;****************************************************************************************************** 
    ;- *** CHECK TOR ***
    ;******************************************************************************************************   
    
    ;check tor Teama
    If ball\posx > tora.playField\line_left
      If ball\posx < tora.playField\line_right
        If ball\posy > tora.playField\line_top
          If ball\posy < tora.playField\line_down            
            If (timerproc = #False And ball\stickat_player = #True)
              tor_cpu + 1            
              ball\posx + 20
              ball\stickat_player = #False
            EndIf
          EndIf
        EndIf
      EndIf      
    EndIf
    
    ;check tor Teamb
    If ball\posx > torb.playField\line_left
      If ball\posx < torb.playField\line_right
        If ball\posy > torb.playField\line_top
          If ball\posy < torb.playField\line_down
            If (timerproc = #False And ball\stickat_player = #True)
              tor_me + 1
              ball\posx - 20
              ball\stickat_player = #False
            EndIf
          EndIf
        EndIf
      EndIf      
    EndIf
    
    
    
    
  ElseIf Gamestatus = #GAME_PAUSE   
      Spielstatus = "Pause"
    Else    
      Spielstatus = "unbekannt"
      Delay(10)
    EndIf
    
    
    
    
   
  ;****************************************************************************************************** 
  ;- *** GUI DRAW *** 
  ;****************************************************************************************************** 
  
  StartDrawing(ScreenOutput())
  
  If Gamestatus = #GAME_MENU        
    DrawText(((DesktopWidth(0)/2)),(DesktopHeight(0)/5),"PRESS (N)ew TO PLAY")
  ElseIf Gamestatus = #GAME_RUNNING        
    If ball\out = #True
      Define text_over_field.s = "Spieler: " + Str(tor_me)  + "  vs  " + Str(tor_cpu)  +  " Computer: -  Spielzeit: "+ Str(nowplaytime) +" Minuten - Matchstatus: BALL AUS"    
    Else
      Define text_over_field.s = "Spieler: " + Str(tor_me)  + "  vs  " + Str(tor_cpu)  +  " Computer: -  Spielzeit: "+ Str(nowplaytime) +" Minuten - Matchstatus: " + Spielstatus    
    EndIf
    DrawText(((DesktopWidth(0)/2+150)-TextWidth(text_over_field)),(DesktopHeight(0)/5)-TextHeight(text_over_field),text_over_field)      
    
    ResetList(Player1())
      While NextElement(Player1())
        With Player1()    
          If \myplayer = #True 
            DrawText(0,0,"Kraft: " +Str(\power))
            DrawText(0,20,"Verletzt: " +Str(\hurtdmg))
            DrawText(0,40,"Schusskraft: " +Str(\shootpower))
            If \playercard = 0
              DrawText(0,60,"Karten: keine") 
            ElseIf \playercard = 1
              DrawText(0,60,"Karten: eine Gelbe")
            ElseIf \playercard = 2
              DrawText(0,60,"Karten: 2 Gelbe")
            ElseIf \playercard = 3  
              DrawText(0,60,"Karten: Rot")
            EndIf
            
            If \state = #PLAYER_ACTION_SHOOT
              DrawText(0,80,"Status: Schuss")
            EndIf
            If \state = #TOR
              DrawText(0,80,"Status: TOR")
            EndIf
            
          EndIf
        EndWith
      Wend
  EndIf
  
  
  DrawText(DesktopWidth(0)/2,0,#Gametitel,#Red)
  
  If Debuging = #True       
   Define fps = FPS()
   If  fps > 0
     DrawText(DesktopWidth(0)-80,0,"FPS: "+ Str(fps))      
   EndIf
  EndIf
    
  StopDrawing() 
  
  
  ;****************************************************************************************************** 
  ;- *** game DRAW *** 
  ;******************************************************************************************************     
  If Gamestatus = #GAME_RUNNING        
    
  ;Fieldbackground
  ZoomSprite(#fieldbackgroundsprite,fieldWidth+50,fieldHeight+50)
  DisplaySprite(#fieldbackgroundsprite,fieldstartx-30,fieldstarty-30)
    
  ;Field
  ZoomSprite(#fieldsprite,fieldWidth,fieldHeight)
  DisplaySprite(#fieldsprite,fieldstartx,fieldstarty+2)
  
  ;Goaldump tor a for ping
  ;ZoomSprite(#spritegoaldumpa,70,160)
  ;DisplayTransparentSprite(#spritegoaldumpa,tora.playField\line_left,tora.playField\line_top)      
  
  ;Goaldump tor b for ping
  ;ZoomSprite(#spritegoaldumpb,70,160)
  ;DisplayTransparentSprite(#spritegoaldumpb,torb.playField\line_left,torb.playField\line_top)      
  
  ZoomSprite(#spritegoaldump,fieldWidth,fieldHeight)
  DisplayTransparentSprite(#spritegoaldump,fieldstartx,fieldstarty)      
  
  ;Goal
  ;ZoomSprite(#spritegoal,fieldWidth,fieldHeight)
  ;DisplayTransparentSprite(#spritegoal,fieldstartx,fieldstarty)      
      
  ;BALL
  ZoomSprite(#sprite_ball,#Ball_SIZE,#Ball_SIZE)
  DisplaySprite(#sprite_ball,ball\posx,ball\posy)                     
 
  ;players          
     ResetList(Player1())
      While NextElement(Player1())
        With Player1()    
          ZoomSprite(\sprite,#PLAYER_SIZE,#PLAYER_SIZE)
          DisplaySprite(\sprite,\posx,\posy)                    
           ;Spieler einheit markieren
          If \myplayer = #True             
            ZoomSprite(#player_mark,#PLAYER_SIZE,#PLAYER_SIZE)            
            DisplaySprite(#player_mark,\posx,\posy)                                
          EndIf          
        EndWith
      Wend
      
       
 EndIf
      
 ;DRAW MOUSE POINTER
 ;debug mous pos
 If Debuging = #True
   ;Debug "X: "+Str(MouseX())+"Y: "+ Str(MouseY())
 EndIf
 DisplayTransparentSprite(#maussprite,MouseX(),MouseY())  
 FlipBuffers()
  
  
Until Gamestatus = #GAME_ENDE
  ;****************************************************************************************************** 
  ;- ***  END MAIN LOOP
  ;******************************************************************************************************                



  DataSection     
    goal: IncludeBinary "gfx/goal.png" 
    goaldump: IncludeBinary "gfx/goal_dump.jpg" 
    goaldumpa: IncludeBinary "gfx/goal_dumpa.png" 
    goaldumpb: IncludeBinary "gfx/goal_dumpb.png" 
    field1: IncludeBinary "gfx/field1.jpg" 
    field0: IncludeBinary "gfx/field0.jpg" 
    maus: IncludeBinary "gfx/maus.png" 
    player_black: IncludeBinary "gfx/player_black.png" 
    player_red: IncludeBinary "gfx/player_red.png" 
    player_brown: IncludeBinary "gfx/player_brown.png" 
    player_white: IncludeBinary "gfx/player_white.png" 
    player_mark: IncludeBinary "gfx/player_mark.png"
EndDataSection
i7,12gb ram , Windows 10 ,Purebasic 5.50
True29
Beiträge: 283
Registriert: 18.08.2012 19:18
Computerausstattung: Windows 8 64bit .Profan x2,Purebasic 5.5
Wohnort: Worms
Kontaktdaten:

Re: frage zu SpritePixelCollision()

Beitrag von True29 »

hat wohl keiner eine idee.
i7,12gb ram , Windows 10 ,Purebasic 5.50
Drago
Beiträge: 148
Registriert: 02.02.2010 18:22
Computerausstattung: Win XP SP3, AMD Sempron (MMX) 1.2 GHz, 512 MB, Nvidia GeForce FX 5200, 128 MB, DirectX 9.0c
Wohnort: Westerwald

Re: frage zu SpritePixelCollision()

Beitrag von Drago »

Aaaaaalso.....

Das nächste mal, mache bitte das Programm etwas kleiner, so, das der Fehler ( oder der angebliche Fehler )
immer noch auftritt.
Damit wird es für den Helfenden etwas leichter, da man sich sonst erst ellenlang durch den Code wurschteln muß. :mrgreen:

Du testest ein jpg Bild mit einem png Bild.....

Mache den Ball als jpg Bild und dann klappt es auch. Zumindestens bei mir ( Pb 4.61 )....
True29
Beiträge: 283
Registriert: 18.08.2012 19:18
Computerausstattung: Windows 8 64bit .Profan x2,Purebasic 5.5
Wohnort: Worms
Kontaktdaten:

Re: frage zu SpritePixelCollision()

Beitrag von True29 »

nö hier nich .
hab pb 5.20 beta 5.
hab alle grafiken nun in jpg umgewandelt.

Hast du am code was geändert ? oder nur das bild.


vielleicht hat ja noch wer eine Idee ;)
danke dir trotzdem.
i7,12gb ram , Windows 10 ,Purebasic 5.50
Benutzeravatar
darius676
Beiträge: 512
Registriert: 08.03.2010 22:12
Computerausstattung: Intel i5 16GB RAM nVidia 1050, Win11
Atari Jaguar, Surface Pro 5,Surface Laptop i5 7200, XBOX ONE X, XBOX Series X
Wohnort: AT
Kontaktdaten:

Re: frage zu SpritePixelCollision()

Beitrag von darius676 »

...kann den code nicht ausführen...liegt aber an meiner veralteten pb version...ja die neue kommt...

meine frage:

habe ich richtig verstanden, dass das tor 1 grafik ist?

dann wäre mein lösungsansatz: für jeden pfosten eine eigen grafik verwenden und mit hilfe dieser die kollision prüfen.
Drago
Beiträge: 148
Registriert: 02.02.2010 18:22
Computerausstattung: Win XP SP3, AMD Sempron (MMX) 1.2 GHz, 512 MB, Nvidia GeForce FX 5200, 128 MB, DirectX 9.0c
Wohnort: Westerwald

Re: frage zu SpritePixelCollision()

Beitrag von Drago »

Probiere mal....

Code: Alles auswählen

; **************************************************************************************************************************
; *       Beispiel                                                                                                                                                              *
; *                                                                                                                                                                                    *
; *                                                                                                                                                                                    *
; *                                                                                                                                                                                    *
; *                                                                                                                                                                                    *
; *                                                                                                                                                                                    *
; *                                                                                                                                                                                    *
; *      Klaus Wilke                                                                                                                                                        *
; **************************************************************************************************************************
EnableExplicit
; **************************************************************************************************************************
; Konstanten declarieren
; **************************************************************************************************************************
#ScreenWidth   = 1024
#ScreenHeigth  = 768

If InitSprite() = 0 Or InitKeyboard() = 0 Or InitSprite3D() = 0 Or InitSound() = 0 Or InitMouse() = 0 
     
     MessageRequester( "Error", "Can't open DirectX 7 or later", 0 )
     End
EndIf

If OpenScreen( #ScreenWidth, #ScreenHeigth, 32, "Test3D", 1) = 0
     MessageRequester( "Error", "Can't open Screen", 0 )
     End
EndIf

UseJPEGImageDecoder()

Define CoalSprite.i
Define BallSprite.i
Define BallX.i = 512, BallY.i = 300

ClearScreen( 0  )
StartDrawing( ScreenOutput() )

Box( 0, 768/2 - 60, 5, 120, RGB( 255, 255,  255 ) )
Box( 0, 768/2 - 60, 50, 5, RGB( 255, 255, 255 ) )
LineXY(0, 768/2 - 60, 600, 768/2 - 60, RGB( 255, 255, 255 ) )
Plot( 0, 0, RGB( 255, 255, 255 ) )
StopDrawing()

CoalSprite = GrabSprite( #PB_Any , 0, 0, 1024, 768 )
BallSprite = GrabSprite( #PB_Any, 0, 0, 1, 1 )

Repeat
     
     ClearScreen( 0 )
     
     DisplayTransparentSprite( CoalSprite, 0, 0 )
     
     DisplayTransparentSprite( BallSprite, BallX, BallY )
     
     If SpritePixelCollision( CoalSprite, 0, 0, BallSprite, BallX, BallY )
          StartDrawing( ScreenOutput() )
          
          DrawText( 0, 0, "TREFFER" )
          StopDrawing()
     EndIf
     
     FlipBuffers()
     
     ExamineKeyboard()
     
     If KeyboardPushed( #PB_Key_Left )
          BallX - 1
     EndIf
     If KeyboardPushed( #PB_Key_Right )
          BallX + 1
     EndIf
     If KeyboardPushed( #PB_Key_Up )
          BallY - 1
     EndIf
     If KeyboardPushed( #PB_Key_Down )
          BallY + 1
     EndIf
     
Until KeyboardPushed( #PB_Key_Escape )
End
True29
Beiträge: 283
Registriert: 18.08.2012 19:18
Computerausstattung: Windows 8 64bit .Profan x2,Purebasic 5.5
Wohnort: Worms
Kontaktdaten:

Re: frage zu SpritePixelCollision()

Beitrag von True29 »

funktioniert irgendwie nicht.

nein beide tore sind als grundgerüst im bild enthalten um es mir einfach zu machen.
i7,12gb ram , Windows 10 ,Purebasic 5.50
Drago
Beiträge: 148
Registriert: 02.02.2010 18:22
Computerausstattung: Win XP SP3, AMD Sempron (MMX) 1.2 GHz, 512 MB, Nvidia GeForce FX 5200, 128 MB, DirectX 9.0c
Wohnort: Westerwald

Re: frage zu SpritePixelCollision()

Beitrag von Drago »

Was funktioniert nicht ? Mein Code ?

Du kannst den Ball (kleinen Punkt ) mit den Pfeiltasten steuern....

Sobald du etwas berührst, erscheint oben "Toor"...

Oder bekommst du eine Fehlermeldung ?
Antworten