BallSpiel Problem

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Kevin

Betreff: BallSpiel Problem

BeitragSo, März 06, 2011 14:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie der Titel schon sagt, ich habe ein Problem.
Undzwar bastel ich grade an einem "BallSpiel" (Ja ich weiß ist zwar bescheuert aber zeitverteib.)
Ich habe schon den anderen Thread durchgelesen aber da wollte ich nicht mehr Posten.
Mein Problem ist ich habe einen Ball und der hat zwar Kollisionen, aber geht einfach Durch die Map durch!


Code: [AUSKLAPPEN]
Graphics3D 1366,768,32,1
SetBuffer BackBuffer()


;Name des Progs
AppTitle "BallSpiel"

Cls



Parcour=LoadMesh("map.3ds")
EntityType Parcour, 1

;objekt = LoadMesh("ball.3ds")
objekt = CreateSphere (16)
EntityType objekt, 2
PositionEntity  Objekt,  0,100,0

;Kollis
Collisions 1, 2, 2, 3

Kamera = CreateCamera(objekt)
PositionEntity Kamera, 65.985,226.5,0.949
RotateEntity Kamera, 90,0,0

While Not KeyHit (1)
;Ball Kord/Kollis
MoveEntity objekt, 0,-50,0

RenderWorld
UpdateWorld
Flip
Wend
End

Wenn ich jetzt aber es so schreibe :
Code: [AUSKLAPPEN]
;Kollis
Collisions 2, 1, 2, 3


dann kollidiert der Ball aber unter der Map ,warum geht es nicht andersherum?
  • Zuletzt bearbeitet von Kevin am So, März 06, 2011 16:49, insgesamt einmal bearbeitet

count-doku

BeitragSo, März 06, 2011 14:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

also Code: [AUSKLAPPEN]
Collisions 2,1,2,3

ist richtig, da das bewegte Objekt vorne sein muss.

Und das er darunter hängt liegt einfach daran, dass du RenderWorld und UpdateWorld
falschrum drin hast.


mfg,
count-doku
 

Kevin

BeitragSo, März 06, 2011 14:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Thx
 

Kevin

BeitragSo, März 06, 2011 16:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
ich habe mal wieder ein problem mit dem Ball Spiel.
Da der Ball rotiert kann ich die Kamera nicht an den Ball hängen,dafür habe ich einen cube erstellt der die gleichen koordinaten hat wie der Ball,
aber ich habe ihn nicht angehangen da er sich ja sonst auch mitdrehen würde!
Er übernimt die x,y,z koordinaten des Balles (Objekt)
Hier mein Code: [AUSKLAPPEN]
 



Graphics3D 1366,768,32,1
SetBuffer BackBuffer()


;Name des Progs
AppTitle "BallSpiel"

Cls

objekt = LoadMesh("ball.3ds")
EntityType objekt, 2
PositionEntity  Objekt,  0,100,0

Local ball_x# = EntityX# (Objekt)
Local ball_y# = EntityY# (Objekt)
Local ball_z# = EntityZ# (Objekt)

camo = CreateCube ()
PositionEntity  camo,  ball_x,ball_y,ball_z

Kamera = CreateCamera(camo)
PositionEntity Kamera, 65.985,226.5,0.949
RotateEntity Kamera, 90,0,0

While Not KeyHit (1)

;...bla...blaaaaaa!!!

UpdateWorld         
RenderWorld
Flip
Wend
End

das wurgel

BeitragSo, März 06, 2011 18:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Du hast garnicht dazugesagt, wo jetzt das Problem bei deinem Code auftritt und die Hauptschleife hast du weggelassen!
Was ich dir empfehlen kann ist, den Cube wegzulassen und einen Pivot zu erstellen (CreatePivot). An den hängst du dann den Ball und die Kamera. Wenn du den Ball drehen willst, drehst du den Ball, wenn du ihn bewegen willst, bewegst du den Pivot und die Kamera bewegt sich mit.
1 ist ungefähr 3
 

