Springen auf Terrain

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite 1, 2, 3  Weiter

Neue Antwort erstellen

 

Stani

Betreff: Springen auf Terrain

BeitragMo, Apr 05, 2010 17:20
Antworten mit Zitat
Benutzer-Profile anzeigen
~AUFSPALTUNG~

Der Rest war Spam. Hier das Wesentliche:
mfG
Holzchopf


Und zwar hab ich ein Terrain gemacht.Man kann da auf dem Boden rummgehen und hat ein Ziel in der Mitte.
Jetzt will ich auch gerne mal springen können.Doch irgendwie scheint das nicht zu gehen.
Hier mein Code

Code: [AUSKLAPPEN]
Graphics3D  1024, 768, 32, 1
SetBuffer BackBuffer()






;Camera
camera = CreateCamera()
PositionEntity camera, 100, 1, 100
;light
light = CreateLight()
RotateEntity light, 90, 0, 0
;terrain
terrain = LoadTerrain("heightmap.bmp")
TerrainDetail terrain, 4000,True
ScaleEntity terrain, 1, 50, 1

;terrain textur
textur1 = LoadTexture ("textur1.bmp",2)
EntityTexture terrain,textur1, 0, 1

;objekts

Global ziel=LoadImage("ziel.bmp")
MaskImage ziel,0,0,0
MidHandle ziel

;objekts







;main




While Not KeyHit(1)
   If KeyDown(32) = 1 Then
   TurnEntity camera, 0, -1, 0
   End If
   If KeyDown(30) = 1 Then
   TurnEntity camera, 0, 1, 0
   EndIf
   If KeyDown(31) = 1 Then
   MoveEntity camera, 0, 0, -0.1
   EndIf
   If KeyDown(17) = 1 Then
   MoveEntity camera, 0, 0, 0.1
   EndIf
   If KeyDown(57) = 1 Then
   Sprung()
   End If

   
   


   x# = EntityX(camera)
   y# = EntityY(camera)
   z# = EntityZ(camera)
   ty# = TerrainY(terrain, x#, y#, z#) + 3
   PositionEntity camera, x#, ty#, z#
   RotateEntity camera,EntityPitch(camera)+MouseYSpeed(),EntityYaw(camera)-MouseXSpeed(),0
   RenderWorld
   UpdateWorld
   DrawImage ziel,512,384
   Flip
Wend
End

Function Sprung()
For a = 1 To 10
ty# = ty# +1
Next

For b = 1 To 10
ty# = ty# -1
Next

End Function






Das mit der For schleife ist jetzt nur grob gemacht.Dazwischen will ich noch pausen machen aber ich weiß nicht wie das geht.Ich kenn nur Delay und die Hilfe zeigt auch nichts.

Midimaster

BeitragMo, Apr 05, 2010 17:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Du kannst nicht alle 10 Stufungen eines Sprungs in einer For/Next-Schleife abarbeiten, weil der Vorgang so innerhalb einer 1000tel Sekunde stattfindet.

Vielmehr mußt Du dafür sorgen, dass während der nächsten Spielsekunden immer nur ein Stückchen weitergesprungen wurd, Dazwischen soll ein FLIP den aktuell erreichten Zustand anzeigen.


Das Ganze erreichst Du mit Timern:

BlitzBasic: [AUSKLAPPEN]
Graphics 800,600
Global X%, Y%, SprungZeit%
X=100
Y=200
Repeat
Cls
Sprung()
Rect X,Y,10,10
Flip
Until KeyHit(1)

Function Sprung()
If SprungZeit<MilliSecs() Then
SprungZeit=MilliSecs()+100
Y=Y-1
EndIf
End Function


Durch die Variable SprungZeit% erreichst Du, dass die Sprung-Funktion nur alle 100msec ausgeführt wird.

Soll es irgendwann wieder zurückgehen, könte das so aussehen:

BlitzBasic: [AUSKLAPPEN]

