Problem mit LinePick

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

smeagle24

Betreff: Problem mit LinePick

BeitragMo, Nov 10, 2008 23:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo, ich schreinbe gerade einen kleinen EGO-Shoter. Nun will ich mit dem Befehl LinePick überprüfen, das wenn eine Waffe abgefeuert wird, ob man den Gegner getroffen hat oder nicht. Ich habe das mal so versucht zu lösen:
Code: [AUSKLAPPEN]
Graphics3D 1024,768,32,1

SetBuffer BackBuffer()

timer=CreateTimer(90)

AmbientLight 180, 175, 170
Global cam_pivot=CreatePivot()
Global main_cam=CreateCamera()
CameraViewport main_cam,0,0,1024,768
CameraClsColor main_cam,190,185,180
CameraFogColor main_cam,180,175,170
main_light=CreateLight(2,main_cam)
PositionEntity main_cam,0,20,-1
LightRange main_light,50
EntityType main_cam,1
EntityRadius main_cam,17
EntityRadius cam_pivot,17

Global leben=100

gegner=LoadMesh("android.b3d")
ScaleEntity gegner,.8,.8,.8
RotateEntity gegner, 0,180,0
PositionEntity gegner,0,0,100
EntityRadius gegner,3,3
EntityPickMode gegner,1

pistole=LoadMesh("revolver.b3d")
PositionEntity pistole,-.7,8,15
ScaleEntity pistole,0.08,0.08,0.08
EntityParent pistole, main_cam
ShowEntity pistole
EntityShininess pistole,1
MoveMouse 320,240

While Not KeyHit(1)
      
   HidePointer
   
   Cls
   
   TurnEntity cam_pivot,0,0 -MouseXSpeed(),0
    TurnEntity main_cam, MouseYSpeed(),0,0
    RotateEntity cam_pivot, EntityPitch#(cam_pivot), EntityYaw#(cam_pivot),0
   RotateEntity main_cam, EntityPitch#(main_cam), EntityYaw#(cam_pivot),0

   If KeyDown(31) Then MoveEntity cam_pivot, 0, 0, -2
   If KeyDown(17) Then MoveEntity cam_pivot, 0, 0,2
   If KeyDown(32) Then MoveEntity cam_pivot, 2, 0, 0
   If KeyDown(30) Then MoveEntity cam_pivot, -2,0, 0
   PositionEntity main_cam, EntityX#(cam_pivot), EntityY#(cam_pivot), EntityZ#(cam_pivot)
   PositionEntity cam_pivot, EntityX#(main_cam), EntityY#(main_cam), EntityZ#(main_cam)

   If MouseHit(1)
      treffer=LinePick(EntityX(main_cam),EntityY(main_cam),EntityZ(main_cam),0,0,100,2)
      If treffer>0
         leben=leben-2
      EndIf
      If leben<=0
         HideEntity gegner
      EndIf
   EndIf
   
   MoveMouse 290,MouseY()
      
   UpdateWorld()
   RenderWorld()
   
   Text 100,50,leben

   WaitTimer timer
   
   Flip
   
Wend

End

Nur habe ich das Problem, das dem Gegner bei jeden Schuss Leben abgezogen wird, ob ich in nun treffe oder daneben schiesse. Kann mir vielleicht jemand sagen, was ich hier falsch gemacht habe?
 

da_poller

BeitragDi, Nov 11, 2008 8:05
Antworten mit Zitat
Benutzer-Profile anzeigen
du erhältst kein true oder false wie du vermutest zurück sondern das handle des ersten getroffenen objektes.

linepick beschreibt es ganz schön..

hoffe ich als 3d nichts wisser konnte helfen.
 

smeagle24

BeitragDi, Nov 11, 2008 8:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Das mit dem Rückgabewert ist mir klar.
Nur mein Problem ist, der Startpunkt des LinePick ist die Camera. Aber wie kann ich dann den Mesh "Treffen" wenn ich in den Rücken zukehre?
 

da_poller

BeitragDi, Nov 11, 2008 9:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
If treffer>0
         leben=leben-2
      EndIf


hier liegt das problem..

treffer enthält die ID des getroffenen gegenstandes der egal wo du hinschießt eig immer über 0 ist(wand boden etc...)

