Well as we have noted before System.currentTimeMillis() is operating
system dependent (and becomes rather sloppy on Win9x).

We implemented this type of movement via capturing keypresses directly
without using a behavior.  Our movement behavior then uses the
acceleration, speed, etc information to update the scene correctly.

- John Wright
Starfire Research

Georg Rehfeld wrote:
>
> Hello group members,
>
> has anybody of you successfully extended ViewPlatformAWTBehavior
> to handle KeyEvents and is willing to share hints or code?
>
> I'm trying to implement a simple Quake style behavior, where the
> mouse controls the view direction and some keys (say CURSOR UP/DOWN
> and LEFT/RIGHT) move the ViewPlatform forward/reverse and left/right
> (called 'strafing' in Quake) with respect to the current view
> direction. Needless to say, that the horizon shall remain
> horizontally, ever :-).
>
> This works, in principal.
>
> The problem is: since I started to respect deltaTime (via
> System.currentTimeMillis() as in KeyNavigatorBehavior) my
> Behavior became really worse:
>
> most notably, instead of accelerating smoothly to the desired
> maximum speed ever, it shows 3 different real behaviors randomly:
>
> - sometimes it only moves the VP in much too small steps, not
>   accelerating at all, while the accelerating key is held down.
>   When it is released, the VP suddenly has the maximum speed
>   (decelerating then, as wanted, immediately).
>
> - most times it almost accelerates just fine to the desired
>   speed, but in all the motion, when the framerate drops (i.e.
>   due to new objects coming into view) the motion TOO is affected.
>   Which should not be the case at all, as I'm respecting
>   deltaTime from the last frame and that should compensate by
>   moving the VP farther, when deltaTime is high. Besides, my
>   deltaTimes are almost ever 10, 20, 30 ... milli seconds, due
>   to the bad PC time resolution, possibly I should integrate
>   that, but then, how does the KeyNavigatorBehavior class
>   deal with that, I couldn't find any special code?
>
> - sometimes the final speed seems to be about double of the
>   desired speed, then the movement seems to be smooth.
>
> My Pseudo-Code is as follows:
>
>   protected synchronized void
>       processAWTEvents(final AWTEvent[] events)
>   {
>     motion = false;
>     // set motion = true, if some acc/decelerating
>     // or movement is in progress
>     if ...  motion = true;
>     // handle all AWT events
>     ...
>     processKeyEvent(event)
>     ...
>   }
>
>   protected void processKeyEvent(final KeyEvent evt) {
>     // record key states into instance variable(s)
>     // and set motion = true on any recognized key event
>     ...
>   }
>
>   protected synchronized void integrateTransforms() {
>     // Check if the transform has been changed by another behavior
>     targetTG.getTransform(currentTransform) ;
>     if (! targetTransform.equals(currentTransform)) {
>       resetView();
>     }
>
>     calcSpeed();
>
>     // modify the target transform, this simply works
>     ...
>   }
>
>   private void calcSpeed() {
>     long now = System.currentTimeMillis();
>     long deltaTime = now - lastTime;
>     lastTime = now;
>
>     // check for too old time sample
>     if (deltaTime > 2000)  deltaTime = 1;
>
>     // protect against 0 deltaTime, this happens sometimes
>     if (deltaTime < 1)  deltaTime = 1;
>
>     float dt = (float)deltaTime / 1000f;
>
>     // exploit key states and then
>     // integrate acceleration/drag over dt
>     ...
>     // integrate velocity over dt
>     ...
>     // set instance members for integrateTransforms()
>     ...
>   }
>
> Any hints are VERY welcome
>
> thanks
>
> Georg
>  ___   ___
> | + | |__    Georg Rehfeld      Woltmanstr. 12     20097 Hamburg
> |_|_\ |___   [EMAIL PROTECTED]           +49 (40) 23 53 27 10
>
> ===========================================================================
> To unsubscribe, send email to [EMAIL PROTECTED] and include in the body
> of the message "signoff JAVA3D-INTEREST".  For general help, send email to
> [EMAIL PROTECTED] and include in the body of the message "help".

===========================================================================
To unsubscribe, send email to [EMAIL PROTECTED] and include in the body
of the message "signoff JAVA3D-INTEREST".  For general help, send email to
[EMAIL PROTECTED] and include in the body of the message "help".

Reply via email to