Global X%, Y%, SprungZeit%, SprungPhase%, SprungStartZeit%
...
Function Sprung()
If SprungZeit<MilliSecs() Then
SprungZeit=MilliSecs()+100
If SprungPhase=0 Then
SprungStartZeit=MilliSecs()+2000
SprungPhase=1
ElseIf SprungPhase=1 Then
Y=Y-1
If SprungStartZeit>MilliSecs() Then
SprungPhase=2
EndIf
Else
Y=Y+1
EndIf
EndIf
End Function


Du kannst also soviele Timer wie du Lust hast erstellen. Hier "kennt" die Variable SprungStartZeit% den Zeitpunkt, an dem der Sorung bereits 2 sec andauert. Ist der erreicht, beginnt die Sinkphase.
 

Stani

BeitragMo, Apr 05, 2010 18:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok ich hab mal was eigenes geschrieben aber es funktioniert nicht:

Graphics 800,600
Global X%, Y%
Global timer1=CreateTimer(10)

X=100
Y=200
Repeat
Cls
If KeyDown(200)=1 Then
Sprung()
End If
Rect X,Y,10,10
Flip
Until KeyHit(1)

End


Function Sprung()

timer1 = 0

If timer1 = 10 Then
Y=Y+1
End If
If timer1= 20 Then
Y=Y+1
End If
If timer1= 30 Then
Y=Y+1
End If
If timer1= 40 Then
Y=Y+1
End If
If timer1= 50 Then
Y=Y-1
End If
If timer1= 60 Then
Y=Y-1
End If
If timer1= 70 Then
Y=Y-1
End If

End Function

BladeRunner

Moderator

BeitragMo, Apr 05, 2010 23:11
Antworten mit Zitat
Benutzer-Profile anzeigen
~VERSCHOBEN~
Dieser Thread passte nicht in das Forum, in dem er ursprünglich gepostet wurde.

Für Codes benutze die CodeTags. Diese sind über dem Beitragsfenster zu erreichen.
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

Midimaster

BeitragMo, Apr 05, 2010 23:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Da hast du was verwechselt. Mit CreateTimer() erzeugtst du so eine Art Interrupts, die Dir dann helfen, wenn Du die Kontrolle an das Betriebsystem abgeben möchstes, um sie nach einer best. Zeit wieder zu erhalten.

BlitzBasic: [AUSKLAPPEN]
timer=CreateTimer(10)
erzeugt Dir einen Interrupt, der sich 10x pro Sekunde(=alle 100msec) meldet. Benutzt wird er dann mit BlitzBasic: [AUSKLAPPEN]
WaitTimer Timer1


Die Variable Timer1% ist dabei die Bezeichnung dieses Timers und enthält keine Zeitwerte, sondern dient nur dazu diesen Timer immer wieder ansprechen zu können.

Deine Probleme löst Du mit dem Millisecs()-Timer, der wirkliche (Uhr-)Zeiten in msec-Bereich liefert.

Im Moment A steht er z.b. bei 83461m und eine Sekunde später bei 84461. Durch das Vergleichen des ersten mit dem zweiten Wert kommtst du dann auf die vergangene Zeit 1000msec.

Sieh dir mein Beispiel oben an.

Das System ist immer wieder das gleiche:
BlitzBasic: [AUSKLAPPEN]
Repeat
If Zeit<MilliSecs() Then
Zeit=MilliSecs()+1000
Print Zeit
EndIf
Forever


Du Nimmst die "Uhrzeit" in eine Variable Zeit% oder zählst gleich was dazu, dann liegt dieser Zeitpunkt in der "Zukunft". Nun vergleichst Du laufend Millisecs() mit dieser Zeit und sobald Millisecs() größer als Zeit geworden ist, sind die 100msec vergangen.
 

Stani

BeitragDi, Apr 06, 2010 11:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Ah jetzt versteh ich das.Danke sehr.

Also müsste es ungefähr so gehen:

Code: [AUSKLAPPEN]


Global Zeit%=0
Global Zeitpunkt%
Global X%,Y%

repeat
Cls

if keydown(57) Then  Sprung()
End if
Rect ,X,Y

Flip

Until keydown(1)

End


Function Sprung()

Zeitpunkt% = Millisecs()

if Zeit < Millisecs() Then
  Zeit = Millisecs() +300
  Y=Y+1