du musst treffer und die id des mesh des gegners vergleichen ist die gleich triffst du..
 

smeagle24

BeitragDi, Nov 11, 2008 9:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn ich dich richtig verstehe meinst du, das ich meinen Code etwa so umändern sollte
Code: [AUSKLAPPEN]
If treffer=gegner
   leben=leben-2
           EndIf

Denn falls du dass meinst, das funktioniert auch nicht.
Oder ich sitzt total auf der Leitung und verstehe dich einfach nicht.
 

da_poller

BeitragDi, Nov 11, 2008 10:01
Antworten mit Zitat
Benutzer-Profile anzeigen
also der MESH oder das entity(ka bin 3d noob) haben eine id(denke die vom mesh musst du verwenden)

und wenn die id die linepick hergibt = der id des meshes ist dann ist ein treffer vorhanden.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, Nov 11, 2008 10:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Für Sachen, wo ein Entity bereits die Richtung vorgibt, kann man auch EntityPick benutzen. Vielleicht hilft dir folgender Code ja.

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

timer=CreateTimer(90)

AmbientLight 180, 175, 170
Global cam_pivot=CreatePivot()
Global main_cam=CreateCamera()
CameraViewport main_cam,0,0,1024,768
CameraClsColor main_cam,190,185,180
CameraFogColor main_cam,180,175,170
main_light=CreateLight(2,main_cam)
;PositionEntity main_cam,0,20,-1
LightRange main_light,50
EntityType main_cam,1
EntityRadius main_cam,17
EntityRadius cam_pivot,17

Global leben=100

gegner=CreateCube();LoadMesh("android.b3d")
EntityColor gegner,255,0,0
ScaleEntity gegner,.8,.8,.8
;RotateEntity gegner, 0,180,0
PositionEntity gegner,0,0,100
EntityRadius gegner,3,3
EntityPickMode gegner,1

pistole=CreateCube();LoadMesh("revolver.b3d")
;PositionEntity pistole,-.7,8,15
PositionEntity pistole,0,0,3
ScaleEntity pistole,0.08,0.08,0.08
EntityParent pistole, main_cam
ShowEntity pistole
EntityShininess pistole,1
MoveMouse 320,240

While Not KeyHit(1)
   
   HidePointer
   
   Cls
   
   TurnEntity cam_pivot,0,0 -MouseXSpeed(),0
   TurnEntity main_cam, MouseYSpeed(),0,0
   RotateEntity cam_pivot, EntityPitch#(cam_pivot), EntityYaw#(cam_pivot),0
   RotateEntity main_cam, EntityPitch#(main_cam), EntityYaw#(cam_pivot),0
   
   If KeyDown(31) Then MoveEntity cam_pivot, 0, 0, -2
   If KeyDown(17) Then MoveEntity cam_pivot, 0, 0,2
   If KeyDown(32) Then MoveEntity cam_pivot, 2, 0, 0
   If KeyDown(30) Then MoveEntity cam_pivot, -2,0, 0
   PositionEntity main_cam, EntityX#(cam_pivot), EntityY#(cam_pivot), EntityZ#(cam_pivot)
   PositionEntity cam_pivot, EntityX#(main_cam), EntityY#(main_cam), EntityZ#(main_cam)
   
   If MouseHit(1)
;      treffer=LinePick(EntityX(main_cam),EntityY(main_cam),EntityZ(main_cam),0,0,100,2)
      treffer=EntityPick(pistole,1000)
      If treffer<>0
         leben=leben-2
      EndIf
      If leben<=0
;         HideEntity gegner
      EndIf
   EndIf
   
   MoveMouse 512,384
   
   UpdateWorld()
   RenderWorld()
   
   Text 100,50,leben
   
   WaitTimer timer
   
   Flip
   
Wend

End


Statt If treffer>0 würde ich auf jeden Fall If treffer<>0 machen, da eine Integer unter Blitz3D signed ist und somit auch negative Werte beinhalten kann.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

smeagle24

BeitragDi, Nov 11, 2008 11:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Habe meinen Code entsprechend deines Vorschlages von linepick auf entitypick umgeändert und jetzt funktioniert das ganze genau so wie ich es haben will.

Vielen Dank für eure schnelle Hilfe.

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group