Schussrichtung durch Fadenkreuz

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

Gertri

Betreff: Schussrichtung durch Fadenkreuz

BeitragSo, Nov 08, 2009 13:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo zusammen!

Ich habe folgendes Problem: Ich möchte das Beispiel-Spiel (was bei Blitz3d dabei ist) mit dem Mario, der durch die Burg läuft ein wenig aufgepeppen. Ich habe erstmal eine vernünftige AWSD-Steuerung eingebaut, eine Taste mit der man schneller laufen kann und ein Fadenkreuz ergänzt usw...
Das klappt soweit auch wunderbar.
Zur Info: Das Fadenkreuz und die Kamera beeinflussen sich nicht. Also das Fadenkreuz ist unabhängig von der Kamera und ist nicht immer in der Mitte wie bei Ego-Shootern.

Jetzt folgendes Problem: Wie ihr auf dem Screenshot sehen könnt, ist das Fadenkreuz oben links.
user posted image
Jetzt möchte ich, dass wenn ich schieße, dass die Feuerkugeln auch nach dort oben hin schießen. (Normalerweise fliegen diese einfach geradeaus.)
Nur habe ich keine Idee mehr wie ich das realisieren kann.
Ich wurschtel mich schon seit einer Woche durch das Forum und anderen Hilfeseiten. Hab auch viel ausprobiert z.B. CameraPick usw.
Aber irgendwie will er nicht so wie ich es will Sad

Wäre nett wenn mir jemand helfen könnte Smile

Schöne Grüße
Gertri

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, Nov 08, 2009 13:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Mit Camerapick solltest du weiter kommen.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

Gertri

BeitragSo, Nov 08, 2009 13:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi Hectic!

Danke erstmal für die schnelle Antwort.
Genau das habe ich ja schon ausprobiert, aber soweit ich weiß gibt CameraPick doch sozusagen die Camera-Richtung aus und nicht die Fadenkreuz(Mouse) Richtung, oder?

Schöne Grüße
Gertri

Holzchopf

Meisterpacker

BeitragSo, Nov 08, 2009 13:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie wird denn das Fadenkreuz positioniert? Per Maus, absolut auf dem Bildschirm, oder irgendwie sonst, relativ zur Figur?
Wenn ersteres, könntest du mit CameraPick & PickedX und co ja schauen, wo's hinzielt und dann einfach anhand der Koordinatendifferenzen die Schussrichtung bestimmen.
Wenn das Fadenkreuz relativ zur Figur positioniert wird, könntest du ja daraus ja schon mal Steigung und Winkel berechnen. Zum Winkel müsstest du natürlich noch die Drehung der Figur addieren.

mfG
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, Nov 08, 2009 13:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Es wird die Bildschirmposition in Abhängigkeit der Kameraposition sowie dessen Rotation berücksichtigt. Das hätte man aber auch schnell selbst mit folgendem Zusazucode RotateEntity camera,0,Sin(MilliSecs()/10.0)*30,0 in der Hauptschleife herausfinden können.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

Gertri

BeitragSo, Nov 08, 2009 14:07
Antworten mit Zitat
Benutzer-Profile anzeigen
@Holzchopf
Das Fadenkreuz wird per MouseY() und MouseY() auf dem Bildschirm ausgegeben.

Im Moment wird die Kugel noch per
BlitzBasic: [AUSKLAPPEN]
MoveEntity b\sprite,0,0,2.4

ausgegeben.
Jetzt müsste ich doch irgendwie mit CameraPick die 2d Koordinaten der Maus auf die 3d Koordinaten übertragen.
Mit z.B.

BlitzBasic: [AUSKLAPPEN]
b\sprite = CameraPick(camera,MouseX,MouseY)


Das funktioniert aber nicht, weil das Sprite ja nicht richtig bewegt wird.
Dann habe ich gedacht:
BlitzBasic: [AUSKLAPPEN]
MoveEntity b\sprite,MouseX(),MouseY(),2.4

