Pfeil und Bogen

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

Mr. P

Betreff: Pfeil und Bogen

BeitragDi, Feb 07, 2017 16:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi Leute, ich versuche gerade ein pfeilähnliches Geschoss zu programmieren, weiß aber nach etlichen Versuchen nicht mehr weiter. Das Geschoss soll sich im bezug auf die Zeit oder ähnliches Drehen, so als ob es von der Gravitation beeinflusst werde. Vielleicht könnt ihr mir ein paar befehle nennen oder mir ein Code-Beispiel zeigen mit dem das geht. Hier ist mein bisheriger Versuch:

BlitzBasic: [AUSKLAPPEN]

;apptitle ""

Graphics3D 800,600,32,1

; Globals, Locals, Constants etc.
Global my#
Global mx#
Const g = 1
Local diff = 20 ; Verschiebung der Kugel auf der Z-Achse
Const v0 = 100

; Scale, Position , Assign to etc.
light = CreateLight()
PositionEntity light,0,20,0

plane = CreatePlane()
cam = CreateCamera()

bullet = CreateCone()
PositionEntity bullet,0,0,diff
EntityParent bullet,cam

; Types
Type bullet
Field t
Field pitch
Field yaw
Field bullet
End Type

; Settings
MoveMouse GraphicsWidth()/2,GraphicsHeight()/2

SetBuffer BackBuffer() ; Backbuffer
timer = CreateTimer(40); Timer

Repeat

; 3D
move(cam)
; bullet
If MouseDown(1)
b.bullet = New bullet
b\t = 0
b\bullet = CopyMesh(bullet,bullet)
PositionEntity b\bullet,EntityX(bullet),EntityY(bullet),EntityZ(bullet)-diff
;RotateEntity b\bullet,EntityPitch(bullet),EntityYaw(bullet),EntityRoll(bullet)
EndIf
For b.bullet = Each bullet
EntityParent b\bullet,0

b\t = b\t + 1
MoveEntity b\bullet,0,0,v0;--------------------------- das kann man vielleicht mit translateentity lösen
TranslateEntity b\bullet,0,-0.5*2*b\t*b\t,0
;----------------------------------------------------- hier soll die rotate- oder turnentity-Lösung hin
If EntityY(b\bullet) < 0
Delete b
EndIf
Next

UpdateWorld
RenderWorld

; 2D
Text 0,0,"x: "+EntityX(cam)
Text 0,20,"y: "+EntityY(cam)
Text 0,40,"z: "+EntityZ(cam)

WaitTimer(timer)
Flip

Until KeyHit(1)
End

; Pause

; Functions
Function move(e)
If KeyDown(17)
MoveEntity e,0,0,1
EndIf
If KeyDown(31)
MoveEntity e,0,0,-1
EndIf
If KeyDown(32)
MoveEntity e,1,0,0
EndIf
If KeyDown(30)
MoveEntity e,-1,0,0
EndIf

If MouseY() = 90
MoveMouse MouseX(),GraphicsHeight()
ElseIf MouseY() = -90
MoveMouse MouseX(),0
EndIf

mx = mx + MouseXSpeed()
my = my + MouseYSpeed()
MoveMouse GraphicsWidth()/2,GraphicsHeight()/2

RotateEntity e,my,-mx,0
End Function


*edit
Dort steht leider nichts vom Änderungswinkel des Geschosses Razz den muss ich nämlich berechnet haben, und außerdem ist das ganze nur mit translateentity umzusetzen und das ist praktisch unmöglich, behaupte ich mal ^^und von moveentity wird immer schlecht geredet ...

Also bei mir will es immer noch nicht klappen aber ich arbeite dran, vielleicht seht ihr ja den fehler, hier ist der code:

BlitzBasic: [AUSKLAPPEN]

;apptitle ""

Graphics3D 800,600,32,1

; Globals, Locals, Constants etc.
Global my#
Global mx#
Global bspeed# = 20
Const g = 1
Const v0 = 100
Local diff = 20 ; Verschiebung der Kugel auf der Z-Achse


; Scale, Position , Assign to etc.
light = CreateLight()
PositionEntity light,0,20,0

plane = CreatePlane()
cam = CreateCamera()
PositionEntity cam,10,10,-20
blooper = LoadMesh("blooper.b3d")
PositionEntity blooper,0,10,10
ScaleEntity blooper,0.1,0.1,0.1
RotateEntity blooper,0,180,0


feet = LoadAnimMesh("feet.b3d")
skin = LoadTexture("nskinbr.jpg")
EntityTexture feet,skin
body = LoadAnimMesh("body.b3d")
EntityTexture body,skin
PositionEntity body,0,.25,0

taile = FindChild(body,"taile")
kopf = FindChild(body,"kopf")
TranslateEntity kopf,0,0,-0.1
all = FindChild(body,"all")
pivot = CreatePivot()
PositionEntity pivot,EntityX(kopf),EntityY(kopf),EntityZ(kopf)
huefte = FindChild(feet,"fall")

;EntityParent body,feet
EntityParent cam,kopf
EntityParent blooper,kopf
EntityParent feet,body

