我有这个让球反弹的代码,但是我要找的是从地面射出子弹,一旦他们击球,就应该向上弹回。目标不是让球击中地面。我确信之前已经完成了,但我觉得我太愚蠢了。
守则:
package {
public class ball extends MovieClip {
var timer:Number=0;
var initialPos:Number=0;
var finalPos:Number=0;
var currentPos:Number=0;
var initialSpeed:Number=0;
function ball() {
startFallingBall();
}
function moveBallDown(e:Event) {
timer+=1;
this.y = initialPos + .5 *(timer * timer);
checkBottomBoundary();
}
function moveBallUp(e:Event) {
timer+=1;
var posA=this.y;
this.y = currentPos - initialSpeed*timer + .5*(timer * timer);
var posB=this.y;
checkTopBoundary(posA, posB);
}
function checkBottomBoundary() {
if (this.y+this.height>stage.stageHeight) {
finalPos=this.y;
stopFallingBall();
}
}
function checkTopBoundary(firstPos:Number, secondPos:Number) {
if (secondPos>firstPos) {
stopRisingBall();
startFallingBall();
}
}
function startFallingBall() {
timer=0;
initialPos=this.y;
this.addEventListener(Event.ENTER_FRAME, moveBallDown);
}
function stopFallingBall() {
this.removeEventListener(Event.ENTER_FRAME, moveBallDown);
if (finalPos-initialPos<.1*this.height) {
stopRisingBall();
} else {
startRisingBall();
}
}
function startRisingBall() {
initialSpeed=Math.sqrt(Math.abs(finalPos-initialPos));
timer=0;
currentPos=this.y;
this.addEventListener(Event.ENTER_FRAME, moveBallUp);
}
function stopRisingBall() {
this.removeEventListener(Event.ENTER_FRAME, moveBallUp);
}
function stopEverything() {
this.removeEventListener(Event.ENTER_FRAME, moveBallUp);
this.removeEventListener(Event.ENTER_FRAME, moveBallDown);
}
}
}
答案 0 :(得分:1)
一种简单的方法是使用DisplayObject的hitTestObject。这会检查重叠。你当然可以自己写一些更高级的东西。
对于每个游戏更新,你检查是否有任何子弹击中球,并采取行动,如果他们这样做。您还应该考虑分离游戏逻辑和显示更新。考虑使用Timer。
package {
public class BallGame extends Sprite
{
private var ball:Ball;
private var bullets:Array;
public function BallGame() {
addEventListener(Event.ENTER_FRAME, checkCollision);
addEventListener(MouseEvent.CLICK, fireBullet);
}
private function fireBullet(e:MouseEvent):void {
// adds a fired bullet to an array so we can loop over all bullets
bullets.push(new Bullet());
}
private function checkCollision(e:Event):void {
// loops through all bullets in play
for each(var bullet:Bullet in bullets) {
// check if the bullet is inside the ball
if (ball.hitTestObject(bullet)) {
// the bullet hit the ball
ball.startRisingBall();
// TODO: remove the bullet :)
}
}
}
}
}
答案 1 :(得分:0)
有一个预先形成hittest的功能,你可以在这里阅读: http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/display/DisplayObject.html#hitTestObject()
如果你知道半径,如果中心之间的距离小于它们的半径之和,那么用圆圈就很容易了。他们互相接触。
但是通过查看你的代码,你应该正确地重写整个事情。球真的不应该在内部处理碰撞和运动逻辑。它应该只有一个位置和速度向量,运动和分离逻辑应该在其他类中。
至于反应代码,取决于你想要的复杂程度。可以简单地将速度向量的y部分翻转到相当复杂的数学中。
在这个领域有很多有关的东西和例子,我认为你最好在谷歌上找一些并玩它。然后自己写。