Kevin

BeitragMo, März 07, 2011 14:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Problem ist: wenn sich der Ball Rotiert, rotiert sich die Kamera mit!
Und ich Kapiere die Pivots nicht!

Bitte um Hilfe

Midimaster

BeitragMo, März 07, 2011 15:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja ,das ist logisch: Du hast die Camera als "Child" des 3D-Objects erschaffen. Wenn sich das Objekt dreht, dann immer mit all seinen Kindern.

Ein...
BlitzBasic: [AUSKLAPPEN]
 Kamera = CreateCamera() 

...(ohne etwas in der Klammer) erstellt eine Kamera, die eigenständig ist.

Wie willst Du denn den Zusammenhang zwischen Kamera und 3D-Objekt?


Ein Pivot ist nichts anderes als eine "Mutter" für andere Objekte. z.b. so könnten Kamera und 3D-Objekt eine gemeinsame Mutter haben, die durch den Raum gleitet. Das sieht dann so aus, als ob die Kamera immer hinter dem 3D Objekt hinterher wäre. Wenn aber nun das 3D-Objekt rotiert, dann rotiert diesmal die Kamera nicht mit:

BlitzBasic: [AUSKLAPPEN]
Mutter=CreatePivot()
Kamera=CreateCamera(Mutter)
Objekt=CreateSphere (16,Mutter)
 

Kevin

BeitragMo, März 07, 2011 16:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Also wenn ich den Code von Midimaster benutze, Bewegt sich die Kamera aber nicht der Ball!

Code: [AUSKLAPPEN]
Graphics3D 1366,768,32,1
SetBuffer BackBuffer()


;Name des Progs
AppTitle "BallSpiel"

Cls



Parcour=LoadMesh("map.3ds")
EntityType Parcour, 1

objekt = LoadMesh("ball.3ds")
EntityType objekt, 2
PositionEntity  Objekt,  0,100,0

;Kollis
Collisions 2, 1, 2, 3

;Kamera = CreateCamera()
Mutter=CreatePivot()
Kamera=CreateCamera(Mutter)
Objekt=CreateSphere (16,Mutter)
PositionEntity Kamera, 0,856.5,0
RotateEntity Kamera, 90,0,0
licht = CreateLight (2 ,Objekt)
lichtmap = CreateLight (1 ,Parcour)

Local speed#
Local lenkung#
Local camx#




While Not KeyHit (1)
;Ball Kord/Kollis
MoveEntity objekt, lenkung,-50,speed
TurnEntity objekt, speed, 0,0,+1
;TurnEntity kamera, -speed,0,0
MoveEntity kamera, lenkung,camx,0

If KeyDown (200) Then
   speed=speed-0.04
ElseIf KeyDown (208) Then
   speed=speed+0.04
   ElseIf KeyDown (203) Then
       lenkung=lenkung-0.01
      ElseIf KeyDown (205) Then
            lenkung=lenkung+0.01
         EndIf
;If EntityPitch(kamera) <> 0 Or EntityYaw(kamera)<> 0 Or EntityRoll (kamera) <> 0 Then
;   EntityPitch (kamera) = 0
;   EntityYaw (kamera) = 0         
;   EntityRoll (kamera) = 0
;EndIf      
   
UpdateWorld         
RenderWorld
Flip
Wend
End

biggicekey

BeitragMo, März 07, 2011 16:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Dann bewege den Ball statt der Kamera! Oder aber den Pivot "Mutter", dann bewegen sich sowohl Kamera als auch Ball. Das Programm macht, was du ihm sagst. Streng dich mal ein wenig an und teste erstmal durch was passiert wenn du welches Objekt drehst. Du hast ja nur 3 zur Auswahl. Dann lernst du schnell was Pivot bedeutet.
#45 www.icekeyunlimited.de www.starcrusade.de
Gewinner BCC#17 !!! mit dotkiller
Nothing more to register - you've cleaned us out![/size]
 

