Schüsse fliegen falsch

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

mevsmp

Betreff: Schüsse fliegen falsch

BeitragMo, März 06, 2006 16:10
Antworten mit Zitat
Benutzer-Profile anzeigen
HI,

Ich hab ein Problem mit einem Code den ich in meinen eingebaut hab.
Mit hilfe dieses Codes den ich von hier habe sollte ich schiessen können.
Funktioniert eigendlich auch biss auf zwei Fehler:
1. Das Geschoss fliegt in die Falsche Richtung^^. Aber das kann ich doch eigendlich einfach beheben in dem ich die MoveEntity Geschwindigkeit auf - setze. oder?

2. Ich versteh nicht warum aber die Kugeln fliegen fast immer woanders hin als sie sollten. Meistens fliegen sie ungefähr dahin wo sie hinsollen. Aber eben nur ungefähr... Oft fliegen sie ganz falsch^^.
Ich hab den Code so eingestellt dass die Position von meinem Md2 (dragon) genommen wird und von dort dann eigendlich abgefeuert werden sollte.

Guckt euch den Abschnitt bei " If MouseHit(1)" mal bitte an. Ich denke dort steckt irgendwo der Fehler...


Code: [AUSKLAPPEN]

Include "../start.bb"


SeedRnd MilliSecs()


;SetFont(LoadFont("Comic Sans MS",30,1))

Const game_pause = 1
Const game_menue = 2
Const game_haupt = 3
Const game_over  = 4


Global game_zustand = game_menue

Type TMatrix
   Field x%,y#
   Field speed#,length%
   Field steps%
End Type

Const MAX=30      ; Maximale Anzahl der "Code-Ketten" festlegen
Const MINLENGTH=20   ; Minimale Länge der "Code-Ketten" festlegen
Const MAXLENGTH=50   ; Maximale Länge der "Code-Ketten" festlegen
Const MINSPEED=7   ; Minimale Geschwindigkeit der "Code-Ketten" festlegen
Const MAXSPEED=17   ; Maximale Geschwindigkeit der "Code-Ketten" festlegen
Global matrix_count=0

Global fps,fps1,fpstimer

Global DeltaT#,T#




Type bullet
Field obj
Field destroy
Field alpha#
End Type


Const TYPE_WORLD = 1
Const TYPE_SHOT = 2

Const MOUSE_SENS# = 6.0

mx = GraphicsWidth()/2
my = GraphicsHeight()/2

Collisions TYPE_SHOT,TYPE_WORLD,2,1

;cam = CreateCamera()
;PositionEntity cam,0,3,-8

Global bulletsprite = CreateSphere()
EntityColor bulletsprite,255,255,0
EntityType bulletsprite,TYPE_SHOT
ScaleEntity bulletsprite,10.2,10.2,10.2
EntityRadius bulletsprite,0.2
HideEntity bulletsprite

Global cube2 = CreateCube()
EntityColor cube2,255,0,0
PositionEntity cube2,0,0,15
EntityType cube2,TYPE_WORLD




Global cube=CreateCube()
FitMesh cube,-250,-25,-250,500,500,500
FlipMesh cube
Global tex=LoadTexture( "chorme-2.bmp" )
ScaleTexture tex,1.0/3,1.0/3
EntityTexture cube,tex
EntityAlpha cube,.4
EntityFX cube,1
EntityType cube,TYPE_WORLD

;floor mirrior wegen performance ausgestellt
;floor mirror
;m=CreateMirror()

;ight
Global light=CreateLight()
TurnEntity light,45,45,0

;camera
Global camera=CreateCamera()
cam_xr#=30:cam_yr#=0:cam_zr#=0:cam_z#=-100


tex=LoadTexture( "model\ogro\skin.jpg" )
Global dragon=LoadMD2( "model\ogro\tris.md2" )
EntityTexture dragon,tex
TurnEntity dragon,0,180,0

EntityParent camera,dragon ,0




;Wichtig. Hauptschleife. Hier wird das ganze Spiel verwaltet.

Repeat




Select game_zustand
   Case game_menue
      GameMenue()
   Case game_haupt
      GameHaupt()
   Case game_pause
      GamePause()