bullet = CreateCone()
bdir = CopyMesh(bullet,bullet)
PositionEntity bdir,EntityX(bullet)+3,EntityY(bullet)+5,EntityZ(bullet)
PositionEntity bullet,EntityX(blooper)+3,EntityY(blooper)+5,EntityZ(blooper);diff
cube = CreateCube()
;RotateEntity feet,90,0,0
;HideEntity bullet
EntityParent bullet,blooper

; Animation
ExtractAnimSeq(feet,1,14)
SetAnimKey(feet,7)

; Types
Type bullet
Field vx#
Field vy#
Field vz#
Field speedx#
Field speedy#
Field speedz#
Field bullet
End Type

; Settings
MoveMouse GraphicsWidth()/2,GraphicsHeight()/2

SetBuffer BackBuffer() ; Backbuffer
timer = CreateTimer(40); Timer

Repeat

; 3D
If KeyDown(17)
TurnEntity body,0,0+EntityYaw(kopf),0
;RotateEntity feet,0,0,0
;RotateEntity kopf,0,0,0
MoveEntity body,0,0,1
If Not Animating(feet)
Animate feet,1,1,1,0
Else
;Animate feet,0,1,1,0
EndIf
ElseIf KeyDown(31)
TurnEntity body,0,0+EntityYaw(kopf),0
;RotateEntity feet,0,0,0
;RotateEntity kopf,0,0,0
MoveEntity body,0,0,-1
If Not Animating(feet)
Animate feet,1,-1,1,0
Else
;Animate feet,0,-1,1,0
EndIf
ElseIf KeyDown(32)
;RotateEntity kopf,0,0,0
TurnEntity body,0,-90+EntityYaw(kopf),0
;RotateEntity feet,0,-90,0
MoveEntity body,0,0,1
If Not Animating(feet)
Animate feet,1,1,1,0
Else
;Animate feet,0,1,1,0
EndIf
ElseIf KeyDown(30)
TurnEntity body,0,90+EntityYaw(kopf),0
;RotateEntity feet,0,90,0
MoveEntity body,0,0,1
If Not Animating(feet)
Animate feet,1,1,1,0
Else
;Animate feet,0,1,1,0
EndIf
ElseIf MouseDown(1)
TurnEntity body,0,EntityYaw(kopf),0,1
EndIf

my = my + MouseYSpeed()
mx = mx + MouseXSpeed()

EntityParent kopf,0
RotateEntity kopf,my,0,0
RotateEntity kopf,0,-mx,0
EntityParent kopf,body


;PositionEntity kopf,EntityX(body),EntityY(body)+0.25,EntityZ(body)
;TurnEntity

MoveMouse GraphicsWidth()/2,GraphicsHeight()/2

;RotateEntity kopf,0,mausx(cam),0,1


; bullet
If MouseDown(1)
b.bullet = New bullet
b\bullet = CopyMesh(bullet,bullet)
;HideEntity b\bullet
RotateEntity bdir,EntityPitch(bullet),EntityYaw(bullet),EntityZ(bullet)
PositionEntity bdir,EntityX(bullet),EntityY(bullet),EntityZ(bullet)
PositionEntity b\bullet,EntityX(bullet),EntityY(bullet),EntityZ(bullet);-80;-diff

;MoveEntity b\bullet,0,0,1
EntityParent bdir,0
b\vx = EntityX(bdir) - EntityX(b\bullet)
b\vy = EntityY(bdir) - EntityY(b\bullet)
b\vz = EntityZ(bdir) - EntityZ(b\bullet)
;MoveEntity b\bullet,0,0,-1
EntityParent bdir,bullet
b\speedx = b\vx * bspeed
b\speedy = b\vy * bspeed
b\speedz = b\vz * bspeed
EndIf
For b.bullet = Each bullet
;ShowEntity b\bullet
EntityParent b\bullet,0
;MoveEntity b\bullet,0,0,v0;--------------------------- das kann man vielleicht mit translateentity lösen
AlignToVector b\bullet,b\speedx,b\speedy,b\speedz,3
MoveEntity b\bullet,0,0,b\speedz
;TurnEntity b\bullet,0,0,1
;RotateEntity b\bullet,0,0,0,0;----------------------------------------------------- hier soll die rotate- oder turnentity-Lösung hin
If EntityY(b\bullet) < 0
FreeEntity b\bullet
Delete b
EndIf
Next

UpdateWorld
RenderWorld

; 2D
Text 0,0,"Pitch: "+EntityPitch(cam)
Text 0,20,"Yaw: "+EntityYaw(kopf)
Text 0,40,"Roll: "+EntityRoll(cam)

WaitTimer(timer)
Flip

Until KeyHit(1)
End

; Pause

; Functions
Function move(e,b,c)

End Function

Function Mausy(e)

End Function

Function Mausx(e)

End Function


wichtig is hier nur, dass bdir das verschobene entity ist von dem DAK geredet hat, den rest muss man sich denken (blooper ist die waffe, bullet prototyp-geschoss, kopf feet und alles müsste ich euch hochladen)
  • Zuletzt bearbeitet von Mr. P am Do, Feb 09, 2017 15:15, insgesamt 2-mal bearbeitet