Kevin

BeitragMo, März 07, 2011 16:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn ich den Code: [AUSKLAPPEN]
Graphics3D 1366,768,32,1
SetBuffer BackBuffer()


;Name des Progs
AppTitle "BallSpiel"

Cls



Parcour=LoadMesh("map.3ds")
EntityType Parcour, 1

objekt = LoadMesh("ball.3ds")
EntityType objekt, 2
PositionEntity  Objekt,  0,100,0

;Kollis
Collisions 2, 1, 2, 3

;Kamera = CreateCamera()
Mutter=CreatePivot()
Kamera=CreateCamera(Mutter)
Objekt=CreateSphere (16,Mutter)
PositionEntity Kamera, 0,856.5 ,200
RotateEntity Kamera, 90,0,0
licht = CreateLight (2 ,Objekt)
lichtmap = CreateLight (1 ,Parcour)

Local speed#
Local lenkung#
Local camx#
Local pfeilspeed#


While Not KeyHit (1)
;Ball Kord/Kollis
   MoveEntity mutter, lenkung,-50,speed
   TurnEntity mutter, speed, 0,0,+1
;TurnEntity kamera, -speed,0,0

If KeyDown (200) Then
   speed=speed-0.04
ElseIf KeyDown (208) Then
   speed=speed+0.04
   ElseIf KeyDown (203) Then
       lenkung=lenkung-0.01
      ElseIf KeyDown (205) Then
            lenkung=lenkung+0.01
         EndIf
;If EntityPitch(kamera) <> 0 Or EntityYaw(kamera)<> 0 Or EntityRoll (kamera) <> 0 Then
;   EntityPitch (kamera) = 0
;   EntityYaw (kamera) = 0         
;   EntityRoll (kamera) = 0
;EndIf      
   
UpdateWorld         
RenderWorld
Flip
Wend
End

Benutze gehen die Kollisionen nicht!

Johannes´

BeitragMo, März 07, 2011 18:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Es kann nicht funktionieren, da du in objekt erst einen Ball lädst, dem du den Typ 2 gibst, dann aber in objekt eine Kugel erstellst, die dann letzlich der Spielball ist, aber keinen Typ hat. Dieser erstellte Ball wird dann ja auch an Mutter angehängt.
Außerdem wird ja Mutter bewegt und kann sowieso ungehindert durch die Karte fallen.

Midimaster

BeitragMo, März 07, 2011 20:27
Antworten mit Zitat
Benutzer-Profile anzeigen
also....

um eine Fehler zu finden, brauchst Du zunächst einmal ein Bild, auf dem überhaupt etwas zu sehen ist. Außerdem rate ich dir dringend zu...

BlitzBasic: [AUSKLAPPEN]
Graphics3D 800,600,32,2


...während der Testphase, damit Du den Debugger siehts

Dann rate ich immer zunächst eine Kamera von außen zu benutzen, damit man überhaupt einmal sieht, wie die Objekte zueinanderstehen.

Nächster Tipp: Bewege deine Objekte nicht gleich mit so "rasenden" Geschwindigkeiten, sondern erst mal nur mit 1/10 des geplanten, damit du siehts, wohin sie sich bewegen.

Verwende statt 3D-Maps und 3D-Meshes einfache Formen wie Plane() oder Sphere(). Deine Kollision funktioniert übrigens:

massiv veränderte Start-Werte:
BlitzBasic: [AUSKLAPPEN]
Graphics3D 800,600,32,2
SetBuffer BackBuffer()

AppTitle "BallSpiel"

Cls

Parcour=CreatePlane() ;LoadMesh("map.3ds")
EntityColor Parcour,0,155,0
EntityType Parcour, 1


;objekt = LoadMesh("ball.3ds")

;Kollis
Collisions 2, 1, 2, 3

;Kamera = CreateCamera()
Mutter=CreatePivot()

