Collisions

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

Pdd

Betreff: Collisions

BeitragDi, Nov 21, 2006 16:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
Ich habe mom. ein Problem mit 3D-Collisions. (Gibt es dazu ein Tutorial o.ä.? )

Hier mein Code:
Code: [AUSKLAPPEN]

...
   For Player = Each TPlayer
   
      EntityType Player\schiff, Player\ID ; muss das jedesmal sein? oder reicht das einmal, am anfang als der Player erstellt wird?
MoveEntity Player\schiff, 0, 0, Player\Speed#
...
      For Schuss = Each TSchuss
      
         EntityType Schuss\Cube, 999 ; Muss das jedesmal sein? o.O
         Collisions Player\ID, 999, 2, 1 ; Muss das jedesmal sein?
         
         ;ClearCollisions ; Muss das rein oder nicht?
      
         MoveEntity Schuss\Cube, 0, 0, Schuss\Speed
         For s = 1 To 15 ; Schüsse stückweise versetzen, damit der Schuss nicht das schiff überspringt.
            MoveEntity Schuss\Cube, 0, 0, (Schuss\Speed / 15)
            Col_Anzahl = CountCollisions(Player\schiff)
            For i = 1 To Col_Anzahl
               DebugLog("COL!!! >>> " + CollisionEntity(Player\schiff, i) + " <<< ")
            Next
         Next
      Next   

Leider funktioniert das nicht richtig. Hat einer ne Idee?
Lieber Apfel als Birne.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, Nov 21, 2006 16:51
Antworten mit Zitat
Benutzer-Profile anzeigen
EntityType und Collisions müssen nicht immer wieder gesetzt werden. Bei ClearCollisions bin ich mir nicht ganz sicher. Probleme hat es bei mir nicht gegeben, wenn man es nicht in ein Loop rein setzte. Auch dann nicht, wenn tausende Kollisionen statt gefunden haben. Es muß auch nicht eine schrittweise Kollisionsprüfung durchgeführt werden, um ein Objekt durch zu hoche Geschwindigkeit nicht durch ein Hinderniss schiessen zu lassen. Das macht 3D schon für dich...
 

Dreamora

BeitragDi, Nov 21, 2006 16:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Deine "Move damit nicht überspringt" funktionalität ist eine gute idee. Leider wird ein updateworld notwendig um die Kollisionen neu zu berechnen.

Wenn du "überspringen" verhindern willst, empfielt sich LinePick.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Pdd

BeitragDi, Nov 21, 2006 17:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Also es tut Wink Hab es ganz neu jetzt gelöst:
Code: [AUSKLAPPEN]
   For Player = Each TPlayer
      For Schuss = Each TSchuss
         Col_Anzahl = CountCollisions(Schuss\Cube)
         For i = 1 To Col_Anzahl
            DebugLog("COL!!! >>> " + CollisionEntity(Player\schiff, i) + " <<< ")
         Next
      Next
   Next


Diese FUnktion nützt garnichts. Denn es zeigt nichts an. Das es tut merke ich nur daran, das die Schüsse am Gegner hängen bleiben Wink Jetzt muss ich nurnoch das hier rausfinden Razz
Lieber Apfel als Birne.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, Nov 21, 2006 18:19
Antworten mit Zitat
Benutzer-Profile anzeigen
@Dreamora, hab ich jetzt was falsch verstanden? Ein Überspringen kommt nicht vor in 3D. Dazu hab ich mal ein Testprogramm geschrieben. Falls es bei euch anders sein sollte, so währe es natürlich gravierend!

Code: [AUSKLAPPEN]
Graphics3D 400,400,0,2
SetBuffer BackBuffer()

camera=CreateCamera()
PositionEntity camera,0,0,-20

light=CreateLight()
RotateEntity light,40,20,0

cube=CreateCube()
ScaleEntity cube,.1,10,10
EntityType cube,2

sphere1=CreateSphere()
EntityType sphere1,1

sphere2=CreateSphere()
EntityColor sphere2,255,0,0

Collisions 1,2,2,2


For x=15 To -15 Step -10
 PositionEntity sphere1,x,2,0
 PositionEntity sphere2,x,-2,0
 UpdateWorld
 RenderWorld
 Flip
 Delay 1000
Next
End

Pdd

BeitragDi, Nov 21, 2006 19:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, also Überspringen tut er nicht Smile
Hab aber das Problem, das die Schüsse zwar hängenbleiben, aber nicht "registriert" werden.

Code: [AUSKLAPPEN]
   For Player = Each TPlayer
      For Schuss = Each TSchuss
         If EntityCollided(Player\schiff, 999) <> 0 Then DebugLog("col!")
         Col_Anzahl = CountCollisions(Schuss\Cube)
         For i = 1 To Col_Anzahl
            DebugLog("COL!!! >>> " + CollisionEntity(Player\schiff, i) + " <<< ")
         Next
      Next
   Next[quote]