End if
 if Zeitpunkt% = 5*Zeit% Then
   if Zeit > Millisecs() Then
   Zeit = Millisecs() -300
  Y=Y -1
End if
End if

End if
End function




Beim wieder runterkommen bin ich mir nicht so sicher wie das gehen soll.Den ich muss ja fragen wieviel mal das schon + 300 gegangen ist und da ich ja nicht weiß wie lange das schon leuft hab ich mal Zeitpunkt hinzugefügt.

Kann mir vielleicht einer einen ganzen Code posten,damit ich das verstehe???
Den das eine mit dem Hochgehen versteh ich ja aber mit dem Runterkommen nicht....

(Es tut mir Leid,dass dieser Thread etwas durcheinander geraaten ist.)


Mfg Stani
  • Zuletzt bearbeitet von Stani am Di, Apr 06, 2010 17:58, insgesamt einmal bearbeitet

Midimaster

BeitragDi, Apr 06, 2010 17:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, das wird doch schon...allerdings:

So wie du jetzt die Variable ZeitPunkt% benutzt, wird sie immer wieder auf Millisecs() verstellt, wenn die Funktion Sprung() gerufen wird. Da Dich aber ja die Zeit interessiert, die seit Sprungbeginn vergangen ist, wäre es schlauer, wie Variable nur beim ersten Aufruf von Sprung() zu setzen:


BlitzBasic: [AUSKLAPPEN]
Function Sprung()
If ZeitPunkt=0 Then
Zeitpunkt = MilliSecs()
EndIf
....

End Function

übrigens musst du am Ende jeder Funktion EndFunction schreiben!


Nun vergleiche, um festzustellen, wieviel Zeit seit Sprungstart vergangen ist, immer die Variable mit Millisecs()
BlitzBasic: [AUSKLAPPEN]
If MilliSecs() < (Zeitpunkt% +2000) Then
; würde bedeuten, dass noch keine 2 sec vergangen sind
; hier gehört dann das Hochspringen rein
Else
; würde bedeuten dass bereits 2 sec vergangen sind.
; hier ghört dann das Absinken rein
EndIf



das gesamte:

BlitzBasic: [AUSKLAPPEN]
Function Sprung()
If ZeitPunkt=0 Then
Zeitpunkt% = MilliSecs()
EndIf
If Zeit < MilliSecs() Then
Zeit = MilliSecs() +300
If MilliSecs() < (Zeitpunkt% +2000) Then
; würde bedeuten, dass noch keine 2 sec vergangen sind
Y=Y+1
Else
; würde bedeuten dass bereits 2 sec vergangen sind.
Y=Y-1
; genug gesunken?
EndIf
EndIf
End Function


bei "genug gesunken?" gehört dann auch der Teil rein, der dafür sorgt dass das Absinken wieder beendet wird, wenn die Figur den Boden erreicht
 

Stani

BeitragDi, Apr 06, 2010 18:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok danke .Funktioniert super.Und das mit der Function end hab ich irgendwie vergessen.


Ich hab gerade ein etwas anderes Problemm.Ich hab mir ein neuen Code geschrieben,weil der alte nicht so gut war.

Dazu hab ich eine cam ,Boden,cube und player.cam und Boden ist klar.Player ist der würfel(der Player) für Spätere Collisionen und Waffen...Cube ist einfach nur dazu da,damit man sieht in welche Richtung man geht.

Das Problemm ist ja ,dass ich die Camera an die Position des players setze.Aber ich möchte ja die Camera drehen können um in diese Richtung zu gehen.Ich weiß aber nicht wie ich das machen soll.Das ist ja doof wenn ich in die eine Richtung laufe und die in die andere schaue.

Code: [AUSKLAPPEN]

Graphics3D 1024,768,32,1
SetBuffer BackBuffer()

;load objekts and strings


Global Boden=CreatePlane()
Global player=CreateCube()
Global cam=CreateCamera()
Global light=CreateLight()
Global textur1=LoadTexture("textur1.bmp")
Global cube=CreateCube()