BladeRunner

Moderator

BeitragDi, Feb 07, 2017 23:26
Antworten mit Zitat
Benutzer-Profile anzeigen
https://de.wikipedia.org/wiki/Wurfparabel
Das ist 2D, sollte sich aber anpassen lassen Smile
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

DAK

BeitragMi, Feb 08, 2017 11:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du nicht die Bahn in Abhängigkeit von t wissen willst, sondern einfach die einfachste Lösung, dann mach es mit MoveEntity() und TurnEntity().

Jedes Frame lässt du das Geschoss um seine Geschwindigkeit nach vorne fliegen und drehst es mit TurnEntity dem Boden entgegen.

Eine andere Möglichkeit, wenn du physikalisch korrekter unterwegs sein willst ist Folgende:

Du hast am Anfang ein Objekt mit einer Position und einer Richtung. Als Erstes brauchst du den Richtungsvektor dieses Objekts. Den könnte man sich ausrechnen, oder man schummelt und lässt das B3D machen:

BlitzBasic: [AUSKLAPPEN]

posX# = EntityX(entity)
posY# = EntityY(entity)
posZ# = EntityZ(entity)
MoveEntity(entity,0,0,1)
vecX# = EntityX(entity) - posX#
vecY# = EntityY(entity) - posY#
vecZ# = EntityZ(entity) - posZ#
MoveEntity(entity,0,0,-1)


Dieser Vektor hat die Länge 1 und zeigt in Richtung der Bewegung. Wird dieser Vektor mit der Geschwindigkeit des Objekts multipliziert, dann bekommt man den Geschwindigkeitsvektor des Objekts:

BlitzBasic: [AUSKLAPPEN]

speedX# = vecX# * speed#
speedY# = vecY# * speed#
speedZ# = vecZ# * speed#


Jedes Frame wird das Objekt um diesen Vektor verschoben:

BlitzBasic: [AUSKLAPPEN]

TranslateEntity(entity, speedX#, speedY#, speedZ#)


Willst du Gravitation simulieren, musst du die Y-Achse dieses Vektors jedes Frame um die Gravitation verringern:

BlitzBasic: [AUSKLAPPEN]

speedY# = speedY# - gravitation#


Um Luftwiderstand zu simulieren, multiplizierst du alle Koordinaten dieses Vektors mit dem Luftwiderstand (muss eine Zahl 0<x<1 sein):

BlitzBasic: [AUSKLAPPEN]

speedX# = speedX# * luftwiderstand#
speedY# = speedY# * luftwiderstand#
speedZ# = speedZ# * luftwiderstand#


Möchtest du haben, dass das Geschoss in die Flugrichtung schaut, musst du dazu AlignToVector nehmen:

BlitzBasic: [AUSKLAPPEN]

AlignToVector(entity, speedX#, speedY#, speedZ#, 2)
Gewinner der 6. und der 68. BlitzCodeCompo
  • Zuletzt bearbeitet von DAK am Mi, Feb 08, 2017 12:14, insgesamt einmal bearbeitet

Midimaster

BeitragMi, Feb 08, 2017 12:02
Antworten mit Zitat
Benutzer-Profile anzeigen
hier ein Beispiel:
BlitzBasic: [AUSKLAPPEN]
Graphics3D 800,600,0,2
SetBuffer BackBuffer()
Global camera = CreateCamera ()
PositionEntity camera,80,10,40
RotateEntity Camera, 0,90,0
AmbientLight 50,100,150

Plane=CreatePlane()
MoveEntity plane, 0,-10,0
EntityColor Plane, 150,150,0


PlaneTexture=CreateTexture(128,128,9)

Color 255,255,255
Rect 0,0,64,64,1
Rect 64,64,64,64,1
CopyRect 0,0,128,128,0,0,BackBuffer(),TextureBuffer(PlaneTexture)
ScaleTexture PlaneTexture,10,10
EntityTexture Plane,PlaneTexture,0,0






Global Arrow=CreateCylinder(8)
ScaleEntity Arrow,0.1,0.1,10
EntityColor Arrow ,255,255,255

Spitze=CreateCone(8)
EntityParent Spitze,Arrow
RotateEntity Spitze,90,0,0
ScaleEntity Spitze, 10,.10,10
MoveEntity Spitze,0,1,0


Global vectorZ#=0.2
Global vectorY#=0.5
Global vectorX#=0.0

Repeat
Cls
RenderWorld
vectorY=vectorY-0.001
AlignToVector Arrow,vectorX, vectorY, vectorZ,3
MoveEntity Arrow,0,0, vectorZ
If EntityY(Arrow)<-30 Then
NextPfeil
EndIf
Flip 0
Until KeyHit(1)

Function NextPfeil()
PositionEntity Arrow,0,0,0
RotateEntity Arrow,0,0,0
vectorZ=0.2
vectorY=Rnd(0.1, 0.5)
vectorX=Rnd(-0.5, 0.5)
End Function

Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group