x
• Status: Solved
• Priority: Medium
• Security: Public
• Views: 283

# Moving a ball - simple casting problem

I have a really annoying problem that I can't figure out.. It's gotta be a problem with my casting.  I'm working on a simple pong game, but can't get the ball moving around right.  I call this method every time I go through my game loop:

public void tick()
{
float delta = System.currentTimeMillis() - timeAtLastTick;
timeAtLastTick = System.currentTimeMillis();
float ychange = (float)(ball.getYVol()*(delta/1000));
float xchange = (float)(ball.getXVol()*(delta/1000));
float newx = xchange + ball.getXPos();
float newy = ychange + ball.getYPos();
System.out.println("xchange: " + xchange + " newx: " + newx + " oldx: " + ball.getXPos());
ball.setYPos(newy);
ball.setXPos(newx);
}

What gets printed is something like this:
...
xchange: 7.5 newx: 5.48133175E11 oldx: 5.48133175E11
xchange: 16.0 newx: 5.48133175E11 oldx: 5.48133175E11
xchange: 7.5 newx: 5.48133175E11 oldx: 5.48133175E11
xchange: 8.0 newx: 5.48133175E11 oldx: 5.48133175E11
...

xchange and ychange are always positive, but newx and newy are always equal to oldx and oldy!  I'm using Tiger, so accurate timing isn't the problem.  Even if that was the problem, xchange and ychange are always postive, so I don't understand why newx and newy never change.  Xpos and ypos are stored as floats in ball, and get/set x/y don't do any casting.

I'm stumped.  Any thoughts?
0
• 5
• 4
• 2
• +3
1 Solution

Software engineerCommented:
Well, adding 7.5 to 5.48133175E11 is like adding one drop of water to the ocean, no?
I think that's the problem.
0

Commented:
setXPos/setYPos may be operating on 'hidden' variables perhaps. In any case, they seem to be having no effect
0

Software engineerCommented:
5.48133175E11 is 548133175???
and 548133175??? + 7.5 = 548133175???.5
0

Commented:
>xchange: 7.5 newx: 5.48133175E11 oldx: 5.48133175E11

the number you are using are really big (float). So if to a big number add a little number, the bigger remain the same.
5.48133175E11 is
548133175000
548133175007.5 in float notation became:
5.48133175E11 (the same!)

Bye, Giant.
0

Software engineerCommented:
Ahum ;Â°)
0

Commented:
How are you updating your graphics ?

Is it using a Thread and if not then it should be, otherwise you will not get any graphics updates.  This may be besides the point but just make sure you have the game running ina loop Thread, or you can use a Timer.

Best of luck

pjcrooks2000
0

Commented:
0

Author Commented:
Woah, I guess I never noticed that "E".  Where do you think that's coming from? The ball's xpos and ypos are initialized to about 100 I think.  Also, when I draw the ball, it's always in the top left of the screen.

Here's how I'm drawing it:
g2.fillOval(Math.round(ball.getXPos()), Math.round(ball.getYPos()), BALL_WIDTH, BALL_HEIGHT);
0

Author Commented:
> Where do you think that's coming from?

Sorry, I meant: "Where do you think that giant number is coming from?", I know what the E represents.
0

Author Commented:
I think that I initialize timeAtLastTick to zero.  That means that by the time I first call tick(), delta (System.currentTimeMillis() - timeAtLastTick) would be over a trillion.  Do you think this could be the problem? If so, why is the ball getting drawn in the top-left of the screen?
0

Commented:
I don't know what kind of object is your ball object. I know that the top-left of the screen normally has coordinate 0,0.
Maybe when you use ball.set?Pos you do not change the position of the graphical object (I think) linked to the ball object you use.
0

Software engineerCommented:
>>I think that I initialize timeAtLastTick to zero.
You *think* it?

>>That means that by the time I first call tick(), delta (System.currentTimeMillis() - timeAtLastTick) would be
>>over a trillion.  Do you think this could be the problem?
Yes.

>>If so, why is the ball getting drawn in the top-left of the screen?
Don't know. Maybe that's the "fall back position" in case of drawing off-screen.
You could try that out by incrementing the x and y position and look what happens.
0

Commented:
>I think that I initialize timeAtLastTick to zero.  That means that by the time I first call tick(), delta
>(System.currentTimeMillis() - timeAtLastTick) would be over a trillion.  Do you think this could be the problem? If so,
>why is the ball getting drawn in the top-left of the screen?

The problem is that you are initializing timeAtLastTick to 0. Try to initialize it to System.currentTimeMillis(), this will remove the majot discrepancies in the code.

Kartik
0

Author Commented:
> You *think* it?
Sorry, I was at school and didn't have my code handy.

> You could try that out by incrementing the x and y position and look what happens.
That's was my problem, I was trying to increment x and y, but nothing was happening!

I got it working though.  Setting timeAtLastTick to System.currentTimeMillis() right before my first tick fixed it.  Thanks for you help everyone.
0

Software engineerCommented:
Thanks
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.