PositionEntity Boden,0,-1,0
PositionEntity cam,0,0,0
EntityTexture Boden,textur1
ScaleEntity Boden,1,1,1
PositionEntity player,0,0,0
PositionEntity cube,10,0,10

x#=EntityX(cam)
y#=EntityY(cam)
z#=EntityZ(cam)













While Not KeyHit(1)
Cls









RenderWorld
UpdateWorld


Bewegung()

PositionEntity cam,EntityX(player),EntityY(player),EntityZ(player)

RotateEntity cam,EntityPitch(cam)+MouseYSpeed(),EntityYaw(cam)-MouseXSpeed(),0

















Flip
Wend
End

Function Bewegung()

If KeyDown(32) = 1 Then
   
   End If
   If KeyDown(30) = 1 Then
     
   EndIf
   If KeyDown(31) = 1 Then
   
   EndIf
   If KeyDown(17) = 1 Then
   
   EndIf
   If KeyDown (57) = 1 Then
   Sprung()
   EndIf

   
End Function

 Function Sprung()
    If ZeitPunkt=0 Then
        Zeitpunkt% = MilliSecs()
    EndIf
    If Zeit < MilliSecs() Then
        Zeit = MilliSecs() +300
        If MilliSecs() < (Zeitpunkt% +1500) Then

             MoveEntity player,0,1,0
        Else
            ; würde bedeuten dass bereits 2 sec vergangen sind.
          MoveEntity player,0,-1,0


           
             
           

        EndIf
    EndIf
End Function



Mfg Stani

Midimaster

BeitragDi, Apr 06, 2010 23:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Also normalerweise wird die Camera als ein Child des Players createt. Damit folgt sie immer dem Player, ohne dass man noch etwas programmieren muss:

BlitzBasic: [AUSKLAPPEN]
Cam=CreateCamera(Player)
. Wenn Du nun den Spieler drehen möchtest dreht die Camera mit. Zusätzlich kannst Du den Camera jetzt wie einen Kopf auf einem Körper drehen. Damit wird nach vorne laufen und gleichzeitig nach rechts schauen möglich. War es das, was du wolltest?
 

Stani

BeitragMi, Apr 07, 2010 13:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok ich hab jetzt ein ganzes Terrain(plane) und einen player,cam.........

Jetzt hab ich mal eine Hand mit einem Messer dazugefügt und es an die position des players gesetzt,nur das die z achse etwas höher ist,damit man die Hand und das Messer vorne sieht.

Nur jetzt hab ich das Problemm,dass ich ,wenn ich mich drehe die hand sich nicht mitdreht und das ich in die Hand reinsehe.

Wie lösse ich das Problemm??





Edit:Hab mal das Messer gegen eine Pistole ersetzt.Hier nochmal der Code:

Code: [AUSKLAPPEN]
Graphics3D 1024,768,32,1
SetBuffer BackBuffer()

;load objekts and strings
Const pcoll=1 ;player
Const ccoll=1 ;cube

Global Boden=CreatePlane()
Global player=CreateCube()
Global cam=CreateCamera(player)
Global light=CreateLight()
Global textur1=LoadTexture("Texturen/textur1.jpg")
Global cube=CreateCube()
Global ziel=LoadImage("Texturen/ziel.bmp")
MaskImage ziel,0,0,0
Global textur2=LoadTexture("Texturen/textur2.bmp")
EntityRadius player,2

;meshs


Global pistole = LoadMesh  ("Modele\Pistole\pistole.3ds")
Global pistoletextur=LoadTexture("Modele\Pistole\pistoletextur.jpg")
Global Dose1=LoadMesh("Modele\Dose1\Dose1.3ds")
Global Doset1 =LoadTexture("Modele\Dose1\skin.jpg")
Global Lampe1=LoadMesh ("Modele\Lampe\lampe.3ds")
Global lampet1=LoadTexture("Modele\Lampe\lampe.jpg")

;detais

PositionEntity Boden,0,-1,0
PositionEntity cam,0,0,0
EntityTexture Boden,textur1
ScaleEntity Boden,1,1,1
PositionEntity player,0,0,0
PositionEntity cube,10,0,10
PositionEntity light,10,0,0
EntityTexture cube,textur2
EntityType Lampe1,ccoll
EntityType player,pcoll

