[转]机器人玩球程序

[url]
https://github.com/kinglong/as3lib/blob/master/com/klstudio/test/PlayBall.as
[/url]

package com.klstudio.test {
import flash.geom.Point;
import flash.events.Event;
import flash.display.Sprite;

/**
* PlayBall
* @author Kinglong(kinglong@gmail.com)
* @since:2010-11-26
*/
public class PlayBall extends Sprite {
private var _maxWidth : Number;
private var _maxHeight : Number;
private var _ball : Ball;
private var _numSegments : uint = 4;
private var _leftPlayer : Array;
private var _rightPlayer : Array;
/**
* 重力系数
*/
public var gravity : Number = 0.5;
/**
* 反弹力系数
*/
public var bounce : Number = -0.9;

public function PlayBall(maxWidth : Number = 0, maxHeight : Number = 0) {
mouseEnabled = mouseChildren = false;
if (maxHeight > 0 && maxWidth > 0) {
_maxWidth = maxWidth;
_maxHeight = maxHeight;
} else {
_maxWidth = stage.stageWidth;
_maxHeight = stage.stageHeight;
}
init();
}

private function init() : void {
_ball = new Ball(20);
_ball.vx = 10;
addChild(_ball);
_leftPlayer = getPlayer();
_leftPlayer[_numSegments - 1].x = _maxWidth / 8;
_leftPlayer[_numSegments - 1].y = _maxHeight;
_rightPlayer = getPlayer();
_rightPlayer[_numSegments - 1].x = _maxWidth / 8 * 7;
_rightPlayer[_numSegments - 1].y = _maxHeight;

addEventListener(Event.ENTER_FRAME, enterFrameHandler);
}

private function getPlayer() : Array {
var arr : Array = [];
for (var i : uint = 0;i < _numSegments;i++) {
var segment : Segment = new Segment(i * 5 + 35, 10);
addChild(segment);
arr.push(segment);
}
return arr;
}

private function enterFrameHandler(event : Event) : void {
moveBall();
movePlayer(_leftPlayer);
movePlayer(_rightPlayer);

checkHit(_leftPlayer, Math.random() * 3 + 1);
checkHit(_rightPlayer, Math.random() * -3 - 1);
}

private function reach(segment : Segment, xpos : Number, ypos : Number) : Point {
var dx : Number = xpos - segment.x;
var dy : Number = ypos - segment.y;
var angle : Number = Math.atan2(dy, dx);
segment.rotation = angle * 180 / Math.PI;

var w : Number = segment.originPoint.x - segment.x;
var h : Number = segment.originPoint.y - segment.y;
var tx : Number = xpos - w;
var ty : Number = ypos - h;
return new Point(tx, ty);
}

private function position(segmentA : Segment, segmentB : Segment) : void {
segmentA.x = segmentB.originPoint.x;
segmentA.y = segmentB.originPoint.y;
}

private function movePlayer(segments : Array) : void {
var target : Point = reach(segments[0], _ball.x, _ball.y);
for (var i : uint = 1; i < _numSegments; i++) {
var segment : Segment = segments[i];
target = reach(segment, target.x, target.y);
}
for (i = _numSegments - 1; i > 0; i--) {
var segmentA : Segment = segments[i];
var segmentB : Segment = segments[i - 1];
position(segmentB, segmentA);
}
}

private function moveBall() : void {
_ball.vy += gravity;
_ball.x += _ball.vx;
_ball.y += _ball.vy;
if (_ball.x + _ball.radius > _maxWidth) {
_ball.x = _maxWidth - _ball.radius;
_ball.vx *= bounce;
} else if (_ball.x - _ball.radius < 0) {
_ball.x = _ball.radius;
_ball.vx *= bounce;
}
if (_ball.y + _ball.radius > _maxHeight) {
_ball.y = _maxHeight - _ball.radius;
_ball.vy *= bounce;
} else if (_ball.y - _ball.radius < 0) {
_ball.y = _ball.radius;
_ball.vy *= bounce;
}
}

public function checkHit(segments : Array, vx : int) : void {
var segment : Segment = segments[0];
var dx : Number = segment.originPoint.x - _ball.x;
var dy : Number = segment.originPoint.y - _ball.y;
var dist : Number = Math.sqrt(dx * dx + dy * dy);
if (dist < _ball.radius) {
_ball.vx += vx;
_ball.vy -= Math.random() * 2 + 1;
}
}
}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值