|
主题: 比较有意思,所以再问关于子弹连发的问题!
|
 fx8118
职务:普通成员
等级:1
金币:0.0
发贴:78
注册:2003/1/7 1:17:20
|
#12004/9/9 16:58:06
另外连续单击按钮,连发的子弹前面的不会消失但会停下来,只有等前面的子弹完全停止下来后面的才正常,麻烦各位高手解释一下!另外子弹的速度会越来越快,这有是什么原因? on (press) { speed=20; fire = fire+1; duplicateMovieClip("_root.shot", "shot"+fire, fire); eval("_root.shot"+fire)._x = this._x; eval("_root.shot"+fire)._y = this._y; eval("_root.shot"+fire).onEnterFrame = function() { speed=speed*0.99; eval("_root.shot"+fire)._y = eval("_root.shot"+fire)._y-speed; }; }
|
 wiyiflash
职务:普通成员
等级:1
金币:0.0
发贴:15
注册:2002/5/26 17:49:05
|
#22004/9/9 19:37:57
首先问你:你发布的版本是7.0吗?
问题: 1.为什么不用var speed=20 ?
2.fire为什么不初始化?
3.如果改成这样:var mc=_root.shot.duplicateMovieClip("shot"+fire,fire); 以后的操作直接:mc._x=this._x 等等,将提高程序运行效率,因为不必每次都用eval运算求影片对象了.
4.没看到你的代码里有控制子弹消失的代码呀!
说两句:这个版块好冷清呀~
|
 fx8118
职务:普通成员
等级:1
金币:0.0
发贴:78
注册:2003/1/7 1:17:20
|
#32004/9/9 22:02:20
大大说的是,只是我也是参考别人的代码,你说的都不是问题的重点。想实现枪发射子弹命中同一目标!以上代码的确问题不少,我发现的这二个问题自己无法解决,只好求助于高手了,呵呵!!
|
 UndeadCraft
职务:版主
等级:4
金币:10.0
发贴:1993
注册:2001/5/28 17:37:43
|
#42004/9/10 9:00:28
随便改了一下,顺便说一下,我喜欢用attachMovie,不喜欢duplicateMovieClip 
var fire = 1;
myshot.onPress = function() {
fire = fire+1;
duplicateMovieClip("_root.shot", "shot"+fire, fire);
trace("shot"+fire);
eval("_root.shot"+fire)._x = this._x;
eval("_root.shot"+fire)._y = this._y;
eval("_root.shot"+fire).speed = 20;
eval("_root.shot"+fire).onEnterFrame = function() {
this.speed = this.speed*0.99;
this._y = this._y-this.speed;
if (this._y<0) {
removeMovieClip(this);
}
};
};
|
 fx8118
职务:普通成员
等级:1
金币:0.0
发贴:78
注册:2003/1/7 1:17:20
|
#52004/9/11 11:36:43
大大的程序改的非常正确,谢谢!只是有几点迷惑,还希望指教!为何必须用this._y = this._y-this.speed; 而eval("_root.shot"+fire)._y = eval("_root.shot"+fire)._y-this.speed;就不对了(本机测试),难道他们不一样吗!? 再者必须用this.speed而不是speed,我测试的时候用speed开始正常,当小球多的时候就又出现停止不前的问题? 希望楼上的地狱天堂兄指正,也欢迎其他高手发表高见!谢谢
|
 wiyiflash
职务:普通成员
等级:1
金币:0.0
发贴:15
注册:2002/5/26 17:49:05
|
#62004/9/11 12:42:50
我问你用的什么版本,是因为Flash不同版本对undefined的处理是不同,在flash7里fire不初始化是不能正常运行的。具体可以看我论坛的讨论专题。现在说说为什么用speed,子弹多了就停止不前的问题。
speed=20;//速度初始化为20 ... eval("_root.shot"+fire).onEnterFrame = function() { speed=speed*0.99;//注意:这里修改的speed是前面定义的speed,每个子弹都会不停修改外部的speed,直至speed的值极小极小,最后speed的值会接近0.
eval("_root.shot"+fire)._y = eval("_root.shot"+fire)._y-speed;//所以子弹的_y值改变量会很快接近于0,即子弹多了就停止不前了。 };
地狱天堂修改后:
eval("_root.shot"+fire).speed = 20;//每个子弹都有自己的speed属性 eval("_root.shot"+fire).onEnterFrame = function() { this.speed = this.speed*0.99;//所以这里修改的是每个子弹自己的speed属性。 this._y = this._y-this.speed;//子弹会越来越慢,但不会影响其他子弹的运行速度. if (this._y<0) { removeMovieClip(this); } };
这个问题涉及到了局部变量的使用,我的论坛也有专门的讨论。
至于"为何必须用this._y = this._y-this.speed; 而eval("_root.shot"+fire)._y = eval("_root.shot"+fire)._y-this.speed;就不对了", 我觉得它们只有执行效率的差别,执行结果应该是相同的。你检查检查其他地方有什么不对吧。
|
 fx8118