Ich probiere also 2 Möglichkeiten, einmal EntityCollieded, und einmal mit CountCollissions. Doch im Log wird nichts angezeigt! Wie kannich denn nun erkennen ob eine Kollision stattgefunden hat?[/quote]
Lieber Apfel als Birne.

Markus2

BeitragDi, Nov 21, 2006 19:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Collisionen finden nur statt bei den Dingen die sich bewegt haben so weit ich mich erinnern kann ...

Pdd

BeitragDi, Nov 21, 2006 20:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Aber beides Bewegt sich! Schiff und Schuss! Razz
Lieber Apfel als Birne.

Markus2

BeitragMi, Nov 22, 2006 0:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm,
habe dir mal nen Beispiel gemacht wie es sein sollte :
Rechte Maustaste bewegt den Schuss auf einen Spieler wo Punkte
abgezogen werden und der Spieler wo der Schuss her kam bekommt Punkte .

Code: [AUSKLAPPEN]

Graphics3D 640,480,0,0

cam=CreateCamera()
PositionEntity cam,0,0,-8
CameraClsColor cam,64,64,64

;----------------------------
Type TPlayer
 Field e
 Field Schield#
 Field Points
End Type

Global p1.TPlayer
p1.TPlayer=New TPlayer
p1\e=CreateCube()
p1\Schield=255
EntityType p1\e,1 ;<-
EntityRadius p1\e,1
NameEntity p1\e,"Spieler 1"
MoveEntity p1\e,6,0,0

Global p2.TPlayer
p2.TPlayer=New TPlayer
p2\e=CreateCube()
p2\Schield=255
EntityType p2\e,2 ;<-
EntityRadius p2\e,1
NameEntity p2\e,"Spieler 2"

;---------------------------- Vorlage zum kopieren des Entitys
Global eSchuss=CreateCube()
EntityColor eSchuss,255,0,0
HideEntity eSchuss
EntityType eSchuss,999
EntityRadius eSchuss,1
NameEntity eSchuss,"Schuss"

;----------------------------
Type TSchuss
 Field e
 Field p.TPlayer
End Type

;----------------------------

MainLoop()
End

Function MainLoop()

 Local i
 Local ColAnzahl
 Local s.TSchuss
 Local p.TPlayer

 ClearCollisions
 Collisions 999,1, 2,1 ;Schuss 999 mit Spieler 1 testen , Kugel zu Polygon , Stop
 Collisions 999,2, 2,1 ;Schuss 999 mit Spieler 2 testen , Kugel zu Polygon , Stop

 While Not KeyHit(1)

  s.TSchuss=First TSchuss
  If s=Null Then
   NeuerSchuss p1
  Else
   If MouseDown(1)>0 Then MoveEntity s\e,-0.5,0,0
   If MouseDown(2)>0 Then MoveEntity s\e, 0.5,0,0
  EndIf

  UpdateWorld
  RenderWorld
 
  For s = Each TSchuss
   ColAnzahl = CountCollisions(s\e)
   If ColAnzahl Then
    Text 0,0,"COL " + ColAnzahl + "x " + EntityName(s\e) + " von " + EntityName(s\p\e)
    For i = 1 To ColAnzahl
     e=CollisionEntity(s\e,i)
     Text 0,i*14,"COL mit " + EntityName(e)
     For p = Each TPlayer     
      If e=p\e Then
       p\Schield=p\Schield-1:If p\Schield<0 Then p\Schield=0
       EntityColor e,p\Schield,p\Schield,p\Schield
      EndIf
     Next
    Next
    s\p\Points=s\p\Points+1
    FreeEntity s\e
    Delete s
   EndIf
  Next

  Text 0,200,"Spieler 1 Punkte "+p1\Points
  Text 0,214,"Spieler 2 Schield "+p2\Schield

  Flip

 Wend

End Function

Function NeuerSchuss(p.TPlayer)

 Local s.TSchuss
 s.TSchuss=New TSchuss
 s\e=CopyEntity(eSchuss)
 s\p=p ;<- von wem der Schuss kam
 MoveEntity s\e,-5,0,0

End Function
 

FBI-blitz

BeitragMi, Nov 22, 2006 10:42
Antworten mit Zitat
Benutzer-Profile anzeigen
https://www.blitzforum.de/foru...php?t=9775

Das ist n Tutorial dazu....
Computer 1: AMD Athlon64 3500+ | nVidia GF 7900GT | 1024 MB DDR-RAM | ASUS A8N-SLI Preimium | 250 GB SATA 2 || WindowsXP | Blitz3D | Blitz+
Computer 2: AMD AthlonXP 2400+ | ATI Radeon 9500 | 512 MB DDR-RAM | MSI K7N2 | 80 GB IDE | 160 GB IDE || WindowsXP | Blitz3D | Blitz+
Computer 3: Intel Pentium MMX | onBoard-Grafik | 32 MB RAM | 1 GB IDE || Windows 98 SE | Blitz+

Pdd

BeitragMi, Nov 22, 2006 14:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank, habs hinbekommen, es funktioniert jetzt wunderbar *freu* Razz
Lieber Apfel als Birne.

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group