End Select


Until game_zustand = game_over
End



Function GameMenue()

Local temp_zustand = game_zustand

FlushMouse()
FlushKeys()
ShowPointer

SetFont(LoadFont("Comic Sans MS",30,1))
Repeat
ClsColor 0,0,0
Cls
   Color 0,0,255
   Text GraphicsWidth()/2,100,"Menue",1,1
   
   
   Color 255,255,255
   Text GraphicsWidth()/2,400,"START"
   
   Color 255,255,255
   Text GraphicsWidth()/2,500,"ENDE"

   
   If MouseHit(1)
      If RectsOverlap(MouseX(),MouseY(),1,1,GraphicsWidth()/2,400,StringWidth("START"),StringHeight("START"))
         game_zustand = game_haupt
      ElseIf RectsOverlap(MouseX(),MouseY(),1,1,GraphicsWidth()/2,500,StringWidth("ENDE"),StringHeight("ENDE"))
         game_zustand = game_over
      EndIf
   EndIf
   
   
   If KeyHit(1)
      End
   EndIf
       

;While Not KeyHit(1)=1
;Cls
If T=0 Then T=MilliSecs()
DeltaT=(MilliSecs()-T)/1000
T=MilliSecs()

If MilliSecs()-fpstimer>1000 Then
   fps1=fps
   fps=0
   fpstimer=MilliSecs()
Else
   fps=fps+1
End If

Matrix()

Color 255,0,0
Text 5,5,"FPS: "+fps1
Color 255,255,255
Flip
;Wend




Flip
Until game_zustand<>temp_zustand

End Function


Function GameHaupt()


Local temp_zustand = game_zustand
Local x = GraphicsWidth()/2
Local y = GraphicsHeight()/2
Local h = 0

FlushKeys()
FlushMouse()
 





HidePointer
yg#=0



Repeat
frametime_sec# = (endtime - now) / 1000.0
now = MilliSecs()

Cls


   
   
   
   
      ;Cachen
   mxs#=-MouseXSpeed()
   mys#=MouseYSpeed()
     
   ;Drehen
   If mxs#<>0 Then RotateEntity dragon,EntityPitch(dragon),EntityYaw(dragon)+mxs#,EntityRoll(dragon)
   If mys#<>0 Then
      If mys#>0 Then
         If EntityPitch(camera)+mys#>70
            mys#=70-EntityPitch(camera)
         EndIf
         RotateEntity camera,EntityPitch(camera)+mys#,EntityYaw(camera),EntityRoll(dragon)
      ElseIf mys#<0 Then
         If EntityPitch(camera)+mys#<-10
            mys#=-10-EntityPitch(camera)
         EndIf
         RotateEntity camera,EntityPitch(camera)+mys#,EntityYaw(camera),EntityRoll(dragon)
      EndIf
   EndIf
   
   ;Maus zurücksetzen
   MoveMouse 320,240

   
   
   
   
   
   
   
   
   
   
   
   
   If KeyDown(203)
      TurnEntity dragon,0,8,0
   End If
   
   If KeyDown(205)
      TurnEntity dragon,0,-8,0
   End If
   
   If KeyDown(200)
      MoveEntity dragon,0,0,6.0
      If MD2AnimTime(dragon) = 72 Then jump = 0
      
     If jump = 0 Then 
       moved = 1
      forward = 1
          EndIf
   EndIf

   
   
   If KeyDown(208)
      MoveEntity dragon,0,0,-3.0
      moved = 1
      jump = 0
      forward = 0
   End If




If KeyHit(57)=1 Then
      jump = 1

      If MD2AnimTime(dragon) < 66 Or MD2AnimTime(dragon) > 71 Then
      AnimateMD2 dragon,3,0.1,66,72
   EndIf
 EndIf






 If KeyDown(57) And EntityY(dragon)<0 yg=5
 MoveEntity dragon,0,yg,0

 yg=yg-.30
 If EntityY(dragon)<0 yg=0







 


