Seite 1 von 1

SpriteCollision Fadenkreuz (Update!!!)

Verfasst: 10.05.2005 16:45
von Gamer
So hier mal die wichtigsten Teile aus meinem Code:

Code: Alles auswählen

If InitSprite()=0 Or InitKeyboard()=0 Or InitMouse()=0 Or InitSound()=0:End:EndIf
If OpenScreen(1024,768,16,"")=0:End:EndIf

UsePNGImageDecoder()

Global enemyDelay.l  
Global enemySetDelay.l 
Global score.l 

enemySetDelay = 100  

Enumeration    
  #Sprite_Enemy   
  #Sprite_Fadenkreuz  
EndEnumeration

Structure enemy    
  x.l          
  y.l
  speedX.l
  richtung.l
EndStructure 
NewList enemy.enemy()  

Procedure AddEnemy(x,y,speedX,richtung)
  AddElement(enemy())  
  enemy()\x = x
  enemy()\y = y
  enemy()\speedX = speedX
  enemy()\richtung = richtung
EndProcedure

LoadSprite(#Sprite_Enemy,   "gegner.png")
LoadSprite(#Sprite_Fadenkreuz,"kreuz.png")

Repeat
     ExamineKeyboard():ExamineMouse()
     ClearScreen(0,0,0)
     Gosub enemy
     FlipBuffers()
Until KeyboardReleased(#PB_Key_Escape)
End

enemy:

  DisplayTransparentSprite(#Sprite_Fadenkreuz,MouseX(),MouseY())

  If SpriteCollision(#Sprite_Fadenkreuz, MouseX(), MouseY(), #Sprite_Enemy, enemy()\x, enemy()\y)
  ClearScreen(255,255,255)
  EndIf

  If enemyDelay = 0
  haha = Random(1)
  If haha=1:startwert=0:Else:startwert=1024:EndIf
    AddEnemy(startwert,Random(768),-2-Random(1),haha)
    enemyDelay = enemySetDelay
  Else
    enemyDelay - 1
  EndIf

  ForEach enemy()
    If enemy()\x<0-SpriteWidth(#Sprite_Enemy) And enemy()\richtung=1: DeleteElement(enemy()) : EndIf
    If enemy()\x>1024+SpriteWidth(#Sprite_Enemy) And enemy()\richtung=0: DeleteElement(enemy()) : EndIf
  Next

  ForEach enemy()
    DisplayTransparentSprite(#Sprite_Enemy, enemy()\x, enemy()\y)
    If enemy()\richtung=0:enemy()\x + enemy()\speedX:Else:enemy()\x - enemy()\speedX:EndIf
  Next

Return
Problem ist die Kollisionserkennung. Ich habe mal testweise immer einen weißen Screen eingebaut wenn die Maus einen Gegner streift.

Allerdings funktioniert dies nur jeweils immer 100 Pixel links + rechts vom Rand, in der Mitte und am Ende des Enemyflugs blitzt der weiße Screen nicht mehr auf...

Wo liegt der Fehler?

Verfasst: 10.05.2005 18:18
von Green Snake
hallo

mach mit spritepixelcollision

ist zwar langsamer aber genauer :allright:


also:

Code: Alles auswählen

If SpritePixelCollision(#Sprite_Fadenkreuz, MouseX(), MouseY(), #Sprite_Enemy, enemy()\x, enemy()\y) ...

Verfasst: 10.05.2005 18:36
von Gamer
Was ist daran "genauer"? Ich merk keinen Unterschied. Ich bräuchte lediglich eine Abfrage wie SpriteCollision(#Sprite_Fadenkreuz,#Sprite_Enemy)

Verfasst: 10.05.2005 19:05
von Green Snake
bei spritepixelcollision werden alle transparennten pixel eines bildes ignorrirt.

ich verstehe deine frage nicht ganz, aber das währe meiner meinung nach das beste

Verfasst: 10.05.2005 19:23
von Gamer
So hab oben nochmal mehr Code dazu gepostet...

Verfasst: 11.05.2005 12:30
von Delle
Hallo Gamer,

merkwürdig, sieht auf den ersten Blick logisch aus,
aber funktioniert nur teilweise. Der Bildschirm blitzt
bei mir auch nur auf wenn die Objekte am Rand
mit diesem Fadenkreuz berührt werden.

:roll:

Verfasst: 11.05.2005 12:54
von freedimension
Hab mal schnell den Code überflogen: Du müsstest alle enemy() überprüfen, nicht nur einen.