主题:  比较有意思,所以再问关于子弹连发的问题!

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的这个版块没有我想象的那么活跃,全靠地狱天堂在这里撑着了~回帖及时,不错地说!