rotate player based off of joystick

Posted by pengume on Game Development See other posts from Game Development or by pengume
Published on 2011-03-07T05:43:36Z Indexed on 2012/07/04 15:25 UTC
Read the original article Hit count: 249

Filed under:
|
|

Hey everyone I have this game that i am making in android and I have a touch screen joystick that moves the player around based on the joysticks position. I cant figure out how to also get the player to rotate at the same angle of the joystick. so when the joystick is to the left the players bitmap is rotated to the left as well. Maybe someone here has some sample code I could look at here is the joysticks class that I am using. `public class GameControls implements OnTouchListener {

public float initx =  DroidzActivity.screenWidth - 45;   //255; // 320 og 425
public float inity = DroidzActivity.screenHeight - 45;//425; // 480 og 267
public Point _touchingPoint = new Point( DroidzActivity.screenWidth - 45, DroidzActivity.screenHeight - 45);
public Point _pointerPosition = new Point(DroidzActivity.screenWidth - 100, DroidzActivity.screenHeight - 100); // ogx 220 ogy 150
private Boolean _dragging = false;
private boolean attackMode = false;

@Override
public boolean onTouch(View v, MotionEvent event) {

    update(event);
    return true;
}

private MotionEvent lastEvent;
public boolean ControlDragged;
private static double angle;

public void update(MotionEvent event) {
    if (event == null && lastEvent == null) {
        return;
    } else if (event == null && lastEvent != null) {
        event = lastEvent;
    } else {
        lastEvent = event;
    }
    // drag drop
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        if ((int) event.getX() > 0 && (int) event.getX() < 50
                && (int) event.getY() > DroidzActivity.screenHeight - 160
                && (int) event.getY() < DroidzActivity.screenHeight - 0) {
            setAttackMode(true);
        } else {
            _dragging = true;
        }
    } else if (event.getAction() == MotionEvent.ACTION_UP) {
        if(isAttackMode()){
            setAttackMode(false);
        }
        _dragging = false;
    }

    if (_dragging) {
        ControlDragged = true;
        // get the pos
        _touchingPoint.x = (int) event.getX();
        _touchingPoint.y = (int) event.getY();
    //  Log.d("GameControls", "x = " + _touchingPoint.x + " y = "
                //+ _touchingPoint.y);
        // bound to a box
        if (_touchingPoint.x < DroidzActivity.screenWidth - 75) { // og 400
            _touchingPoint.x = DroidzActivity.screenWidth - 75;
        }
        if (_touchingPoint.x > DroidzActivity.screenWidth - 15) {// og 450
            _touchingPoint.x = DroidzActivity.screenWidth - 15;
        }
        if (_touchingPoint.y < DroidzActivity.screenHeight - 75) {// og 240
            _touchingPoint.y = DroidzActivity.screenHeight - 75;
        }
        if (_touchingPoint.y > DroidzActivity.screenHeight - 15) {// og 290
            _touchingPoint.y = DroidzActivity.screenHeight - 15;
        }

        // get the angle
         setAngle(Math.atan2(_touchingPoint.y - inity,
                _touchingPoint.x - initx) / (Math.PI / 180));

        // Move the ninja in proportion to how far
        // the joystick is dragged from its center
        _pointerPosition.y += Math.sin(getAngle() * (Math.PI / 180))
                * (_touchingPoint.x / 70); // og 180 70
        _pointerPosition.x += Math.cos(getAngle() * (Math.PI / 180))
                * (_touchingPoint.x / 70);
        // make the pointer go thru
        if (_pointerPosition.x > DroidzActivity.screenWidth) {
            _pointerPosition.x = 0;
        }

        if (_pointerPosition.x < 0) {
            _pointerPosition.x = DroidzActivity.screenWidth;
        }

        if (_pointerPosition.y > DroidzActivity.screenHeight) {
            _pointerPosition.y = 0;
        }
        if (_pointerPosition.y < 0) {
            _pointerPosition.y = DroidzActivity.screenHeight;
        }

    } else if (!_dragging) {
        ControlDragged = false;
        // Snap back to center when the joystick is released
        _touchingPoint.x = (int) initx;
        _touchingPoint.y = (int) inity;
        // shaft.alpha = 0;
    }
}

public void setAttackMode(boolean attackMode) {
    this.attackMode = attackMode;
}

public boolean isAttackMode() {
    return attackMode;
}

public void setAngle(double angle) {
    this.angle = angle;
}

public static double getAngle() {
    return angle;
}

}` I should also note that the player has animations based on when he is moving or attacking.

EDIT:

I got the angle and am rotating the sprite around in the correct angle however it rotates on the wrong spot. My sprite is one giant bitmap that gets cut into four pieces and only one shown at a time to animate walking. here is the code I am using to rotate him right now. ` public void draw(Canvas canvas,int pointerX, int pointerY) { Matrix m;

    if (setRotation){
    //  canvas.save();
     m = new Matrix();
     m.reset();
            // spriteWidth and spriteHeight are for just the current frame showed 
    //m.setTranslate(spriteWidth / 2, spriteHeight / 2);
     //get and set rotation for ninja based off of joystick
     m.preRotate((float) GameControls.getRotation());

    //create the rotated bitmap
      flipedSprite = Bitmap.createBitmap(bitmap , 0, 0,bitmap.getWidth(),bitmap.getHeight() , m, true);
      //set new bitmap to rotated ninja
    setBitmap(flipedSprite);

    setRotation = false;
//  canvas.restore(); 
    Log.d("Ninja View", "angle of rotation= " +(float) GameControls.getRotation());
    }

`
And then the draw method

// create the destination rectangle for the ninjas current animation frame
// pointerX and pointerY are from the joystick moving the ninja around
destRect = new Rect(pointerX, pointerY, pointerX + spriteWidth, pointerY + spriteHeight);

 canvas.drawBitmap(bitmap, getSourceRect(), destRect, null);

© Game Development or respective owner

Related posts about android

Related posts about rotation