职务:普通成员
等级:1
金币:0.0
发贴:78
注册:2003/1/7 1:17:20
|
#72004/9/11 22:53:40
谢谢楼上兄弟的指正,谢谢!!
|
 UndeadCraft
职务:版主
等级:4
金币:10.0
发贴:1993
注册:2001/5/28 17:37:43
|
#82004/9/13 8:49:40
wiyiflash在上个帖子中说 引用: 至于"为何必须用this._y = this._y-this.speed; 而eval("_root.shot"+fire)._y = eval("_root.shot"+fire)._y-this.speed;就不对了", 我觉得它们只有执行效率的差别,执行结果应该是相同的。你检查检查其他地方有什么不对吧。
至于"为何必须用this._y = this._y-this.speed; 而eval("_root.shot"+fire)._y = eval("_root.shot"+fire)._y-this.speed;就不对了", 我觉得它们只有执行效率的差别,执行结果应该是相同的。你检查检查其他地方有什么不对吧。 不是效率的问题,这是两回事,eval("_root.shot"+fire)._y指向的最后发射的子弹,而this._y = this._y-this.speed则是指的自己.
|
 wiyiflash
职务:普通成员
等级:1
金币:0.0
发贴:15
注册:2002/5/26 17:49:05
|
#92004/9/19 23:38:10
我指的是在这里起到的作用是一样的,其实最后发射的子弹也正好是它自己。 如果我是班里的最后一名,现在我说"我班最后一名受批评了",就和我说"我受批评了"是一回事。
|
 UndeadCraft
职务:版主
等级:4
金币:10.0
发贴:1993
注册:2001/5/28 17:37:43
|
#102004/9/20 9:06:22
起的作用是不一样的.
this._y = this._y-this.speed; 是作用在每一颗子弹上的,所以只能是自己控制自己.最后一颗也有最后一颗的this._y = this._y-this.speed; 和其它子弹没有任何关系.
|
 wiyiflash
职务:普通成员
等级:1
金币:0.0
发贴:15
注册:2002/5/26 17:49:05
|
#112004/9/20 17:48:59
对了,你说的"最后一颗"是指的那一颗?假设有20发子弹,每发子弹分别按顺序编号,现在假设我们第一次按下了扳机: -----------------------------------------
var fire = 1;//子弹编号初始化为1
myshot.onPress = function() {
fire = fire+1;//子弹编号设为 2
duplicateMovieClip("_root.shot", "shot"+fire, fire);//复制出子弹"_root.shot2"
trace("shot"+fire);
eval("_root.shot"+fire)._x = this._x;//设置子弹"_root.shot2"的_x值
eval("_root.shot"+fire)._y = this._y;//设置子弹"_root.shot2"的_y值
eval("_root.shot"+fire).speed = 20;//设置子弹"_root.shot2"的speed值
//定义子弹"_root.shot2"的onEnterFrame方法:
eval("_root.shot"+fire).onEnterFrame = function() {
this.speed = this.speed*0.99;//设置子弹自身的speed值为其当前speed值与0.99的乘积
this._y = this._y-this.speed;//设置子弹自身的_y值为其当前_y值与当前speed的差.
//注意!!!如果用下面的语法:
//eval("_root.shot"+fire)._y = eval("_root.shot"+fire)._y-this.speed;
//是完全行得通的,因为eval("_root.shot"+fire)在此时正是指向当前的子弹,即子弹"_root.shot2",而this在此时也是指向"_root.shot2"
if (this._y<0) {
removeMovieClip(this);
}
};
};
所以,我理解的你说的"最后一颗子弹"应该是指"最后一次发出的子弹",而不是仅指"最后编号的一颗子弹“吧?如果是这样的话,那么两种写法起的作用是一样的,不过后种写法拐了个弯,执行效率低些。
|
 UndeadCraft
职务:版主
等级:4
金币:10.0
发贴:1993
注册:2001/5/28 17:37:43
|
#122004/9/20 19:43:20
错了,如果连按两次,第一颗子弹没消失之前,那么在第二颗子弹射出的时候,第一颗子弹的 //eval("_root.shot"+fire)._y = eval("_root.shot"+fire)._y-this.speed; 就会指向第二颗. 还不明?
|
 fx8118
职务:普通成员
等级:1
金币:0.0
发贴:78
注册:2003/1/7 1:17:20
|
#132004/9/20 22:33:53
地狱天堂兄说的不错,的确这样!
|
 wiyiflash
职务:普通成员
等级:1
金币:0.0
发贴:15
注册:2002/5/26 17:49:05
|
#142004/9/21 1:43:48
哈哈,明白了明白了!我错了  忘了这个onEnterFrame会不断的执行,当fire值改变后,它就会出错了.谢谢!!! 地狱天堂,早先去你的blog看了,顺便转了几个帖子
|
 wiyiflash
职务:普通成员
等级:1
金币:0.0
发贴:15
注册:2002/5/26 17:49:05
|
#152004/9/21 1:46:00
5d的这个版块没有我想象的那么活跃,全靠地狱天堂在这里撑着了~回帖及时,不错地说!
|