anfängerschwierigkeiten.... bewegung von objekt *peinlich*
Übersicht

Code der VerwirrungBetreff: anfängerschwierigkeiten.... bewegung von objekt *peinlich* |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
also mein problem ist folgendes:
das objekt schiff soll bewegt werden. und zwar mit der function bewege_schiff(). ich habe (versucht) dass das objekt sich relativ stufenlos bewegen lässt. ich will aber jetzt mehr als nur 6 stufen (ohne dass sich das objekt unkontrollierbar schnell dreht).damit muss ich mit kommazahlen arbeiten, hab aber leider keine ahnung davon ![]() auch hier weiss ich nicht weiter. später will ich auch ne maussteuerung einbauen und bin mir fast sicher,dass das auch schwierig werden kann. Code: [AUSKLAPPEN] Const screen_x=1280 Const screen_y=1024 Const screen_modus=1 ;1=vollbid,2=fenster Const screen_farbtiefe=32 Global timer =CreateTimer(30) Global oben_unten=0 Global rechts_links=0 Graphics3D screen_x,screen_y,screen_farbtiefe,screen_modus SetBuffer BackBuffer() skycube=CreateCube() skytex=LoadTexture("behind.jpg") ScaleEntity skycube,-500000,-500000,-500000 EntityOrder skycube,1 EntityTexture skycube,skytex EntityFX skycube,1 ScaleTexture skytex,0.5,0.5 AmbientLight 40,40,40 light= CreateLight(1) LightColor light,255,255,255 LightRange light, 75 planet=LoadMesh("earth.x") Global schiff=LoadMesh("test.x") Global cammera=CreateCamera (schiff) CameraRange cammera,1,1000000 MoveEntity cammera,0,0,-200 Repeat UpdateWorld RenderWorld Flip 1 bewege_schiff() WaitTimer timer Until KeyHit (1) Function bewege_schiff() If KeyDown(200) ;Taste Pfeil auf oben_unten=oben_unten+1 Else If KeyDown(208) ;Taste Pfeil ab oben_unten=oben_unten-1 Else If KeyDown(205) ;Taste rechts rechts_links=rechts_links-1 Else If KeyDown(203) ;Taste links rechts_links=rechts_links+1 EndIf If KeyDown(44) ;Taste y vor_zurück=vor_zurück+1 Else If KeyDown(45) ;Taste x vor_zurück=vor_zurück-1 EndIf If oben_unten>3 oben_unten=3 EndIf If rechts_links>3 rechts_links=3 EndIf If vor_zurück>60 vor_zurück=60 EndIf If oben_unten<-3 oben_unten=-3 EndIf If rechts_links<-3 rechts_links=-3 EndIf If vor_zurück<-60 vor_zurück=-60 EndIf TurnEntity schiff,oben_unten,rechts_links,0 MoveEntity schiff,0,0,vor_zurück End Function End der code ist teileise mit hilfe eines tutorials erstellt worden. |
||
![]() |
ZaP |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das was du machen willst musst du mit Cos() und Sin() machen.
Du brauchst eine X-Position vom Schiff, eine Y-Position natürlich auch, die Geschwindigk. des Schiffes und am wichtigsten die Richtung in grad (0-360). Code: [AUSKLAPPEN] Function MoveCruiser() CruiserX# = CruiserX# + Cos(CruiserDir) * CruiserSpeed CruiserY# = CruiserY# + Sin(CruiserDir) * CruiserSpeed ;ein # hinter einer Variable weißt auf eine Kommazahl (Float) hin. End Function In der OH ist alles etwas genauer besschrieben (siehe Cos() / Sin()) //EDIT: Verflucht, dachte du arbeitest 2dimensional ![]() |
||
Starfare: Worklog, Website (download) |
- Zuletzt bearbeitet von ZaP am Mi, Okt 31, 2007 13:58, insgesamt einmal bearbeitet
![]() |
Markus2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
vor_zurück#=0.1
@ZaP bla |
||
Code der Verwirrung |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
achja ich muss nochwas erwähnen. mir ist aufgefallen,dass es bei der beschleunigung des schiffes zu problemen kommt. es kommt zu keiner echten beschleunigung. plötzlich ist der speed auf maximum und wenn man die taste loslässt auf minimum.
@markus2: wo muss ich das # setzen? in meinem code steht nirgends vor_zurück#=0.1 |
||
![]() |
Mr.Keks |
![]() Antworten mit Zitat ![]() |
---|---|---|
heyho steff!
also, wenn du bei der ersten verwendung der variable ein # an ihr ende setzt (und zur übersicht macht es auch sinn, bei jeder weiteren verwendung das # zu schreiben), wird die variable eine fließkommazahl. dann kannst du auch werte wie 0.1 addieren, sodass es dann im endeffekt mehr stufen gibt als sechs. vor_zurück ist bei dir nicht global gesetzt, weshalb dieser effekt entsteht, dass nur der tastendruck geschwindigkeit erzeugt. das programm vergisst quasi mit jedem funktionsende, dass vor_zurück einen wert hatte und setzt ihn beim nächsten aufruf wieder auf 0. übrigens bin ich sehr verwundert, dass die umlautvariablen funktionieren O_o schöne grüße, mr.keks |
||
MrKeks.net |
![]() |
Markus2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Code der Verwirrung
Wenn es dir zu schnell geht dann mach es so oder nimm KeyHit und die Unterfunktion muß die Variable kennen , also GLobal machen oder besser als Parameter Du hast vorher 30 mal die Sekunde +1 gerechnet = 30 und dein Limit ist +-60 If KeyDown(44) then ;Taste y vor_zurück#=vor_zurück#+0.001 ElseIf KeyDown(45) ;Taste x vor_zurück#=vor_zurück#-0.001 EndIf |
||
Code der Verwirrung |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ah danke das hat echt geholfen.....ich muss es ja global machen^^.
das mit float ist mir jetzt auch klar. danke. jetzt fehlt nurnoch die rotationsverminderung, wenn man keine taste drückt. thx@all |
||
![]() |
Markus2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Kannste z.B. so machen
A=A/2.0 wenn keine Taste gedrückt wird |
||
Code der Verwirrung |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
hm vlieleicht habe ich das problem nicht richtig beschrieben:
ich brauche eher sowas wie: wenn taste rechts und taste links nicht gedrückt werden, dann reduziere rechts_links um 0.2 wenn rechts_links>0 ist. wenn taste rechts und taste links nicht gedrückt werden, dann erhöhe rechts_links um 0.2 wenn rechts_links<0 ist. ich will also 2 bedingungen prüfen, nicht nur eine. |
||
![]() |
Markus2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
rechts_links =rechts_links / 2.0 ![]() Beispiel +4=+4/+2 = +2 -4=-4/+2 = -2 |
||
Code der Verwirrung |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ah jetzt kapiere ich den ansatz. eine gute idee,nur...... das schiff würde nie ganz zum stehen kommen.
es würde anfangs aprupt die bewegung verlangsamen und dann würde sich der effekt abschwächen,bis das schiff nur ganz langsam aufhört zu rotieren. verringert man den quotient, dann ist es zwar net so ruckartig,doch es würde dann auch einen leichteren abbremseffekt geben. ich möchte eher dass das raumschiff recht schnell gegenkorrigiert und dann geradeausfliegt. |
||
![]() |
Mr.Keks |
![]() Antworten mit Zitat ![]() |
---|---|---|
hast du es mal wirklich ausprobiert? mit so einer division (eigentlich schon bei *0.9 oder so) ist die bewegung recht schnell im nicht mehr nennenswerten bereich... wenn du *0.9 bei 60 fps eine sekunde lang anwendest, wird aus einer drehung von 2grad/frame läpische 0,0036 grad/frame. das bedeutet, es dauert über vier sekunden, bis die drehung um einen grad weiter geht, wobei sie sich ja noch weiter verlangsamt, weshalb es noch langsamer weiter geht. verglichen mit den 120grad/sekunde vom anfang, kann man das getrost als nichts bezeichnen. | ||
MrKeks.net |
![]() |
Markus2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Besser wäre es wenn man die Differenz nimmt z.B. von
Winkel A nach Winkel B und damit den aktuellen Winkel manipuliert . Also große Kursänderung schnell und wenig Kursabweichung langsam und dabei kann man noch nen Mindestwert hinzu rechnen damit sich überhaupt was dreht . Du könntest auch Sin oder Cos zu Hilfe nehmen . Kurs=Kurs+Sin(-90 bis 90 Grad)*a |
||
Code der Verwirrung |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
vlieleicht könnte man den wert einfach auf 0 setzen wenn er nahe an null geht. so häten wir keine ewige drehung mehr ![]() mfg CdV thx@all |
||
![]() |
Markus2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
kann man einfach so machen
if abs(x)<0.1 then x=0 |
||
Code der Verwirrung |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ach ja nochwas: warum zeichnet der mit drawimage nicht im 3d modus? | ||
![]() |
The_Nici |
![]() Antworten mit Zitat ![]() |
---|---|---|
Drawimage nach Renderworld. | ||
Code der Verwirrung |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ah danke (war ich dumm)
edit: hm hat doch nix gebracht komisch..... |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
dann machst du was falsch.
Die Reihenfolge ist so innerhalb der Mainloop CLS 3D Befehle UpdateWorld RenderWorld 2D Befehle Flip |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
Code der Verwirrung |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ah ja ich merke was ich falschgemacht habe. flip war an der falschen stelle.
manchmal stelle ich mich echt dumm an ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group