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

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Code der Verwirrung

Betreff: anfängerschwierigkeiten.... bewegung von objekt *peinlich*

BeitragMi, Okt 31, 2007 13:10
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Embarassed . ausserdem möchte ich dass wenn man werder die taste rechts,noch die taste links drückst das schiff langsam aufhört zu rotieren.
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

BeitragMi, Okt 31, 2007 13:44
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Embarassed
Starfare: Worklog, Website (download)
  • Zuletzt bearbeitet von ZaP am Mi, Okt 31, 2007 13:58, insgesamt einmal bearbeitet

Markus2

BeitragMi, Okt 31, 2007 13:54
Antworten mit Zitat
Benutzer-Profile anzeigen
vor_zurück#=0.1


@ZaP
bla
 

Code der Verwirrung

BeitragMi, Okt 31, 2007 14:10
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Okt 31, 2007 19:17
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Okt 31, 2007 20:00
Antworten mit Zitat
Benutzer-Profile anzeigen
@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

BeitragMi, Okt 31, 2007 22:58
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Okt 31, 2007 23:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Kannste z.B. so machen

A=A/2.0 wenn keine Taste gedrückt wird
 

Code der Verwirrung

BeitragMi, Okt 31, 2007 23:15
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Okt 31, 2007 23:18
Antworten mit Zitat
Benutzer-Profile anzeigen
rechts_links =rechts_links / 2.0 Cool

Beispiel
+4=+4/+2 = +2
-4=-4/+2 = -2
 

Code der Verwirrung

BeitragMi, Okt 31, 2007 23:50
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Nov 01, 2007 0:32
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Nov 01, 2007 2:06
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Nov 01, 2007 13:58
Antworten mit Zitat
Benutzer-Profile anzeigen
vlieleicht könnte man den wert einfach auf 0 setzen wenn er nahe an null geht. so häten wir keine ewige drehung mehr Smile .ich werde das mal testen.
mfg CdV

thx@all

Markus2

BeitragDo, Nov 01, 2007 14:01
Antworten mit Zitat
Benutzer-Profile anzeigen
kann man einfach so machen
if abs(x)<0.1 then x=0
 

Code der Verwirrung

BeitragFr, Nov 02, 2007 14:43
Antworten mit Zitat
Benutzer-Profile anzeigen
ach ja nochwas: warum zeichnet der mit drawimage nicht im 3d modus?

The_Nici

BeitragFr, Nov 02, 2007 17:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Drawimage nach Renderworld.
 

Code der Verwirrung

BeitragFr, Nov 02, 2007 18:22
Antworten mit Zitat
Benutzer-Profile anzeigen
ah danke (war ich dumm)

edit: hm hat doch nix gebracht komisch.....
 

Dreamora

BeitragFr, Nov 02, 2007 19:06
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Nov 02, 2007 19:56
Antworten mit Zitat
Benutzer-Profile anzeigen
ah ja ich merke was ich falschgemacht habe. flip war an der falschen stelle.
manchmal stelle ich mich echt dumm an Rolling Eyes

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group