;meshdeteis



EntityTexture pistole,pistoletextur
ScaleMesh pistole,0.1,0.1,0.1

ScaleMesh Lampe1 ,0.1,0.1,0.1
TurnEntity pistole,-90,0,0
TurnEntity Lampe1,-90,0,0
EntityTexture Dose1,Doset1
EntityTexture Lampe1,lampet1
PositionMesh Dose1,12,0,12
PositionEntity Lampe1 ,12,-1,12

;Colisionen

Collisions pcoll,ccoll,3,2



While Not KeyHit(1)
Cls
RenderWorld
UpdateWorld

Steuerung()


 DrawImage ziel,512,384
   
 

Flip
Wend
End

Function Steuerung()

PositionEntity pistole,EntityX(player),EntityY(player),EntityZ(player)



If KeyDown(32) = 1 Then
   MoveEntity player,.3,0,0
   End If
   If KeyDown(30) = 1 Then
   MoveEntity player,-.3,0,0
   EndIf
   If KeyDown(31) = 1 Then
   MoveEntity player,0,0,-.3
   EndIf
   If KeyDown(17) = 1 Then
   MoveEntity player,0,0,.3
   EndIf
   

x# = EntityX(player)
z# = EntityZ(player)



   
   
   PositionEntity player, x#, 1, z#

   RotateEntity player,EntityPitch(player)+MouseYSpeed(),EntityYaw(player)-MouseXSpeed(),0
 
   
   
 


   
End Function

Midimaster

BeitragMi, Apr 07, 2010 15:56
Antworten mit Zitat
Benutzer-Profile anzeigen
na,...ist das nicht das gleiche Problem? Auch die Hand und die Pistole sollten immer Childs des Player werden.
BlitzBasic: [AUSKLAPPEN]
EntityParent Pistole, Player


Danach verhält sich die Pistole wie an den Player angewachsen. Jede Drehung des Players oder jedes Bewegen nimmt auch die Pistole mit. Jede Drehung der Pistole findet realtiv zur Achse des Players statt. Der Player "schaut" dabei immer in seine aktuelle z-Richtung. Dort sind alle Achsen der Child-Elemente genau auf 0 Grad.

Wie heisst den deine Hand? Ich kann die Stelle im Code gar nicht entdecken...
 

Stani

BeitragMi, Apr 07, 2010 17:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Hand ist bei der Pistole dabei.Nur das Problemm ist,dass sich die Pistole viel schneller bewegt und nicht vorne zu sehen ist sondern igrendwo in der Luft ist.Wen ich mich nach vorne bewege,dan bewegt sich die
Hand auch nach vorne aber viel viel schneller.

Hier nochmal mein aktueler Code Code: [AUSKLAPPEN]

Graphics3D 1024,768,32,1
SetBuffer BackBuffer()

;load objekts and strings
Const pcoll=1 ;player
Const ccoll=1 ;cube

Global Boden=CreatePlane()
Global player=CreateCube()
Global cam=CreateCamera(player)
Global light=CreateLight()
Global textur1=LoadTexture("Texturen/textur1.jpg")
Global cube=CreateCube()
Global ziel=LoadImage("Texturen/ziel.bmp")
MaskImage ziel,0,0,0
Global textur2=LoadTexture("Texturen/textur2.bmp")
EntityRadius player,2








;meshs


Global pistole = LoadMesh  ("Modele\Pistole\pistole.3ds")
Global pistoletextur=LoadTexture("Modele\Pistole\pistoletextur.jpg")
Global Dose1=LoadMesh("Modele\Dose1\Dose1.3ds")
Global Doset1 =LoadTexture("Modele\Dose1\skin.jpg")
Global Lampe1=LoadMesh ("Modele\Lampe\lampe.3ds")
Global Lampe2=LoadMesh ("Modele\Lampe\lampe.3ds")
Global Fass1=LoadMesh("Modele\Fass\Fass.3ds")
Global Textu
 
Global lampet1=LoadTexture("Modele\Lampe\lampe.jpg")




