Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // bezier collision
- // by andre michelle
- // am@andre-michelle.com
- // http://www.extrajetzt.com
- Bezier = function ( mc , p0 , p1 , p2 ) {
- // draw //
- mc.moveTo ( p0.x , p0.y );
- mc.curveTo ( p1.x , p1.y , p2.x , p2.y );
- // getPoints //
- var t = 0;
- var steps = 20;
- var num = 0;
- var pts = [];
- while ( t <= 1 ) {
- var t1 = 1 - t;
- var t1_2 = t1 * t1;
- var t2 = t * t;
- var tt12 = 2 * t * t1;
- var x = t1_2 * p0.x + tt12 * p1.x + t2 * p2.x;
- var y = t1_2 * p0.y + tt12 * p1.y + t2 * p2.y;
- pts.push ( { x: x, y: y } );
- t += 1/steps;
- }
- this.pts = pts;
- }
- BallWorld = function () {
- var ball = this.ball = scene.attachMovie ( "ball" , "ball" , 1 , { _x: 50, _y: -200, vy: 0 } );
- var br = ball._height/2;
- var bezier = this.bezier = new Bezier ( scene , { x: scene.n0._x, y: scene.n0._y } , { x: scene.n1._x, y: scene.n1._y } , { x: scene.n2._x, y: scene.n2._y } );
- var obj = this;
- ball.render = function () {
- var bezier = obj.bezier;
- var pts = bezier.pts;
- if ( Key.isDown ( Key.RIGHT ) ) ball.vx += .1;
- if ( Key.isDown ( Key.LEFT ) ) ball.vx -= .1;
- var bx = this._x;
- var by = this._y;
- var bvx = ball.vx;
- var bvy = ball.vy;
- bvy += .2;
- bx += bvx;
- by += bvy;
- for ( var p = 0 ; p < pts.length - 1 ; p++ ) {
- var p0 = pts[p];
- var p1 = pts[p+1];
- var p0x = p0.x, p0y = p0.y, p1x = p1.x, p1y = p1.y;
- // get Angle //
- var dx = p0x - p1x;
- var dy = p0y - p1y;
- var angle = Math.atan2( dy , dx );
- var sin = Math.sin ( angle );
- var cos = Math.cos ( angle );
- // rotate p1 ( need only 'x' ) //
- var p1rx = dy * sin + dx * cos + p0x;
- // rotate ball //
- var px = p0x - bx;
- var py = p0y - by;
- var brx = py * sin + px * cos + p0x;
- var bry = py * cos - px * sin + p0y;
- var cp = ( bx - p0x ) * ( p1y - p0y ) - ( by - p0y ) * ( p1x - p0x );
- if ( bry > p0y - br && brx > p0x && brx < p1rx && cp > 0 ) {
- // calc new Vector //
- var vx = bvy * sin + bvx * cos;
- var vy = bvy * cos - bvx * sin;
- vy *= -.8;
- vx *= .98;
- var sin = Math.sin ( -angle );
- var cos = Math.cos ( -angle );
- bvx = vy * sin + vx * cos;
- bvy = vy * cos - vx * sin;
- // calc new Position //
- bry = p0y - br;
- dx = p0x - brx;
- dy = p0y - bry;
- bx = dy * sin + dx * cos + p0x;
- by = dy * cos - dx * sin + p0y;
- }
- }
- if ( bx < br - 200 ) bx = br - 200, bvx = -bvx;
- if ( bx > 200 - br ) bx = 200 - br, bvx = -bvx;
- ball._x = bx;
- ball._y = by;
- ball.vx = bvx;
- ball.vy = bvy;
- if ( ball._y > 200 + br ) ball._y = -200, ball._x = 0, ball.vy = ball.vx = 0;
- }
- ball.onEnterFrame = function () { this.render () };
- }
- scene.lineStyle ( 0 , 0xffcc00 );
- var XJ = new BallWorld ();
- // dragging the anchor and control points //
- // -------------------------------------- //
- scene.n0.onPress = scene.n1.onPress = scene.n2.onPress = function () {
- delete XJ.ball.onEnterFrame;
- this.onEnterFrame = function () {
- this._x = scene._xmouse;
- this._y = scene._ymouse;
- scene.clear ();
- scene.lineStyle ( 0 , 0xffcc00 );
- XJ.bezier = new Bezier ( scene , { x: scene.n0._x, y: scene.n0._y } , { x: scene.n1._x, y: scene.n1._y } , { x: scene.n2._x, y: scene.n2._y } );
- XJ.ball.render ();
- }
- this.onRelease = this.onReleaseOutside = function () {
- XJ.ball.onEnterFrame = function () { XJ.ball.render () };
- delete this.onEnterFrame;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement