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.
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:
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

Wow ich glaub das is noch nen wenig zu hoch für mich
aber danke
und danke noch mal an alle anderen
Verfasst: 22.06.2006 20:10
von PMV

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

...
Also ich lös das ganze jetzt mal auf ... dafür hab ich ja auch angefangen

... 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
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
MFG PMV
Verfasst: 22.06.2006 20:34
von Ghost
ok habs jetzt leider schon mit Bildern gemacht
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?