带有数组、循环和 if 语句的 hitTestObject
hitTestObject with arrays, loops and if statements
我在香蕉后面有小兵 运行,它由方向键控制。我还有一个生命条,我会根据小兵是否掉落香蕉来记录它。我现在遇到的问题是,当香蕉(来自阵列)落地时,我的生命条完全下降。我希望随着每根香蕉落地,逐渐 减少。我尝试使用调度事件,但它不起作用。
这是我在主程序中的内容:
import flash.display.MovieClip;
import flash.events.KeyboardEvent;
import flash.events.Event;
var leftKey:Boolean;
var rightKey:Boolean;
var upKey:Boolean;
var downKey:Boolean;
var jump:Boolean = false;
var xvelocity:int = 9;
var yvelocity:int = 3;
var gravity:Number = 7;
stage.addEventListener(Event.ENTER_FRAME, changeVelocity);
stage.addEventListener(KeyboardEvent.KEY_UP, checkKeyUp);
stage.addEventListener(KeyboardEvent.KEY_DOWN, checkKeyDown);
function changeVelocity(evt:Event){
moveMinion();
yvelocity += gravity;
}
function moveMinion(){
if (leftKey == true){
sideMinion.x -= xvelocity;
sideMinion.left();
}
if (rightKey == true){
sideMinion.x += xvelocity;
sideMinion.right();
}
}
function checkKeyDown(e:KeyboardEvent){
if (e.keyCode == Keyboard.LEFT){
leftKey = true;
}
else if (e.keyCode == Keyboard.RIGHT){
rightKey = true;
}
}
function checkKeyUp(e:KeyboardEvent){
if (e.keyCode == Keyboard.LEFT){
leftKey = false;
}
else if (e.keyCode == Keyboard.RIGHT){
rightKey = false;
}
}
btnStart.addEventListener(MouseEvent.CLICK, makeItFall);
function makeItFall(e:MouseEvent){
var numBananas = 6;
var theBananas: Array = new Array();
theBananas = [];
for (var i = 0; i < numBananas; i++) {
var aBanana: banana = new banana();
theBananas.push(aBanana);
btnStart.visible=false;
aBanana.y=100;
theBananas[i].setSpot(Math.random()*450,Math.random()*200);
theBananas[i].setSpeed((Math.random()), 1);
stage.addChild(aBanana);
}
var health: Number= 100;
var healthPercent: Number= 1;
var lives:Event= new Event("lifeDrops")
addEventListener(Event.ENTER_FRAME, pickUpBananas);
function pickUpBananas(event:Event){
for (var i:int = theBananas.length-1; i>-1; i--){
if (sideMinion.hitTestObject(theBananas[i])){
stage.removeChild(theBananas[i]);
theBananas.splice(i,1);
}
if (info.hitTestObject(theBananas[i])){
dispatchEvent(lives);
health=health-10;
healthPercent=health/100;
trace(healthPercent);
life.scaleX= healthPercent;
text.text=String(health);
}
if (health<0){
gotoAndStop(5);
}
}
}
}
stop();
在香蕉里class:
package {
import flash.display.MovieClip;
import flash.utils.Timer;
import flash.events.TimerEvent;
import flash.events.MouseEvent;
import flash.events.Event;
import flash.events.Event;
public class banana extends MovieClip {
var velX: Number = 0;
var velY: Number = 0;
var falling: Boolean = false;
var gravity: Number = 2;
public function banana() {
var timing: Timer = new Timer(25, 0);
timing.addEventListener(TimerEvent.TIMER, moveMe);
timing.start();
}
private function moveMe(event: TimerEvent)
{
x += velX;
y += velY;
if (falling) velY += gravity;
/* trace("[BANANA] position:", x, y, "speed:", velX, velY);*/
}
public function setSpeed(dx,dy) {
velX = dx;
velY = dy;
}
public function setSpot(atX,atY){
this.x=atX;
this.y=atY;
}
public function makeItFall (){
falling=true;
}
}
}
您的 pickUpBananas
函数运行每一帧并检查每个香蕉是否接触到地面。因此,如果香蕉击中,它将减少该帧和每个后续帧的生命值,直到它不再接触地面。
您需要采取一些措施来防止同一根香蕉在后续帧中反复耗尽生命值。
具体的解决方案将取决于您希望游戏如何运行。您可以立即重置它的位置,使其不再接触地面,但您可能希望它留在地面上(或者至少在消失前淡出)。在这种情况下,您可以在香蕉上设置一个标志,表明它已经被计算过,因此不会被再次计算。如果你重新放下那个香蕉,记得清除那个标志。
您只是未能使用从数组中删除香蕉。它需要从数组中删除,否则它将继续检查香蕉是否击中了 info
,它将会是。
theBananas.removeAt(i); //works with most recent flash players and Adobe air
或
theBananas.splice(1,i); // works with all players and Adobe air versions
这两种方法做同样的事情,但 removeAt
更快一些,也更容易输入。
当然,您可以将此代码与块的其余部分放在 info.hitTest 中,例如,它可以直接放在 text.text=String(health);
下面
我也会继续用 theBananas[i].parent.removeChild(theBananas[i];
把那个香蕉从舞台上拿下来。当然,这需要在 将其从数组中删除之前完成。
希望对您有所帮助。
编辑:@Cadin 的回答完全正确。如何让香蕉停止触发 hitTest 取决于您希望它的外观和工作方式。我的回答只是其中一种方法。
我在香蕉后面有小兵 运行,它由方向键控制。我还有一个生命条,我会根据小兵是否掉落香蕉来记录它。我现在遇到的问题是,当香蕉(来自阵列)落地时,我的生命条完全下降。我希望随着每根香蕉落地,逐渐 减少。我尝试使用调度事件,但它不起作用。
这是我在主程序中的内容:
import flash.display.MovieClip;
import flash.events.KeyboardEvent;
import flash.events.Event;
var leftKey:Boolean;
var rightKey:Boolean;
var upKey:Boolean;
var downKey:Boolean;
var jump:Boolean = false;
var xvelocity:int = 9;
var yvelocity:int = 3;
var gravity:Number = 7;
stage.addEventListener(Event.ENTER_FRAME, changeVelocity);
stage.addEventListener(KeyboardEvent.KEY_UP, checkKeyUp);
stage.addEventListener(KeyboardEvent.KEY_DOWN, checkKeyDown);
function changeVelocity(evt:Event){
moveMinion();
yvelocity += gravity;
}
function moveMinion(){
if (leftKey == true){
sideMinion.x -= xvelocity;
sideMinion.left();
}
if (rightKey == true){
sideMinion.x += xvelocity;
sideMinion.right();
}
}
function checkKeyDown(e:KeyboardEvent){
if (e.keyCode == Keyboard.LEFT){
leftKey = true;
}
else if (e.keyCode == Keyboard.RIGHT){
rightKey = true;
}
}
function checkKeyUp(e:KeyboardEvent){
if (e.keyCode == Keyboard.LEFT){
leftKey = false;
}
else if (e.keyCode == Keyboard.RIGHT){
rightKey = false;
}
}
btnStart.addEventListener(MouseEvent.CLICK, makeItFall);
function makeItFall(e:MouseEvent){
var numBananas = 6;
var theBananas: Array = new Array();
theBananas = [];
for (var i = 0; i < numBananas; i++) {
var aBanana: banana = new banana();
theBananas.push(aBanana);
btnStart.visible=false;
aBanana.y=100;
theBananas[i].setSpot(Math.random()*450,Math.random()*200);
theBananas[i].setSpeed((Math.random()), 1);
stage.addChild(aBanana);
}
var health: Number= 100;
var healthPercent: Number= 1;
var lives:Event= new Event("lifeDrops")
addEventListener(Event.ENTER_FRAME, pickUpBananas);
function pickUpBananas(event:Event){
for (var i:int = theBananas.length-1; i>-1; i--){
if (sideMinion.hitTestObject(theBananas[i])){
stage.removeChild(theBananas[i]);
theBananas.splice(i,1);
}
if (info.hitTestObject(theBananas[i])){
dispatchEvent(lives);
health=health-10;
healthPercent=health/100;
trace(healthPercent);
life.scaleX= healthPercent;
text.text=String(health);
}
if (health<0){
gotoAndStop(5);
}
}
}
}
stop();
在香蕉里class:
package {
import flash.display.MovieClip;
import flash.utils.Timer;
import flash.events.TimerEvent;
import flash.events.MouseEvent;
import flash.events.Event;
import flash.events.Event;
public class banana extends MovieClip {
var velX: Number = 0;
var velY: Number = 0;
var falling: Boolean = false;
var gravity: Number = 2;
public function banana() {
var timing: Timer = new Timer(25, 0);
timing.addEventListener(TimerEvent.TIMER, moveMe);
timing.start();
}
private function moveMe(event: TimerEvent)
{
x += velX;
y += velY;
if (falling) velY += gravity;
/* trace("[BANANA] position:", x, y, "speed:", velX, velY);*/
}
public function setSpeed(dx,dy) {
velX = dx;
velY = dy;
}
public function setSpot(atX,atY){
this.x=atX;
this.y=atY;
}
public function makeItFall (){
falling=true;
}
}
}
您的 pickUpBananas
函数运行每一帧并检查每个香蕉是否接触到地面。因此,如果香蕉击中,它将减少该帧和每个后续帧的生命值,直到它不再接触地面。
您需要采取一些措施来防止同一根香蕉在后续帧中反复耗尽生命值。
具体的解决方案将取决于您希望游戏如何运行。您可以立即重置它的位置,使其不再接触地面,但您可能希望它留在地面上(或者至少在消失前淡出)。在这种情况下,您可以在香蕉上设置一个标志,表明它已经被计算过,因此不会被再次计算。如果你重新放下那个香蕉,记得清除那个标志。
您只是未能使用从数组中删除香蕉。它需要从数组中删除,否则它将继续检查香蕉是否击中了 info
,它将会是。
theBananas.removeAt(i); //works with most recent flash players and Adobe air
或
theBananas.splice(1,i); // works with all players and Adobe air versions
这两种方法做同样的事情,但 removeAt
更快一些,也更容易输入。
当然,您可以将此代码与块的其余部分放在 info.hitTest 中,例如,它可以直接放在 text.text=String(health);
我也会继续用 theBananas[i].parent.removeChild(theBananas[i];
把那个香蕉从舞台上拿下来。当然,这需要在 将其从数组中删除之前完成。
希望对您有所帮助。
编辑:@Cadin 的回答完全正确。如何让香蕉停止触发 hitTest 取决于您希望它的外观和工作方式。我的回答只是其中一种方法。