Funktioniert so aber auch nicht.

Jetzt müsste man das irgendwie kombinieren, da ist nur die Frage wie Confused

Holzchopf

Meisterpacker

BeitragSo, Nov 08, 2009 14:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich denke, das geht ganz einfach, wenn du
1. mit PickedX und co die 3D-Koordinaten von dem Punkt ermittelst, wo die Maus "hinzielt"
2. du diese Koordinaten relativ zu den Spielerkoordinaten umrechnest
3. Den Schuss auf die Spielerkoordinaten positionierst
4. Den Schuss mit AlignToVector und den oben errechneten relativen Koordinaten ausrichtest
5. Den Schuss dann einfach nur noch mit MoveEntity entlang der Achse, die du bei AlignToVector ausgerichtet hast, mit der Schussgeschwindigkeit bewegst.

mfG
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

Silver_Knee

BeitragSo, Nov 08, 2009 14:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich glaub einfacher (aber nicht so elegant) ist es einen Pivot (CreatePivot) zu erstellen, den immer an PickedX,Y,Z zu stellen und dann auf den Schuss PointEntity (b\sprite,pivot) zu machen. Dann zielen die Sprites immer auf den Pivot der ja da steht wodu hinziehlst

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, Nov 08, 2009 15:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Irgendwie ist auch das Spielkonzept nicht ganz zu Ende gedacht. Was machst du, wenn sich ein Gegner zwischen der Kamera und der Spielfigur befindet? Das Fadenkreuz wird dann auf dem Bildschirm gemalt und der Spieler erwartet nun so den Gegner treffen zu können. Aber dann müsste die Spielfigur durch sich selbst schiessen, oder sich zumindest umdrehen. Aber umdrehen geht nicht, weil man ja auch zwischen den Achseln des Gegners schiessen könnte und die Zielkoordinate dann wieder 180° zur Spielfigur sich befindet. Gibt also schon einen Grund, warum es solche Spiel in der Form nicht gibt.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

ToeB

BeitragSo, Nov 08, 2009 15:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich mach das meinstens so ds ich zwei pivots habe. Einer ist am Spieler mit EntityParent geheftet (da wo der Schuss erstellt wird) und der andere wird an die PickedX/Y/Z Position gestellt. Jetzt drehe ich den Player mit TurnEntity Player,0,MouseXSpeed()/4,0 (Y_Achse) und den Pivot auf der XAchse : TurnEntity Pivot,-MouseYSpeed()/4,0,0. Dann noch Movemouse auf die mitte des Bildschirmes. dann nehme ich EntityPick(Pivot,1000) um zu pürfen zu welchem Object das Zielgerät zeigen soll. Dann positioniere ich den Pivot dorthin. Wenn icheinen Schuss erstelle, dann erstelle ich ihn und drehe ihn mit PointEntity zum PickedPivot (der an der wand). Wenn du jetzt das Zielgerät zeichnen möchtest, findest du einfach mit CameraProject die X/Y Koordinaten raus und malst da dein Zielgerät hin..


mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!
 

Gertri

BeitragSo, Nov 08, 2009 19:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo!

@All
Danke erstmal für die ganze Hilfe! Ich werde jetzt mal ein bischen was ausprobieren. Ich melde mich wenn ich etwas zustande gebracht habe. Very Happy

@hectic
Da ich keine Gegner in dem Spiel haben werde, stellt das so kein Problem da. Ich habe das Spiel erstmal nur aus Spaß erweitert. Wenn ich mal ein Spiel komplett selbst erstelle, werde ich mir das merken! Danke Wink

Schöne Grüße
Gertri


EDIT: So ich habe jetzt mal was ausprobiert, so ganz klappts aber immer noch nicht.
Ich hab mich jetzt für ein Pivot entschieden der die Koordinaten von PickedX(),PickedY().... bezieht.
Mein bisheriger Code:
BlitzBasic: [AUSKLAPPEN]
Global pivot=CreatePivot()