If moved = True
       If forward = True   
         If MD2AnimTime(dragon) < 40 Or MD2AnimTime(dragon) > 46 Then
            If jump = 0 Then
         AnimateMD2 dragon,1,0.3,40,46
          EndIf
         End If
      End If
   End If

   If forward = False
      If MD2AnimTime(dragon) < 40 Or MD2AnimTime(dragon) > 46 Then
         If jump = 0 Then
         AnimateMD2 dragon,1,-0.08,40,45
         EndIf
      End If
   End If
      
   If moved = False
      If MD2AnimTime(dragon) < 0 Or MD2AnimTime(dragon) > 10 Then
         If jump = 0 Then
         AnimateMD2 dragon,1,0.2,2,35
       EndIf
      End If
    End If      
   
   

    moved = 0
   forward = 0


 

   ;If KeyDown(31)
   ;   cam_xr=cam_xr+2
   ;   If cam_xr>90 cam_xr=90
   ;Else If KeyDown(45)
   ;   cam_xr=cam_xr-2
   ;   If cam_xr<5 cam_xr=5
   ;EndIf




   
   If KeyDown(30)
      cam_z=cam_z+1:If cam_z>-10 cam_z=-10
   Else If KeyDown(44)
      cam_z=cam_z-1:If cam_z<-180 cam_z=-180
   EndIf
   

   PositionEntity camera,0,0,0   

   ;RotateEntity camera,cam_xr,cam_yr,cam_zr
   MoveEntity camera,0,0,cam_z

   
   
   
      If MouseHit(1)
      bullet.bullet = New bullet
      bullet\obj = CopyEntity(bulletsprite)
      ShowEntity bullet\obj
      PositionEntity bullet\obj,EntityX(camera),EntityY(camera),EntityZ(camera)
      RotateEntity bullet\obj,EntityPitch(dragon),EntityYaw(dragon),EntityRoll(dragon)
      MoveEntity bullet\obj,0,0,2.0
      bullet\destroy = now + 5000
      bullet\alpha# = 1.0
   EndIf
   
   For bullet.bullet = Each bullet
      MoveEntity bullet\obj,0,0,25.0 * frametime_sec#
     
      If now >= bullet\destroy - 2000 Then
         bullet\alpha# = bullet\alpha# -0.01   
         EntityAlpha bullet\obj,bullet\alpha#
      ElseIf now >= bullet\destroy Then
         FreeEntity bullet\obj
         Delete bullet
      EndIf
   Next

   

   
   UpdateWorld
   RenderWorld
Text 120,15,"Drücke M um in die FRAME auswahl zu kommen"
Text 120,35,"Zoom in Y/Z ; Zoom out A"
Text 0,0,"MD2AnimTime: "+MD2AnimTime(dragon)

Color 255,255,255
   
   Line mx - 5, my, mx + 5, my
   Line mx, my -5, mx, my + 5






















If KeyHit(1)
game_zustand = game_menue
EndIf

Flip
Until game_zustand<>temp_zustand

End Function






Function GamePause()
dragon=0
light=0


Local temp_zustand = game_zustand

FlushKeys()
FlushMouse()

Repeat
ClsColor 255,0,0
Cls
     
   Color 0,0,255
   Text GraphicsWidth()/2,GraphicsHeight()/2,"ICH BIN DIE PAUSE!!!",1,1
   
   If KeyHit(57)
      game_zustand = game_haupt
   EndIf
   
Flip
Until game_zustand<>temp_zustand

End Function


Function Matrix()
If matrix_count<=MAX Then
   neu.TMatrix=New TMatrix
   neu\y#=0
   neu\x%=Rand(0,64)*10
   neu\speed#=Rand(MINSPEED,MAXSPEED)
   neu\length%=Rand(MINLENGTH,MAXLENGTH)
   neu\steps%=255/neu\length%
   matrix_count=matrix_count+1
End If