Kamera=CreateCamera()
PositionEntity Kamera, 0,10 ,-20
RotateEntity Kamera, 0,0,0




Objekt=CreateSphere (16,Mutter)
EntityType objekt, 2
PositionEntity Objekt, 0,10,0

AmbientLight 111,111,211


licht = CreateLight ()
lichtmap = CreateLight (1 ,Parcour)

Local speed#
Local lenkung#
Local camx#
Local pfeilspeed#


While Not KeyHit (1)
MoveEntity mutter, lenkung,-0.50,speed


UpdateWorld
RenderWorld
Flip
Wend

Mit dem Code siehst Du schon mal den Ball auf eine Wiese fallen.

II. Dein Code

Nun wolltest Du ja, dass die Kamera so über dem Ball steht und dann senkrecht nach unten schaut, oder?

Deine Zeile...BlitzBasic: [AUSKLAPPEN]
PositionEntity Kamera, 0,856.5 ,200
...bringt aber die Kamera ganz schön weit Richtung Y und Z von dem Ball weg. Probiers mal mit Z=0 und mit Y=50.

Und bewege dann den Ball unter die Kamera:

Die Zeilen, die Objekt betreffen müssen natürlich alle unterhalb der Mutter=CreatePivot() stehen:

BlitzBasic: [AUSKLAPPEN]
Mutter=CreatePivot()

Kamera=CreateCamera(Mutter)

PositionEntity Kamera, 0,50 ,0
RotateEntity Kamera, 90,0,0


;objekt = LoadMesh("ball.3ds")
Objekt=CreateSphere (16,Mutter)
EntityType objekt, 2
PositionEntity Objekt, 0,10,0


Nun wir es etwas unklar in Deinem Code. Ich vermute mal, der Ball soll fallen, die Kamera aber immer über ihm schweben? Also muss in der REPEAT/UNTIL-Schleife das Objekt fallen!
BlitzBasic: [AUSKLAPPEN]
While Not KeyHit (1)
;Ball Kord/Kollis
MoveEntity Objekt, 0,-0.05,0

MoveEntity Mutter, 0,0,-speed
TurnEntity Mutter, 0,-lenkung,0
.....
und das auch noch viel langsamer als Du denkst. Und die Mutter bewegt sich und dreht sich.

Hier mal alle meine Gedanken auf einem Haufen:
BlitzBasic: [AUSKLAPPEN]
Graphics3D 800,600,32,2
SetBuffer BackBuffer()


;Name des Progs
AppTitle "BallSpiel"

Cls



Parcour=CreatePlane() ;LoadMesh("map.3ds")
EntityType Parcour, 1
EntityColor Parcour,0,222,0


Landschaft=CreateTexture(256,256,0)
SetBuffer TextureBuffer(Landschaft)
Color 0,222,0
Rect 0,0,256,256
Color 0,199,0
Rect i,0,128,256,True
Color 0,155,0
Line 0,0,256,0
Line 0,128,256,128
SetBuffer BackBuffer()
ScaleTexture Landschaft,50,50
EntityTexture Parcour,Landschaft

;Kollis
Collisions 2, 1, 2, 3

;Kamera = CreateCamera()
Mutter=CreatePivot()

Kamera=CreateCamera(Mutter)

PositionEntity Kamera, 0,50,0
RotateEntity Kamera, 90,0,0


;objekt = LoadMesh("ball.3ds")
Objekt=CreateSphere (16,Mutter)
EntityType objekt, 2
PositionEntity Objekt, 0,40,0


licht = CreateLight (2 ,Objekt)
lichtmap = CreateLight (1 ,Parcour)

Local speed#
Local lenkung#

While Not KeyHit (1)
;Ball Kord/Kollis
MoveEntity Objekt, 0,-0.5,0

MoveEntity Mutter, 0,0,-speed
TurnEntity Mutter, 0,-lenkung,0