;Haupt-Schleife
While Not KeyHit(1)

picked = CameraPick(c\camera,MouseX(),MouseY())
PositionEntity pivot, PickedX(), PickedY(), PickedZ()


RenderWorld
DrawImage kreuz, MouseX() , MouseY()
Flip
Wend
End


If MouseHit (1)

;bewegen
MoveEntity b\sprite,0,0,2.4
;ausrichten
PointEntity (b\sprite,pivot)

EndIf

So seh ich da jetzt keinen Fehler drin, trotzdem zeigt der Debugger mir ein Fehler in der Zeile picked= CameraPick() an.

Zitat:
Object does not exist


Warum?

Hier nochmal der komplette Code wer sich da durchwurschteln will Very Happy
BlitzBasic: [AUSKLAPPEN]
Graphics3D 800,600,32,1
;The castle demo!
AppTitle "Markio"
Const FPS=26
Const n_trees=40


Global pivot=CreatePivot()

Global shoot=Load3DSound( "sounds\shoot.wav" )
Global boom=Load3DSound( "sounds\boom.wav" )
SoundVolume boom,.5

Type Player
Field entity,model
Field anim_speed#,player_y#,roll#
End Type

Type ChaseCam
Field entity,camera,target,heading,sky
End Type

Type Spark
Field alpha#,sprite
End Type

Type Bullet
Field rot#,sprite,time_out
End Type

Type Hole
Field alpha#,sprite
End Type

Const TYPE_PLAYER=1,TYPE_BULLET=2,TYPE_TARGET=3,TYPE_SCENERY=10,TYPE_TERRAIN=11

Collisions TYPE_PLAYER,TYPE_TERRAIN,2,3
Collisions TYPE_PLAYER,TYPE_SCENERY,2,2
Collisions TYPE_BULLET,TYPE_TERRAIN,2,1
Collisions TYPE_BULLET,TYPE_SCENERY,2,1
Collisions TYPE_TARGET,TYPE_TERRAIN,2,2
Collisions TYPE_TARGET,TYPE_SCENERY,2,2

Global light,castle,land,ground,water,sky,faster=1
Global spark_sprite,bull_sprite,player_model,hole_sprite,tree_sprite
Global water_level=-98,bull_x#=1.5

Setup()

ChangeDir "environ"
LoadEnviron( "terrain-1.jpg","water-2_mip.bmp","sky","heightmap_256.bmp" )
ChangeDir "..\"

player1.Player=CreatePlayer( 0,80,0 )
camera1.ChaseCam=CreateChaseCam( player1\entity )

period=1000/FPS
time=MilliSecs()-period

listener=CreateListener( player1\entity,.1,1,.2 )

kreuz = LoadImage("faden_kreuz.bmp")

MaskImage kreuz,255,255,255



While Not KeyHit(1)


If KeyHit(60)
wire=Not wire
WireFrame wire
EndIf

Repeat
elapsed=MilliSecs()-time
Until elapsed

;how many 'frames' have elapsed
ticks=elapsed/period

;fractional remainder
tween#=Float(elapsed Mod period)/Float(period)

For k=1 To ticks
time=time+period
If k=ticks Then CaptureWorld

UpdateGame()

UpdateWorld

PositionEntity water,Sin(time*.01)*10,water_level+Sin(time*.05)*.5,Cos(time*.02)*10
For c.ChaseCam=Each ChaseCam
UpdateChaseCam( c )

PositionEntity sky,EntityX(c\camera),EntityY(c\camera),EntityZ(c\camera)

Next

Next


picked = CameraPick(c\camera,MouseX(),MouseY())

PositionEntity pivot, PickedX(), PickedY(), PickedZ()


RenderWorld tween
DrawImage kreuz, MouseX() , MouseY()
Flip
Wend
End

