(3D) Entity kolliedieren 1 mal zählen

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

LucySalz

Betreff: (3D) Entity kolliedieren 1 mal zählen

BeitragSa, Apr 02, 2011 9:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo liebe BB Gemeinde ^^

Ich hab folgende frage:

Code: [AUSKLAPPEN]
Graphics3D 1024, 768,32,2

SetBuffer BackBuffer()

AmbientLight 20, 20, 20

Global m=0

Global camera=CreateCamera()

Global cylinder=CreateCylinder(30)

Global sphere=CreateCylinder(20)

PositionEntity cylinder, 0, 0, 5
PositionEntity sphere, -5, 0, 5

Global light=CreateLight(1)


PositionEntity light, 0, 2, 4

PositionEntity camera,0,0,-6

EntityColor sphere, 0, 200, 0
EntityColor cylinder, 200, 0, 0

EntityType cylinder, 1
EntityType sphere, 2

Collisions 1, 2, 2, 2

While Not KeyHit(1)



If m=0
       
        If KeyDown(200)
        MoveEntity cylinder,0,0,.1
        EndIf
       
          If KeyDown(205)
        MoveEntity cylinder,.1,0,0
        EndIf
       
          If KeyDown(203)
        MoveEntity cylinder,-.1,0,0
        EndIf


        If KeyDown(208)
        MoveEntity cylinder,0,0,-.1
        EndIf
       
EndIf   
     
 
       
        WireFrame(0)

        UpdateWorld
     
        RenderWorld
      Text 100,100, "distanz: " + EntityDistance(sphere, cylinder)
         

If KeyHit(28)
m=m+1

If m > 1
m= 0
EndIf
EndIf   


If  EntityCollided(cylinder, 2)
If a = -7
FreeEntity sphere
EndIf
ResetEntity sphere
a=a-1
EndIf

Text 0,0,a
Text 0,15,m




If m=2
m = m - 2
EndIf      


        Flip

Wend


da sollen die beiden cylinder kollidieren, aber die variabel wir nur wenn sie sich beide berühren fast ganz runter gezählt, ich möchte aber, dass jede einzelne kollision gezöhlt wird, also der cylinder zurücksetzen muss um erst eine weitere kollision zu machen?!
Lars Kammer
 

Omenaton_2

BeitragSa, Apr 02, 2011 9:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Mach für dein bewegliches Objekt eine neue Variable, "InKollision%". Als Wert soll sie 0 oder 1 haben können. Start Wert ist 0.

Dann mach noch eine Rutine, die am Ende der Haupt Spiel Schleife (nach RenderWorld) in der ganz allgemein geprüft wird, ob seit der letzten Überprüfung eine Kollision statfand. Wenn ja, dann setzt du die InKollision auf 1, wenn nicht, dann auf 0. Auf jeden Fall wird diese Variable ständig (oder nur alle halbe Sekunde) aufgefrischt.

Dann an der Stelle, wo du abhängig davon ob dein bewegliches Objekt neu mit etwas kollidiert was machen willst (wie Punkte abziehen, etc.) machst du das Bewirken von etwas davon abhängig, ob gerade eine Kollision statfindet UND ob die InKollision auf 0 steht.
Dann zählt die Kollision nur dann, wenn vorher noch keine Kollision da war.
InKollision wird jetzt auf 1 gesetzt.

Also so bald eine Kollision statfindet, führst du nur ein Mal deine Rutine mit dem Inhalt aus und sperrst gleichzeitig die Rutine für weiteres Ausführen in dem du InKollision auf 1 stellst. Erst wenn die Sperre durch Nicht-Statfinden von Kollisionen aufgehoben wird, kann deine wichtige Inhalts-Rutine wieder ausgeführt werden.

Ich bin mir nicht ganz sicher ob das so funktioniert, aber so kurz nachgedacht könnte das so gehen.
 

LucySalz

Betreff: ??

BeitragSa, Apr 02, 2011 10:24
Antworten mit Zitat
Benutzer-Profile anzeigen
jo danke erstmal, doch könntest du mir mal nen code schnipsel geben?

Ich glaub ich hab grade ein gedächtnis und nachdenk stillstand XD
Lars Kammer
 

LucySalz

Betreff: ???

BeitragSo, Apr 03, 2011 17:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Keiner?
Lars Kammer

BladeRunner

Moderator

BeitragSo, Apr 03, 2011 17:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Kurz und Knapp: Nö. Wie wäre es wenn Du erstmal selbst drüber nachdenkst und die Früchte deiner Überlegungen in Code fasst und den testest?
Und wenn es dann noch nicht klappt kannst Du uns deinen neu erschaffenen Code zeigen und vielleicht finden wir ja die Fehler darin.
Nebenbei: Doppelposts zum Pushen sind hier untersagt, also unterlass das bitte zukünftig. Danke.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Dottakopf

BeitragDo, Apr 07, 2011 12:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi !

also erstmal.. nimm dir das zu herzen was Blade sagt. Hier im forum kommst du nur vorran wenn du zeigst das du es wenigstens sinnvoll versucht hast zu Lösen.
Bitte versuche auch im ersten post genauer zu beschreiben was du brauchst und nicht,

Zitat:
HI... <quellcode> und <fast nichts aussagender einzeilger>
Wink


Also... hier in der Hilfe gibts einen Befehl und sogar ein Beispiel welcher dich glücklich machen könnte.
Rausfizeln UND VERSTEHEN musst du es selber. Viel Spaß damit!

Hier der besagte Befehl:
BlitzBasic: [AUSKLAPPEN]
EntityCollided



Hier lauffähiger code...
Code: [AUSKLAPPEN]

Graphics3D 640, 480
SetBuffer BackBuffer()
camera = CreateCamera()
RotateEntity camera, 45, 0, 0
PositionEntity camera, 0, 15, - 10
light = CreateLight()
RotateEntity light, 45, 0, 0

sphere = CreateSphere(32)
EntityType sphere, 1
EntityRadius sphere, 1
PositionEntity sphere, 0, 11, 0

cube = CreateCube()
EntityType cube, 2
EntityColor cube, 0, 100, 0
PositionEntity cube, 0, - 5, 0
ScaleEntity cube, 10, 10, 10

cylinder = CreateCylinder(32)
EntityType cylinder, 2
EntityColor cylinder, 255, 0, 0
PositionEntity cylinder, 0, 7, 0
ScaleEntity cylinder, 2, 2, 2

Collisions 1, 2, 2, 2

While Not KeyDown(1)
   x# = 0
   y# = 0
   z# = 0
   If KeyDown(203) = 1 Then x# = - 0.1
   If KeyDown(205) = 1 Then x# = 0.1
   If KeyDown(208) = 1 Then z# = - 0.1
   If KeyDown(200) = 1 Then z# = 0.1
   MoveEntity sphere, x#, - 0.1, z#
   UpdateWorld
   RenderWorld
   col = CountCollisions(sphere)
   Text 0, 0, "Kollision(en):"
   Text 300, 0, "1. Kollision mit:" + EntityCollided(sphere, 2)
   For i = 1 To col
      Text 000, i * 20, "Entity=" + CollisionEntity(sphere, i)
      Text 150, i * 20, "Surface=" + CollisionSurface(sphere, i)
      Text 300, i * 20, "Triangle=" + CollisionTriangle(sphere, i)
   Next
   Flip
Wend
End




Hier im Forum unter Hilfe -> 3D -> und Kollision wirst du fündig.


Gruß
Dottakopf
Rechtschreibfehler gelten der allgemeinen Belustigung!

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group