If KeyDown (200) Then
speed=speed-0.04
ElseIf KeyDown (208) Then
speed=speed+0.04
ElseIf KeyDown (203) Then
lenkung=lenkung-0.01
ElseIf KeyDown (205) Then
lenkung=lenkung+0.01
EndIf

UpdateWorld
RenderWorld
Flip
Wend
End
 

Kevin

BeitragDi, März 08, 2011 21:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Also der Code klappt wunderbar, aber die Kamera bewegt sich langsamer wie der Ball, also sehr Merkwürdig!
Code: [AUSKLAPPEN]
Graphics3D 800,600,32,2
SetBuffer BackBuffer()


;Name des Progs
AppTitle "BallSpiel"

Cls



Parcour=LoadMesh("map.3ds")
EntityType Parcour, 1



;Kollis
Collisions 2, 1, 2, 3

;Kamera = CreateCamera()
Mutter=CreatePivot()

Kamera=CreateCamera(Mutter)

PositionEntity Kamera, 0,150,0
RotateEntity Kamera, 90,0,0


objekt = LoadMesh("ball.3ds",mutter)
;Objekt=CreateSphere (16,Mutter)
EntityType objekt, 2
PositionEntity  Objekt,  0,40,0


licht = CreateLight (2 ,Objekt)
lichtmap = CreateLight (1 ,Parcour)

Local speed#
Local lenkung#

While Not KeyHit (1)
      ;Ball Kord/Kollis
   MoveEntity Objekt, 0,-0.5,0
   
   MoveEntity Mutter, 0,0,-speed
      TurnEntity objekt, speed, 0,0,+1
   TurnEntity Mutter, 0,-lenkung,0
   
   If KeyDown (200) Then
      speed=speed-0.04
   ElseIf KeyDown (208) Then
      speed=speed+0.04
   ElseIf KeyDown (203) Then
      lenkung=lenkung-0.01
   ElseIf KeyDown (205) Then
      lenkung=lenkung+0.01
   EndIf
   
   UpdateWorld         
   RenderWorld
   Flip
Wend
End
;~IDEal Editor Parameters:
;~C#Blitz3D

Midimaster

BeitragDi, März 08, 2011 21:41
Antworten mit Zitat
Benutzer-Profile anzeigen
das hängt mit deinem...BlitzBasic: [AUSKLAPPEN]
      TurnEntity objekt, speed, 0,0,+1
...zusammen. Warum schreibst Du das rein? Was willst Du damit bezwecken?
 

Kevin

BeitragMi, März 09, 2011 17:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Aber wenn ich das Rauswerfe, Rotiert sich der Ball ja nicht, aber wie löse ich dass dann am besten?

Midimaster

BeitragMi, März 09, 2011 19:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Problem ist, wenn der Ball in sich rotiert, dann ändert er auch sein Koordinatensystem. Bisher zeigt seine Y-Achse genauso nach unten wie die Y-Achse der "Mutter" oder der ganzen Welt. drehst Du ihn aber um die X-Achse, dann dreht sich auch das ganze Koordinaten-System um diese X-Achse. Eine anschließende Bewegung in Y-Richtung wird dann in die neue Y-Richtung ausgeführt. Also nicht mehr nach unten, sondern möglicherweise nach hinten.

Als Lösungen sind zwei Ansätze denkbar:

1. Translate

Wenn du den Ball mal gedreht hast, scheidet MoveEntity als Bewegungsbefehl aus, denn das verwendet das "innere" Kordinatensystem des Balls. Dafür verwendest Du jetzt besser TranslateEntity. Dieser Befehl richtet sich immer nach der Ausrichtung des Mutterobjektes. Also zeigt Y immer nach unten.

2. noch ein weiteres Pivot

Der Ball wird in ein weiteres Pivot "Achse" verpackt. Dessen Mutter ist "Mutter" und der Ball wird Child von "Achse". Jetzt kannst Du "Achse" mit MoveEntity fallen lassen und den Ball als Child davon beliebig drehen.

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group