Function UpdateGame()
For h.Hole=Each Hole
UpdateHole( h )
Next
For b.Bullet=Each Bullet
UpdateBullet( b )
Next
For s.Spark=Each Spark
UpdateSpark( s )
Next
For p.Player=Each Player
UpdatePlayer( p )
Next

End Function

Function UpdateHole( h.Hole )
h\alpha=h\alpha-.001
If h\alpha>0
EntityAlpha h\sprite,h\alpha
Else
FreeEntity h\sprite
Delete h
EndIf
End Function

Function CreatePlayer.Player( x#,y#,z# )
p.Player=New Player
p\entity=CreatePivot()
p\model=CopyEntity( player_model,p\entity )
p\player_y=y
PositionEntity p\entity,x,y,z
EntityType p\entity,TYPE_PLAYER
EntityRadius p\entity,1.6

ResetEntity p\entity
Return p
End Function

Function CreateBullet.Bullet( p.Player )
bull_x=-bull_x
b.Bullet=New Bullet
b\time_out=150
b\sprite=CopyEntity( bull_sprite,p\entity )
TranslateEntity b\sprite,bull_x,1,.25
EntityParent b\sprite,0
EntityPickMode b\sprite,2
EmitSound shoot,b\sprite
Return b

End Function

Function UpdateBullet( b.Bullet )
If CountCollisions( b\sprite )
If EntityCollided( b\sprite,TYPE_TERRAIN )
EmitSound boom,b\sprite
ex#=EntityX(b\sprite)
ey#=EntityY(b\sprite)
ez#=EntityZ(b\sprite)
TFormPoint( ex,ey,ez,0,land )
hi#=TerrainHeight( land,TFormedX(),TFormedZ() )
If hi>0
hi=hi-.02:If hi<0 Then hi=0
ModifyTerrain land,TFormedX(),TFormedZ(),hi,True
EndIf
CreateSpark( b )
FreeEntity b\sprite
Delete b
Return
EndIf
If EntityCollided( b\sprite,TYPE_SCENERY )
For k=1 To CountCollisions( b\sprite )
If GetEntityType( CollisionEntity( b\sprite,k ) )=TYPE_SCENERY
cx#=CollisionX( b\sprite,k )
cy#=CollisionY( b\sprite,k )
cz#=CollisionZ( b\sprite,k )
nx#=CollisionNX( b\sprite,k )
ny#=CollisionNY( b\sprite,k )
nz#=CollisionNZ( b\sprite,k )
th.Hole=New Hole
th\alpha=1
th\sprite=CopyEntity( hole_sprite )
PositionEntity th\sprite,cx,cy,cz
AlignToVector th\sprite,-nx,-ny,-nz,3
MoveEntity th\sprite,0,0,-.1






Exit
EndIf
Next
EmitSound boom,b\sprite
CreateSpark( b )
FreeEntity b\sprite
Delete b
Return
EndIf
EndIf
b\time_out=b\time_out-90
If b\time_out=0
FreeEntity b\sprite
Delete b
Return
EndIf
b\rot=b\rot+40

RotateSprite b\sprite,b\rot

MoveEntity b\sprite,0,0,2.4
PointEntity (b\sprite,pivot)


End Function

Function CreateSpark.Spark( b.Bullet )
s.Spark=New Spark
s\alpha=-90
s\sprite=CopyEntity( spark_sprite,b\sprite )
EntityParent s\sprite,0
Return s
End Function

Function UpdateSpark( s.Spark )
If s\alpha<270
sz#=Sin(s\alpha)*5+5
ScaleSprite s\sprite,sz,sz
RotateSprite s\sprite,Rnd(360)
s\alpha=s\alpha+15
Else
FreeEntity s\sprite
Delete s
EndIf
End Function

Function UpdatePlayer( p.Player )



If MouseHit (1)

CreateBullet( p ) ;fire?

EndIf




If KeyDown(30) ;left/right
TurnEntity p\entity,0,6,0 ;turn player left/right
Else If KeyDown(32)
TurnEntity p\entity,0,-6,0
EndIf
If KeyDown(17) ;forward
If p\anim_speed<=0
p\anim_speed=1.3
Animate p\model,1,p\anim_speed
EndIf
MoveEntity p\entity,0,0,faster
Else If KeyDown(31) ;back
If p\anim_speed>=0
p\anim_speed=-1.3
Animate p\model,1,p\anim_speed
EndIf
MoveEntity p\entity,0,0,-faster
Else If p\anim_speed ;stop animating
p\anim_speed=0
Animate p\model,0
EndIf


If KeyDown(46) Then ;faster +

faster=1.5


EndIf

If KeyDown(47) Then ;faster -

faster=1
EndIf



ty#=EntityY(p\entity)
y_vel#=(ty-p\player_y)
p\player_y=ty

If KeyHit(57) ;jump?
y_vel=3.5 ;2.4
Else
y_vel=y_vel-.5 ;2
EndIf
TranslateEntity p\entity,0,y_vel,0
End Function

Function CreateChaseCam.ChaseCam( entity )
c.ChaseCam=New ChaseCam
c\entity=entity
c\camera=CreateCamera()

c\target=CreatePivot( entity )
PositionEntity c\target,0,3,-10
EntityType c\target,TYPE_TARGET

c\heading=CreatePivot( entity )
PositionEntity c\heading,0,0,20
c\sky=CopyEntity( sky )
Return
End Function

Function UpdateChaseCam( c.ChaseCam )
If KeyDown(200)
TranslateEntity c\heading,0,-3,0
Else If KeyDown(208)
TranslateEntity c\heading,0,+3,0
EndIf

dx#=EntityX(c\target,True)-EntityX(c\camera,True)
dy#=EntityY(c\target,True)-EntityY(c\camera,True)
dz#=EntityZ(c\target,True)-EntityZ(c\camera,True)

TranslateEntity c\camera,dx*.1,dy*.1,dz*.1

PointEntity c\camera,c\heading

PositionEntity c\target,0,0,0
ResetEntity c\target
PositionEntity c\target,0,3,-10

PositionEntity c\sky,EntityX(c\camera),EntityY(c\camera),EntityZ(c\camera)
End Function

Function LoadEnviron( land_tex$,water_tex$,sky_tex$,height_map$ )
light=CreateLight()
TurnEntity light,45,45,0

land_tex=LoadTexture( land_tex$,1 )
ScaleTexture land_tex,10,10

land=LoadTerrain( height_map$ )
EntityTexture land,land_tex

TerrainShading land,True
PositionEntity land,-1000,-100,-1000
ScaleEntity land,2000.0/256,100,2000.0/256
EntityType land,TYPE_TERRAIN
TerrainDetail land,750,True

For k=1 To n_trees
Repeat
tx#=Rnd(-70,70)-150
tz#=Rnd(-70,70)+400
ty#=TerrainY( land,tx,0,tz )
Until ty>water_level
t=CopyEntity( tree_sprite )
PositionEntity t,tx,ty,tz
ScaleSprite t,Rand(2,3),Rand(4,6)
Next

ground=CreatePlane()
EntityTexture ground,land_tex
PositionEntity ground,0,-100,0
EntityOrder ground,9


water_tex=LoadTexture( water_tex$,3 )
ScaleTexture water_tex,20,20

water=CreatePlane()
EntityTexture water,water_tex
PositionEntity water,0,water_level,0


sky=LoadSkyBox( sky_tex$ )
EntityOrder sky,10
HideEntity sky

End Function

Function LoadSkyBox( file$ )
m=CreateMesh()
;front face
b=LoadBrush( file$+"_FR.jpg",49 )
s=CreateSurface( m,b )
AddVertex s,-1,+1,-1,0,0:AddVertex s,+1,+1,-1,1,0
AddVertex s,+1,-1,-1,1,1:AddVertex s,-1,-1,-1,0,1
AddTriangle s,0,1,2:AddTriangle s,0,2,3:
FreeBrush b
;right face
b=LoadBrush( file$+"_LF.jpg",49 )
s=CreateSurface( m,b )
AddVertex s,+1,+1,-1,0,0:AddVertex s,+1,+1,+1,1,0
AddVertex s,+1,-1,+1,1,1:AddVertex s,+1,-1,-1,0,1
AddTriangle s,0,1,2:AddTriangle s,0,2,3
FreeBrush b
;back face
b=LoadBrush( file$+"_BK.jpg",49 )
s=CreateSurface( m,b )
AddVertex s,+1,+1,+1,0,0:AddVertex s,-1,+1,+1,1,0
AddVertex s,-1,-1,+1,1,1:AddVertex s,+1,-1,+1,0,1
AddTriangle s,0,1,2:AddTriangle s,0,2,3
FreeBrush b
;left face
b=LoadBrush( file$+"_RT.jpg",49 )
s=CreateSurface( m,b )
AddVertex s,-1,+1,+1,0,0:AddVertex s,-1,+1,-1,1,0
AddVertex s,-1,-1,-1,1,1:AddVertex s,-1,-1,+1,0,1
AddTriangle s,0,1,2:AddTriangle s,0,2,3
FreeBrush b
;top face
b=LoadBrush( file$+"_UP.jpg",49 )
s=CreateSurface( m,b )
AddVertex s,-1,+1,+1,0,1:AddVertex s,+1,+1,+1,0,0
AddVertex s,+1,+1,-1,1,0:AddVertex s,-1,+1,-1,1,1
AddTriangle s,0,1,2:AddTriangle s,0,2,3
FreeBrush b
;bottom face
b=LoadBrush( file$+"_DN.jpg",49 )
s=CreateSurface( m,b )
AddVertex s,-1,-1,-1,1,0:AddVertex s,+1,-1,-1,1,1
AddVertex s,+1,-1,+1,0,1:AddVertex s,-1,-1,+1,0,0
AddTriangle s,0,1,2:AddTriangle s,0,2,3
FreeBrush b
ScaleMesh m,100,100,100
FlipMesh m
EntityFX m,1
Return m
End Function

Function Setup()



laterne=LoadMesh("lampe.B3D")
ScaleEntity laterne,.12,.12,.12
EntityType laterne,TYPE_SCENERY
PositionEntity laterne,0,0,60
TurnEntity laterne,0,180,0

laternetex=LoadTexture("Textur.jpg")
EntityTexture laterne,laternetex



castle=LoadMesh( "castle\castle1.x" )
ScaleEntity castle,.13,.13,.13
EntityType castle,TYPE_SCENERY


player_model=LoadAnimMesh( "markio\mariorun.x" )
ScaleEntity player_model,.2,.2,.2
TranslateEntity player_model,0,-1.25,0
HideEntity player_model


spark_sprite=LoadSprite( "sprites\bigspark.bmp" )
HideEntity spark_sprite

bull_sprite=LoadSprite( "sprites\bluspark.bmp" )
ScaleSprite bull_sprite,3,3
EntityRadius bull_sprite,1.5
EntityType bull_sprite,TYPE_BULLET
HideEntity bull_sprite


hole_sprite=LoadSprite( "sprites\bullet_hole.bmp",1 )
EntityBlend hole_sprite,2
SpriteViewMode hole_sprite,2
HideEntity hole_sprite

tree_sprite=LoadSprite( "sprites\tree.bmp",7 )
HandleSprite tree_sprite,0,-1
ScaleSprite tree_sprite,2,4
PositionEntity tree_sprite,0,0,-100
SpriteViewMode tree_sprite,3
EntityAutoFade tree_sprite,120,150
End Function

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group