;detais


PositionEntity Boden,0,-1,0
PositionEntity cam,0,0,0
EntityTexture Boden,textur1
ScaleEntity Boden,1,1,1
PositionEntity player,0,0,0
PositionEntity cube,10,0,10
PositionEntity light,10,2,10
EntityTexture cube,textur2
EntityType Lampe1,ccoll
EntityType Lampe2,ccoll
EntityType player,pcoll






;meshdeteis



EntityTexture pistole,pistoletextur
ScaleMesh pistole,0.1,0.1,0.1
ScaleMesh Lampe1 ,0.1,0.1,0.1
ScaleMesh Lampe2 ,0.1,0.1,0.1
TurnEntity pistole,-90,0,0
TurnEntity Lampe1,-90,0,0
TurnEntity Lampe2,-90,0,0
EntityTexture Dose1,Doset1
EntityTexture Lampe1,lampet1
EntityTexture Lampe2,lampet1
PositionMesh Dose1,12,0,12
PositionEntity Lampe1 ,20,-1,12
PositionEntity Lampe2 ,40,-1,12
EntityParent pistole, player







;Colisionen

Collisions pcoll,ccoll,3,2



While Not KeyHit(1)
Cls
RenderWorld
UpdateWorld

Steuerung()


 DrawImage ziel,512,384
   
 

Flip
Wend
End

Function Steuerung()

PositionEntity pistole,EntityX(player),EntityY(player),EntityZ(player)



If KeyDown(32) = 1 Then
   MoveEntity player,.3,0,0
   End If
   If KeyDown(30) = 1 Then
   MoveEntity player,-.3,0,0
   EndIf
   If KeyDown(31) = 1 Then
   MoveEntity player,0,0,-.3
   EndIf
   If KeyDown(17) = 1 Then
   MoveEntity player,0,0,.3
   EndIf
   

x# = EntityX(player)
z# = EntityZ(player)



   
   
   PositionEntity player, x#, 1, z#

   RotateEntity player,EntityPitch(player)+MouseYSpeed(),EntityYaw(player)-MouseXSpeed(),0
 
   RotateEntity pistole,EntityPitch(pistole)+MouseYSpeed(),EntityYaw(pistole)-MouseXSpeed(),0
   
 


   
End Function










Ah ja ich hab auch schon 2 Straßenlampen hinzugefügt.Damit alles übersichtlicher wird,hab ich auch noch Ordner mit Texturen und Modele,die auch unterordner haben.






Edit:Das Springen geht auch nicht.Wenn ich Space drücke,dann geht das kurz hoch und dan wieder 2 mal runter und danah nur noch runter.........
 

Stani

BeitragFr, Apr 09, 2010 18:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo nochmal.Das mit der Waffe hab ich gelöst(Dank ZaP).

Aber das springen geht immernoch nicht.Wenn ich bei dem einen Code Space drücke geht der hoch und runter aber danach kann ich nicht mehr springen.
Ich kappier das einfach nicht mit dem springen.Kann mir bitte einer einen ganzen Code geben??
Das doofe ist,dass wenn ich oben auf meinen Kästen(cubes) bin,kann ich wieder nach unten,durch die Kästen,obwohl ich Collisons hab.

Ich denk das war jetzt alles.Diese beien Sachen und dan werde îch weitermachen und euch nicht mehr nerven:D

Danke

Mfg Stani

Midimaster

BeitragSa, Apr 10, 2010 8:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich sehe in Deinen Code-Beispiel überhaupt gar nichts, was auf "Springen" hindeutet... Wo ist denn der Code dazu?
 

Stani

BeitragSa, Apr 10, 2010 10:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja das war auch der eine ohne springen.Ah ja ich ab die Pistole gegehn ein Maschienengewehr getauscht,Sounds zum schießen und leer scein dazugefügt.
Hier noch der Code:

Code: [AUSKLAPPEN]
Graphics3D 1024,768,32,1
SetBuffer BackBuffer()