For mat.TMatrix=Each TMatrix

   For i = 0 To mat\length%
           
      Select i
         Case 0: Color 255,255,255
         
         Default: Color 0,255-(i*mat\steps%),0
      End Select
     
      y = mat\y#-(i*10)
     
      If y>=0 And y<480 Then Text mat\x%,y,Chr$(Rand(30,200))
     
      mat\y#=mat\y#+(mat\speed# * DeltaT#)
   Next
   
   If (mat\y#-(mat\length% * 10))>480 Then
      Delete mat
      matrix_count=matrix_count-1
   End If

Next

End Function

Goodjee

BeitragMo, März 06, 2006 16:13
Antworten mit Zitat
Benutzer-Profile anzeigen
ich habe auch ein problem, der code ist zu lang
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/

Xaron

BeitragMo, März 06, 2006 16:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn Du die Schüsse alle einzeln sichtbar machen möchtest (bei langsamen Geschossen), dann hilft Dir vielleicht das hier aus einem anderen Beitrag von mir:

Wenn Du schießen möchtest, musst Du Dir zu allererst mal die Anfangsrichtung Deines Schusses merken, in die der Schuss fliegen soll. Dazu transformierst Du einen nach vorn in Z-Richtung zeigenden Vektor (0,0,1) in das lokale Spieler-Koordinatensystem. Damit hast Du die nötigen x, y, und z-Anzeile für die Richtung:

Code: [AUSKLAPPEN]

TFormNormal( 0, 0, 1, playerEntity, 0 )
directionPitch# = TFormedX()
directionYaw# = TFormedY()
directionRoll# = TFormedZ()


Jetzt positionierst Du den Schuss in etwa dort, wo Dein Spieler steht.

In Deiner Update-Funktion musst Du den Schuss dann nur noch in die Richtung bewegen, die Du Dir am Anfang gemerkt hast, also:

Code: [AUSKLAPPEN]

;Geschwindigkeit berechnen
vel# = deltaTime# * bulletSpeed#
;neue Position ermitteln
xVel# = vel# * directionPitch#
yVel# = vel# * directionYaw#
zVel# = vel# * directionRoll#
;Schussposition setzen
TranslateEntity( bulletEntity, xVel, yVel, zVel )


Ich hoffe, ich konnte helfen. Wink

Gruß - Xaron
Cerberus X - Monkey X Reloaded!

Black Spider

BeitragMo, März 06, 2006 18:07
Antworten mit Zitat
Benutzer-Profile anzeigen
falls das ein ego-shooter wie CounterStrike werden soll würd ich mit CameraPick arbeiten.
Denn bei ego-shootern sieht man die schüsse nicht, ausser du willst ne Bullet time funktion einbauen...
naja, hier mal ein ansatz:

Code: [AUSKLAPPEN]

;zuerst musst du die Landschaft auf pickbar stellen
EntityPickMode terrain,3
;3 Steht für Polygon, was bei landschaften ja nun mal so sein sollte ^^

;dann brauchst du einen Funken
Global spark=LoadSprite("Funke.bmp")
EntityColor spark,200,0,0
ScaleSprite spark,1,1
EntityOrder spark,-1
HideEntity spark

;--- Irgendwo in der Hauptschleife ---

If waffe$ = "Gewehr" And MouseHit(1) Then       
picked=CameraPick(camm,GraphicsWidth()/2,GraphicsHeight()/2)
   gew.schuss=New schuss
   gew\obj=CopyEntity(spark)
   gew\dauer=1
   PositionEntity gew\obj,PickedX(),PickedY(),PickedZ()   
End If

For gew.schuss = Each Schuss
gew\dauer = gew\dauer -.1
EntityAlpha gew\obj,gew\dauer
If gew\dauer <= 0 Then FreeEntity gew\obj:Delete First schus
Next

...
Coming soon:
http://img132.imageshack.us/im...im2ab6.gif
 

mevsmp

BeitragMo, März 06, 2006 19:20
Antworten mit Zitat
Benutzer-Profile anzeigen
HI, schnmal danke für eure Hilfe, werds bei Zeiten mal testen.
Aber müsste mein Code (der Code vom Tut) nicht auch gehen? In dem Beispiel hat das ja alles super geklappt, biss ich das in meinen Code eingebaut hab. Vielleicht findet ja noch einer den Fehler... Hoffentlich

mfg mevsmp

Xaron

BeitragDi, März 07, 2006 9:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Also das hier ist ja der wesentliche Code bei Dir:
Code: [AUSKLAPPEN]

If MouseHit(1)
  bullet.bullet = New bullet
  bullet\obj = CopyEntity(bulletsprite)
  ShowEntity bullet\obj
  PositionEntity bullet\obj,EntityX(camera),EntityY(camera),EntityZ(camera)
  RotateEntity bullet\obj,EntityPitch(dragon),EntityYaw(dragon),EntityRoll(dragon)
  MoveEntity bullet\obj,0,0,2.0
  bullet\destroy = now + 5000
  bullet\alpha# = 1.0
EndIf


Was ich daran nicht verstehe: Warum gibst Du dem Schuss die gleiche Drehrichtung wie der "dragon"? Das heisst ja, Du schiesst immer in die Richtung, in die der dragon schaut und nicht dorthin, wo er steht. Wink

Gruß - Xaron
Cerberus X - Monkey X Reloaded!
 

mevsmp

BeitragDi, März 07, 2006 15:14
Antworten mit Zitat
Benutzer-Profile anzeigen
nene,
das hast du falsch verstanden. Das ist ein ThirdPerson game. Der drache läuft also vor der camera. Also der Drache ist meine Spielfigur!
Und wohin der guckt, dahin soll auch geschossen werden. Nur leider fliegen die schüsse meistens falsch Sad


please help.

Black Spider

BeitragDi, März 07, 2006 17:55
Antworten mit Zitat
Benutzer-Profile anzeigen
ahh! So willste das also...
Sach das doch:
Code: [AUSKLAPPEN]

Function schiessen()
b.bullet = New bullet

;das ganze zeug zum laden usw.

EntityParent b\obj,dragon
End Function

Function Update(b.bullet)

EntityParent b\obj,0
MoveEntity b\obj,0,0,b\speed

; der ganze rest...


End Function
Coming soon:
http://img132.imageshack.us/im...im2ab6.gif
 

mevsmp

BeitragDi, März 07, 2006 20:30
Antworten mit Zitat
Benutzer-Profile anzeigen
hey THX für deine hilfe. Aber wie bau ich diesen code nun bei mir Vollständig ein? Wär nett wenn mir das mal jemand vollständig machen könnte. also dass ich den code dann komplett in meinen einbauen kann...
Muss ich jetzt meinen "schiess code" mit deinem zusammen binden, oder wie?
(nein ihr sollt nicht mein ganzes spiel coden, bin noch anfänger, deswegen wär das ein super Bsp...)


please help.

mfg mevsmp
 

ke^kx

BeitragDi, März 07, 2006 21:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Guck dir doch einfach an, was Black Spider an deinem Code veränder hat und versuch es ersteinmal zu verstehen. Und dann baust du es in deinen Code ein. Dann weißt du schon, wohin es gehört Wink

Jiriki
http://i3u8.blogspot.com
Asus Striker II
Intel Core2Quad Q9300 @ 2,5 GHz (aber nur zwei Kerne aktiv aufgrund der Instabilität -.-)
Geforce 9800 GTX
2GB RAM
 

mevsmp

BeitragDi, März 07, 2006 21:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab schon zig versionen ausprobiert.. Nichts hat geklappt. Wo soll ich den denn einbauen, WIE??

;hier das ganze Zeug zum laden usw.

Was zB soll ich darunter verstehen????????

Könnt ihr mir nichtmal genauer helfen und nicht immer Rätselaufgaben stellen?

und @ den code verstehen: das würde vielleicht dann passieren wenn der auch funktionieren würde und man es nachvollziehen könnte.


mfg mevsmp

Klip

BeitragDi, März 07, 2006 21:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
;Hier das ganze Zeug laden:

b\x = x_startpos
b\y = y_startpos
b\z = z_startpos
b\speed = startspeed

; usw., usf...
 

mevsmp

BeitragDi, März 07, 2006 21:50
Antworten mit Zitat
Benutzer-Profile anzeigen
OHMAN, ist zwar nett das ihr mir hilft. Aber noch ein Puzzel-Teil hilft mir nicht weiter!!!

Wenn ihr das alle könnt, wieso dann nicht einmal komplett posten? würde bestimmt noch anderen helfen... Deswegen auch ein Forum..^^

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group