Seite 1 von 2

Screenoutput collision ?

Verfasst: 22.06.2006 18:01
von Ghost
Hi
Gibt es eine möglichkeit zu überprüfen ob 2 Screenoutputs miteinander colliedieren ?
Ich wollte mal das Uralte Tennis Clonen und bekommen die kolision zwischen dem schläger (einfacheBox) und dem Ball (auch einfache Box) nicht hinn. Wenn ich es so mache wie unten sagt er immer There is not a curently 2D objeckt.
Ich könnte zwar richtige Bilder nehmen aber mit screenoutputs find ich es besser.

Code: Alles auswählen

If SpriteCollision(Box(0,PlayeryI,20,100),0,PlayeryI,Box(BallX,BallY,10,10),BallX,Bally)

Verfasst: 22.06.2006 18:10
von PMV
Ich könnte zwar richtige Bilder nehmen aber mit screenoutputs find ich es besser.
:lol:

du fährst wohl auch Fahrrad, allerdings montierste vorher Käste anstelle
von Rädern? :? Und dann beschwerst du dich, warum das nicht geht ...
*lol*

SpriteCollision erwartet ... Sprites ... und somit solltest du auch solche
übergeben oder dir eigene Kollisionen schreiben ...

MFG PMV

Verfasst: 22.06.2006 18:19
von Ghost
hmm Käasten statt Räder ?... gute Idee werd ich gleich mal Probieren (bisher nahm ich immer oktaeder aber irgendwie lässt es sich damit schwer fahren )


nee jetzt aber mal ernst
gibt es denn so eine art :if Screenoutputcollision(...)
immerhinn hatten die damals ja auch keine Bilder (gut die haben auch net mit PB Programmiert)
oder baust du in einen Oldi nen V8 Motor???

Verfasst: 22.06.2006 18:43
von AndyX
Es gibt keine Screenoutput-Kollision, wäre auch völlig unnötig. Du kannst nicht mal zwei Screens gleichzeitig erstellen. :?

Aber lies mal in der Hilfe nach. Der Befehl SpriteCollision verlangt ein Sprite, nicht 0.

Verfasst: 22.06.2006 18:55
von Ghost
in der Hilfe hab ich schon nachgesehen (leider kaum was gefunden)
ich mein kein Scren collision sondern Screenoutput collision und mehrere Screenoutputs zB. Boxen Ounkte ect. )kann man ja haben

is aber auch net so schlimm dann nehm ich halt Bilder

Verfasst: 22.06.2006 19:01
von #NULL
Box(...) ist als parameter völlig sinnlos. sie ist eine zeichen-anweisung und gibt keinen nützlichen wert zurück (höchsten die konstante "1"), und schon gar keinen, mit dem ein objekt identifiziert werden konnte, denn es wird ja in Box() auch kein objekt erstellt.

wenn du mit screenoutputs sowas wie drawingoutputs meinst, dann sind dies bezüglich der der kollisionsprüfung genau die besagten sprites und images.

// boxen, kreise, plots, lines.... das sind keine outputs und auch sonst keine objekte. das sind einfach mittels der zeichen-anweisungen in den (video-)speicher geschriebene punktmengen.

Verfasst: 22.06.2006 19:11
von Deeem2031
Sowas würde gehen: :mrgreen:

Code: Alles auswählen

Structure DrawingInfoStruct
	Type.l    ; Type of the DC
	Window.l  ; Window associated to the DC (if any)
	DC.l      ; DC
	ReleaseProcedure.l ; Address to a procedure to release the DC when StopDrawing() is called 
	PixelBuffer.l      ; Address of the memory pixel buffer (DirectX)
	Pitch.l            ; Pitch
	Width.l
	Height.l
	Depth.l
EndStructure

Procedure OutputCollision(*DrawingInfo1.DrawingInfoStruct,X1,Y1,*DrawingInfo2.DrawingInfoStruct,X2,Y2)
  Protected result = #False
  If *DrawingInfo1 And *DrawingInfo2
    If X1 + *DrawingInfo1\Width > X2 And X2 + *DrawingInfo2\Width > X1
      If Y1 + *DrawingInfo1\Height > Y2 And Y2 + *DrawingInfo2\Height > Y1
        result = #True
      EndIf
    EndIf
    CallFunctionFast(*DrawingInfo1\ReleaseProcedure)
    CallFunctionFast(*DrawingInfo2\ReleaseProcedure)
  ElseIf *DrawingInfo1
    CallFunctionFast(*DrawingInfo1\ReleaseProcedure)
  ElseIf *DrawingInfo2
    CallFunctionFast(*DrawingInfo2\ReleaseProcedure)
  EndIf
  ProcedureReturn result
EndProcedure
Habs aber nich getestet ;)