Global Boden=CreatePlane()
Global player=CreateCube()
Global cam=CreateCamera(player)
Global light=CreateLight()
Global textur1=LoadTexture("Texturen/textur1.jpg")
Global ziel=LoadImage("Texturen/ziel.bmp")
MaskImage ziel,0,0,0
Global textur2=LoadTexture("Texturen/textur2.bmp")
Global Pschuss = LoadSound("Sounds\Gewehr\Schuss.wav")
Global Pnachladen=LoadSound("Sounds\Gewehr\Nachladen.wav")
Global S%
Global Schuss=Pschuss
Global Pleer = LoadSound("Sounds\Gewehr\leer.wav")
Global Zeit%,Zeitpunkt%,Schusszeit%
;meshs

Global Lampe1=LoadMesh ("Modele\Lampe\lampe.3ds")
Global Lampe2=LoadMesh ("Modele\Lampe\lampe.3ds")
Global lampet1=LoadTexture("Modele\Lampe\lampe.jpg")
Global Wand1=LoadMesh("Modele\Wand\Wand.3ds")
Global wandt1=LoadTexture("Texturen\wandt1.jpg")
Global Gewehr = LoadMesh("Modele\Maschienengewehr\Maschienengewehr.3ds",player)
Global gewehrt=LoadTexture("Modele\Maschienengewehr\gewehr.jpg")




;detais

PositionEntity Boden,0,-1,0
PositionEntity cam,0,0,0
PositionEntity player,0,0,0
PositionEntity light,10,2,10
EntityTexture Boden,textur1
EntityTexture Wand1,wandt1
MoveEntity Gewehr,.2,-.2,.5
;collisionstypen

EntityType player,1
EntityType Lampe1,2
EntityType Lampe2,2
EntityType Wand1,2


EntityRadius Lampe1,2
EntityRadius Lampe2,2
EntityBox Wand1,30,-1,14,50,50,10

EntityRadius player,2




;meshdeteis


ScaleMesh Gewehr,0.1,0.1,0.1
ScaleMesh Lampe1 ,0.1,0.1,0.1
ScaleMesh Lampe2 ,0.1,0.1,0.1
ScaleEntity Boden,1,1,1
ScaleEntity Wand1,.5,.5,.5


TurnEntity Gewehr,-90,90,0
TurnEntity Lampe1,-90,0,0
TurnEntity Lampe2,-90,0,0
TurnEntity Wand1,-90,0,0



EntityTexture Lampe1,lampet1
EntityTexture Lampe2,lampet1

EntityTexture Gewehr,gewehrt


PositionEntity Lampe1 ,20,-1,12
PositionEntity Lampe2 ,40,-1,12

PositionEntity Wand1,30,-1,14

Global Y#=2


;Colisionen

Collisions 1,2,2,2



While Not KeyHit(1)
Cls


Steuerung()

DrawImage ziel,512,384

If KeyDown(57) Then Sprung()






RenderWorld
UpdateWorld


 


Flip
Wend
End



Function Steuerung()





If KeyDown(32) = 1 Then
   MoveEntity player,.2,0,0
   End If
   If KeyDown(30) = 1 Then
   MoveEntity player,-.2,0,0
   EndIf
   If KeyDown(31) = 1 Then
   MoveEntity player,0,0,-.2
   EndIf
   If KeyDown(17) = 1 Then
   MoveEntity player,0,0,.2
   EndIf
       
   If MouseDown(1) = 1 Then
   If Schusszeit% < MilliSecs() Then
   Schusszeit% = MilliSecs() +70
   S%=S%+1
   PlaySound Schuss

   EndIf
   EndIf
   
   If S% = 120 Then
   Schuss = Pleer
   EndIf

   
 
     
   
   

   
   RotateEntity player,EntityPitch(player)+MouseYSpeed(),EntityYaw(player)-MouseXSpeed(),0
   
   PositionEntity player,EntityX(player),Y#,EntityZ(player)




   
   
End Function



Function Sprung()



    If Zeitpunkt%=0 Then
        Zeitpunkt% = MilliSecs()
    EndIf
    If Zeit% < MilliSecs() Then
        Zeit% = MilliSecs() +300
        If MilliSecs() < (Zeitpunkt% +1500) Then
            Y#=Y#+.5
        ElseIf MilliSecs() > (Zeitpunkt% +1500) Then

            Y#=Y#-.5
           
        EndIf
    EndIf

