Kollisionsproblem

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

OnkelManfred

Betreff: Kollisionsproblem

BeitragSo, Sep 28, 2008 15:03
Antworten mit Zitat
Benutzer-Profile anzeigen
hallo!
ich habe vor kurzer zeit versucht, eine art "pong" zu programmieren. das spiel zeichnet sich durch 4 schwierigkeitsgrade aus, wobei aber teilweise probleme mit der kollision auftreten. ich frag mich was man da machen kann bzw. wo der fehler liegt!

Code: [AUSKLAPPEN]

screenhoehe=600
Graphics 800,screenhoehe,32
SetBuffer BackBuffer()

name1$=Input("Spieler 1: Bitte geben Sie ihren Namen ein: ")
Print ""
name2$=Input("Spieler 2: Bitte geben Sie ihren Namen ein: ")
Cls

Locate 1,1
Print "SCHWIERIGKEIT"
Print "1: Einfach   (  langsame Geschwindigkeit   1x)"
Print "2: Mittel    (  normale  Geschwindigkeit   2x)"
Print "3: Schwer    (  schnelle Geschwindigkeit   3x)"
Print "4: Unmöglich (unglaubliche Geschwindigkeit 5x)"
Print ""
schwierigkeit=Input("Bitte geben Sie die Schwierigkeit ein: ")

If schwierigkeit>4 Then schwierigkeit=2
If schwierigkeit<1 Then schwierigkeit=2

If schwierigkeit=4 Then schwierigkeit=5
speedbonus=schwierigkeit

name1$=name1$+" :"
name2$=name2$+" :"

Print "Drücken Sie eine beliebige Taste um das Spiel zu starten ..."
WaitKey

FlushKeys()
Cls

ding1=LoadImage("ding.bmp")
ding2=LoadImage("ding.bmp")
ball=LoadImage("ball.bmp")

h_oben=-19
h_unten=19
h_ding=80
by=260
y1=230
y2=230
xb=390
speed_x=speedbonus
speed_y=speedbonus
p1=0
p2=0

DrawImage ding1,20,y1
DrawImage ding2,760,y2

While Not KeyHit(1)

If speed_y=0 Then
speed_y=speed_y-1
EndIf

If by+speed_y<0 Then speed_y=-speed_y
If by+speed_y>580 Then speed_y=-speed_y

;-------RECHTSKOLLISION---------
If xb=740 And by>y2-19
speed_x=-speed_x
speed_y=speed_y-speedbonus
EndIf

If xb=740 And by>y2+80
speed_x=-speed_x
   If speed_y<=0 Then
   speed_y=speed_y+speedbonus
   Else
   speed_y=speed_y-speedbonus
   EndIf
EndIf
;----------------------

;----PUNKTE-RECHTS-----
If xb>810 Then
xb=390
p1=p1+1
Delay 1000
speed_x=-speed_x
speed_y=0
y1=230
y2=230
by=260
EndIf
;----------------------

;---------LINKSKOLLISION--------
If xb=40 And by>y1-19
speed_x=-speed_x
speed_y=speed_y-speedbonus
EndIf

If xb=40 And by>y1+80
speed_x=-speed_x
   If speed_y<=0 Then
   speed_y=speed_y+speedbonus
   Else
   speed_y=speed_y-speedbonus
   EndIf
EndIf
;------------------------

;-------PUNKTE-LINKS-------
If xb<-50 Then
xb=390
p2=p2+1
Delay 1000
speed_x=-speed_x
speed_y=0
y1=230
y2=230
by=260
EndIf
;---------------------------

;----BLÖCKE-BEGRENZUNG----
If y1>500 Then y1=500
If y1<20 Then y1=20

If y2>500 Then y2=500
If y2<20 Then y2=20
;--------------------------

; =====SPIELER 1=========
If KeyDown(31)=True Then
y1=y1+schwierigkeit+2
EndIf

If KeyDown(17)=True Then
y1=y1-schwierigkeit-2
EndIf
; =======================


; =====SPIELER 2=========
If KeyDown(208)=True Then
y2=y2+schwierigkeit+2
EndIf

If KeyDown(200)=True Then
y2=y2-schwierigkeit-2
EndIf
; =======================

xb=xb+speed_x
by=by+speed_y

DrawImage ding1,20,y1
DrawImage ding2,760,y2
DrawImage ball,xb,by

Text 1,1,"Punkte:"
Text 1,21,name1$+p1
Text 1,36,name2$+p2

Flip
Cls
Wend


p.s.: im 3. schwierigkeitsgrad ist dies am einfachsten zu erkennen

Eingeproggt

BeitragSo, Sep 28, 2008 15:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Würde vorschlagen, die Variable "xb" nicht mit "=" auf einen Wert exakt zu überprüfen, sondern mit ">=" und "<=" überprüfen, ob die SPielfeldbegrenzungen über- bzw unterschritten wurden. Das funktioniert für jede Geschwindigkeit Wink

mfG, Christoph.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9
 

OnkelManfred

BeitragSo, Sep 28, 2008 17:46
Antworten mit Zitat
Benutzer-Profile anzeigen
eig gute idee, aber funktioniert nicht, da der ball, wenn er das spielfeld überschritten hat, teilweise wieder zurück "fliegt" Sad

Code: [AUSKLAPPEN]

;---------LINKSKOLLISION--------
If xb<=40 And by>y1-19
speed_x=-speed_x
speed_y=speed_y-speedbonus
EndIf

If xb<=40 And by>y1+80
speed_x=-speed_x
   If speed_y<=0 Then
   speed_y=speed_y+speedbonus
   Else
   speed_y=speed_y-speedbonus
   EndIf
EndIf

;-------RECHTSKOLLISION---------
If xb>=740 And by>y2-19
speed_x=-speed_x
speed_y=speed_y-speedbonus
EndIf

If xb>=740 And by>y2+80
speed_x=-speed_x
   If speed_y<=0 Then
   speed_y=speed_y+speedbonus
   Else
   speed_y=speed_y-speedbonus
   EndIf
EndIf

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, Sep 28, 2008 18:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Dann halt vor der Bewegung prüfen ob mit der momentanen Geschwindigkeit im nächsten Frame der Ball über die Begrenzung fliegt oder nicht. Wenn nicht, dann Bewegung in jeweilige Richtung durchführen.

Oder anders:

Die Ballposition zwischenspeichern und bei einer Kollisions vor dem zeichnen auf die ursprüngliche Position festlegen. Gerade diese Methode wird bei einer Imagekollision gerne genommen, da am wenigsten Probleme verursacht.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

OnkelManfred

BeitragMo, Sep 29, 2008 16:30
Antworten mit Zitat
Benutzer-Profile anzeigen
ok und wie sollte man das genau umsetzen Question

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group