Verfasst: 22.06.2006 19:49
von Ghost
@Null ok danke für die erklärung <)

@Deeem2031 :shock: Wow ich glaub das is noch nen wenig zu hoch für mich :oops:
aber danke <)


und danke noch mal an alle anderen

Verfasst: 22.06.2006 20:10
von PMV
:lol: loool ... das wäre natürlich auch eine möglichkeit ... aber dann könnt
er wohl besser Sprites verwenden, es sei denn er malt auf Fenstern rum
ohne Screen :roll: ...

Also ich lös das ganze jetzt mal auf ... dafür hab ich ja auch angefangen
:D ... ok eigentlich du aber unbeabsichtigt <)

Problemstellung: Du möchtest die Position von zwei Rechtecke
miteinander vergleichen. Schneiden diese sich, soll das erkannt werden.

Lösung: einfache IF-Abfragen :shock:

Und mittels IF-Abfragen und kleinen Formeln hat man sich früher
beholfen, um die Kollision mit Kasten oder/ und Kreisen bestimmen zu
können.

Natürlich wäre das eine relativ lange IF-Abfrage (bzw zur übersichtlichkeit
sollte man das splitten), aber es ist genau das, was dein Problem am
besten und einfachsten lösen würde, wenn du halt keine Sprites
verwenden möchtest.

Wenn du das nicht alleine hin bekommst kannst ja noch mal lieb fragen ...
aber erst mal selber versuchen :wink:

MFG PMV

Verfasst: 22.06.2006 20:34
von Ghost
ok habs jetzt leider schon mit Bildern gemacht :oops:

ich stell mal rein

Code: Alles auswählen

InitSprite ()
InitMovie ()
InitMouse ()
InitKeyboard ()

OpenScreen (1024,768,32,"old Tennis")

LoadSprite(0,"EinstellungF:PlayerI.bmp",0)
LoadSprite(1,"PlayerII.bmp",0)
LoadSprite(2,"Ball.bmp",0)


Global PlayeryI.l
PlayeryI = 512

Global PlayeryII.l
PlayeryII = 100

Global x.l
x= Random(1)

Global BallSpeedy.l
BallSpeedy=5 

Global BallX.l
Global BallY.l
Global SpeedBall.l
BallX = 512
BallY = 384
SpeedBall = 3

Global PunktePI.l
Global PunktePII.l

Global Delay.l
Delay = 100

Repeat
ExamineMouse()
ExamineKeyboard()
FlipBuffers ()
ClearScreen (0,0,0)


If delay = 0
BallX - SpeedBall
EndIf 

If delay > 0
delay -1
EndIf 


BallY - BallSpeedy


If BallY < 768
 BallSpeedy* -1
EndIf 

If BallY >0
 BallSpeedy* -1
 EndIf 
 
 
 If BallX>1024
 Delay = Random(500)
 SpeedBall= 3
 PlayerPI+1
 BallX=512
 EndIf 
 
  If BallX<0
  Delay = Random(500)
  SpeedBall= 3
 PlayerPII+1
  BallX=512
 EndIf 
 
If speedball >19
speedball =19
EndIf



If SpriteCollision (0,0,PlayeryI,2,BallX,BallY)
SpeedBall +1 
SpeedBall* -1
EndIf 

If SpriteCollision (1,1000,PlayeryII,2,BallX,BallY)
SpeedBall -1
 SpeedBall * - 1
EndIf 


If KeyboardPushed(#PB_key_Down)
PlayeryI +10
  EndIf 
  
  If KeyboardPushed(#PB_key_Up)
PlayeryI - 10
  EndIf 
  
  If MouseButton(1)
PlayeryII -10
  EndIf 
  
If MouseButton(2)
PlayeryII +10
  EndIf 
  
  
 StartDrawing(ScreenOutput()) 
 DrawingMode(1)               
 Locate(200,0)                 
 FrontColor(0,0,255)          
 DrawText("P:" + Str(PlayerPI)) 
 Locate(800,0)                
  FrontColor(255,0,0)          
  DrawText("P:" + Str(PlayerPII)) 
StopDrawing()
  
 DisplayTransparentSprite(0,0,PlayeryI)
 DisplayTransparentSprite(1,1000,PlayeryII)
 DisplayTransparentSprite(2,BallX,BallY)
    

If KeyboardPushed(#PB_Key_Escape)
End
EndIf 
ForEver 


ist ein schönes 2 Playergame (kam leider noch nicht dazu alles richtig einzurücken und zu ordnen also bitte net meckern)

aber ich versuch es morgen nochma mit Screenoutputs <)
wie meinst du das mit den If befehlen
meinst du ich soll eine Variablen für die kannten des Schlägers und Ball machen und dann über if-Befehle ermitteln ob sie sich schneiden oder überlappen?