If Y# < 2 Then Y#=2
End Function












Midimaster

BeitragSa, Apr 10, 2010 18:29
Antworten mit Zitat
Benutzer-Profile anzeigen
jetzt ist alle klar,

das erste Springen startet, weil der Timer ZeitPunkt% noch auf 0 ist. Und genau den vergisst Du am Ende nach der Landung wieder auf 0 zu setzen.

BlitzBasic: [AUSKLAPPEN]
    ...
If Y# < 2 Then
Y#=2
ZeitPunkt=0
EndIf
End Function



Fraglich ist auch, ob das Springen wirklich nur solange stattfinden sollte, wie der Spieler die SPACE-Taste drückt... Was, wenn der Spieler losläßt, bevor wieder gelandet wurde. Ich denke der Landungs-Prozess muss auf jeden Fall unabhängig von der SPACE-Taste zuende gebracht werden, oder?

Ich würde es so lösen:

Der Druck auf die SPACE-Taste startet den Timer, das Loslassen der SPACE-Taste löst die Umkehr zur Landung aus. Die Bodenberührung (IF Y=2) beendet den ganzen Spuk, reseten alles, sodass ein neuer Sprung ausgelöst werden könnte.

BlitzBasic: [AUSKLAPPEN]
...
If KeyDown(57) Then
If ZeitPunkt=0 Then
ZeitPunkt=MilliSecs()
EndIf
Else
;Umkehr nur auslösen, wenn noch in einer Steigphase
If MilliSecs() < (Zeitpunkt +1500) Then
; setzt Timer so, dass sofort Sinkphase ist
ZeitPunkt=MilliSecs()-1501
EndIf
EndIf

Sprung()
...

Function Sprung()
; Funktion nur abarbeiten, wenn Sprungtimer gesetzt ist:
If ZeitPunkt>0 Then
If Zeit < MilliSecs() Then
Zeit = MilliSecs() +300
If MilliSecs() < (Zeitpunkt +1500) Then
Y=Y+.5
ElseIf MilliSecs() > (Zeitpunkt +1500) Then
Y=Y-.5
If Y<2 Then
; alles reseten
Y=2
ZeitPunkt=0
EndIf
EndIf
EndIf
EndIf
End Function
 

Stani

BeitragSa, Apr 10, 2010 22:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok dankesehr ,dass ihr schreibt Very Happy

Hab jetzt springen angepasst und so gemacht,das man nicht immer die Space taste drücken muss.
Aber irgendwie geht das mit der Collision nicht,also wenn ich auf eine "Testbox"(cube) springe bleibt der nicht oben,sondern geht durch diew Box nach unten.
Woran kann das liegen??

Midimaster

BeitragSo, Apr 11, 2010 1:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Hat denn die TestBox schon einen EnityType? Checkst du schon irgendwo diese spezielle Kollision?
 

Stani

BeitragSo, Apr 11, 2010 11:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja alles hat i Moment eine Kollision.Ich hab zum player entitytype 1 und zu den anderen 2.Um den playe mach ich ein Radius und um die anderen eine entitybox.
Alles funzt ja ,außer von oben.
Ich hab da stehen Collisions 1,2,2,2

Das komische ist,man kann ja bei einer Entitybox höhe,breite,tiefe eingeben.Wenn ich das mache ist das egal ob ich 100,100,100 oder 1,1,1 eingeben ,der bleibt immer am Objekt stehen.

Midimaster

BeitragSo, Apr 11, 2010 11:30
Antworten mit Zitat
Benutzer-Profile anzeigen
so wie ich das sehe, ist ccoll die Variable, die Du bei der Collisionserkennung für den Cube verwendest? und pcoll für den Player? Aber beide sind "1"? Das kann nicht gut gehen!

Und ich sehe nirgends einen EntityBox für den Cube oder einen EntityType. Zeige mir mal diese Stellen im Code. Oder ist "Wand" deine TestBox?

Gehe zu Seite 1, 2, 3  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group