A Flash Developer Resource Site

Results 1 to 13 of 13

Thread: cos/sin * distance from guntip to rotation point?

  1. #1
    Junior Member
    Join Date
    Jul 2009
    Posts
    25

    cos/sin * distance from guntip to rotation point?

    hello,
    i want to get shot bullets to appear at the tip of the gun instead of the center of the body. there's a similar thread here (actually its exactly what i want) but i dont understand the solution by asgrunt.

    http://www.actionscript.org/forums/showthread.php3?t=213237

    can anyone help please?

    thanks,
    adamvan101

  2. #2
    Bacon-wrapped closures Nialsh's Avatar
    Join Date
    Dec 2003
    Location
    Houston!
    Posts
    338
    Yeah, that was a pretty vague answer. The idea behind this is that you're representing things as vectors. The following are vectors that you'll deal with:
    A. The reference point of the character (_x, _y)
    B. The offset of the shoulder from the character's reference point
    C. The offset of the tip of the gun from the shoulder

    Adding these will give you the position of the tip of the gun, with respect to the origin.

    G = A+B+C

    The components of the G will be helpful for placing your bullet:
    Gx = Ax + Bx + Cx
    Gy = Ay + By + Cy

    I don't know exactly what variables you have, but your final answer will probably look something like this:

    Code:
    bullet._x = character._x + Bx + L*Math.cos(angle)
    bullet._y = character._y + By + L*Math.sin(angle)
    'angle' is the angle of the arm in radians and L is the length of the arm (probably a constant).

    Bx and By are constants too. In my image, I took a guess that your reference point is at the bottom of the character, in which case you would set them to about 0 and 20, respectively. That may not be the case for you, so play with the numbers and see what looks good.

    Hope this helps. You might want to read a bit about vectors.

    Neal
    Attached Images Attached Images
    Last edited by Nialsh; 07-30-2009 at 03:12 AM.

  3. #3
    Junior Member
    Join Date
    Jul 2009
    Posts
    25
    i definitely will read about vectors haha. thanks for a more detailed answer. one queston: my game is a birds-eye-view so its slightly different than that robot one. should 'L' be the length from the rotation point of my character (the center) to the end of the gun?

    thanks again!,
    adamvan101

  4. #4
    Bacon-wrapped closures Nialsh's Avatar
    Join Date
    Dec 2003
    Location
    Houston!
    Posts
    338
    Sounds right. And your B term will probably be zero.

  5. #5
    Junior Member
    Join Date
    Jul 2009
    Posts
    25
    i tried to do that. i had this:
    PHP Code:
    setProperty(bullet_xchar._x+L*Math.cos(angle)); 
    and same with y but Math.sin.
    L = 15, then i tried with 30. do neither worked. do the values for L seem right?

  6. #6
    Bacon-wrapped closures Nialsh's Avatar
    Join Date
    Dec 2003
    Location
    Houston!
    Posts
    338
    What behavior did you get?

  7. #7
    Junior Member
    Join Date
    Jul 2009
    Posts
    25
    i dont even know exactly what it was. the best i can say is the bullet appeared in random places near the character everytime

  8. #8
    Bacon-wrapped closures Nialsh's Avatar
    Join Date
    Dec 2003
    Location
    Houston!
    Posts
    338
    Sounds like you might be using degrees instead of radians. If you're using a _rotation property to initialize your angle, it should look like this:
    Code:
    angle = char.arm._rotation * Math.PI/180;

  9. #9
    Junior Member
    Join Date
    Jul 2009
    Posts
    25
    sorry i went on vacation - i hope you're still there.
    my character rotation setting things are
    Code:
    char.onMouseMove = function(){
    var __x = _xmouse-this._x;
    var __y = _ymouse-this._y;
    angle=Math.atan2(__y,__x)*180/Math.PI;
    this._rotation = angle + 180;
    }
    not gonna lie - i have no idea what this is doing :/
    ok i get it all... but i dont get the "angle=" line

  10. #10
    Member
    Join Date
    Nov 2003
    Location
    Tennessee
    Posts
    49

    Smile

    Code:
    char.onMouseMove = function(){
    var __x = _xmouse-this._x;
    var __y = _ymouse-this._y;
    angle=Math.atan2(__y,__x)*180/Math.PI;
    this._rotation = angle + 180; //what is the "+180" for?
    }
    I made a few adjustments:
    Code:
    char.onMouseMove = function(){
    var rotX = _parent._xmouse-this._x;
    var rotY = _parent._ymouse-this._y;
    angle=Math.atan2(rotY,rotX)*180/Math.PI;
    this._rotation = angle;
    }
    My AS2/AS1 is a little rusty. AS3 is better, so I use that:
    Code:
    function updateAngle() {
    var rotX:Number = mouseX-char.x;
    var rotY:Number = mouseY-char.y;
    var angle:Number=Math.atan2(rotY,rotX)*180/Math.PI;
    char.rotation = angle;
    }
    The code isn't really much different, though, and if I wanted to keep the "this" style code, I would only need to call the target of the event listener. In my code example, however, I didn't bother to make it use a listener. Closer to what you currently have, though, you could put the code inside the char MovieClip, like so:
    Code:
    function updateAngle() {
    var rotX:Number = MovieClip(parent).mouseX-x;
    var rotY:Number = MovieClip(parent).mouseY-y;
    var angle:Number=Math.atan2(rotY,rotX)*180/Math.PI;
    rotation = angle;
    }
    I never really do that, though, so my syntax might have some small mistakes. I hope I helped. Good luck with your games.
    GetLives Arcade: Play games, nothing else.
    This site is nothing but Flash-powered games. If you're bored, try a few of them.

  11. #11
    Junior Member
    Join Date
    Jul 2009
    Posts
    25
    i'm sorry... my imcompetance is probably frustating you. first, the "+180" is because the character's starting rotation is 180. so i need that to turn him around. second, i tried the first thing - my code that you changed - and it only worked if i removed "parent.". then i tried the code that you gave me to put in the character itself and that didn't work either.

  12. #12
    Bacon-wrapped closures Nialsh's Avatar
    Join Date
    Dec 2003
    Location
    Houston!
    Posts
    338
    Quote Originally Posted by adamvan101 View Post
    sorry i went on vacation - i hope you're still there.
    my character rotation setting things are
    Code:
    char.onMouseMove = function(){
    var __x = _xmouse-this._x;
    var __y = _ymouse-this._y;
    angle=Math.atan2(__y,__x)*180/Math.PI;
    this._rotation = angle + 180;
    }
    not gonna lie - i have no idea what this is doing :/
    ok i get it all... but i dont get the "angle=" line
    This code already works right? What you need is the bullet initialization code.

    I think you're getting confused because I was talking about a variable named 'angle' but there's already one in your code serving a slightly different purpose.

    There are two ways to measure angles: degrees and radians. Radians are used by Flash's trig functions; degrees are used by Flash's _rotation property. The conversion factor between them is 2pi/360=pi/180, which is why that ratio keeps showing up.

    Let's define 'angle' in radians. Now all your stuff should work.
    Code:
    char.onMouseMove = function(){
    	var __x = _xmouse-this._x;
    	var __y = _ymouse-this._y;
    	angle=Math.atan2(__y,__x); //now in radians
    	this._rotation = angle*180/Math.PI + 180; //convert to degrees, turn 180
    }
    
    onMouseDown = function() {
    	b = attachMovie( ... ); //make bullet
    	b._x = char._x+L*Math.cos(angle);
    	b._y = char._y+L*Math.sin(angle);
    	b._rotation = char._rotation; //might add +180 or +/-90
    }

  13. #13
    Junior Member
    Join Date
    Jul 2009
    Posts
    25
    Wow thanks a lot for all your help. you've really done a lot and i totally appreiciate it. thanks again. it works now
    adamvan101

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  




Click Here to Expand Forum to Full Width

HTML5 Development Center