发新话题
打印

[求救] 关于复制mc的中级问题,相信也能帮到大家!!编辑了传了文件

关于复制mc的中级问题,相信也能帮到大家!!编辑了传了文件

首先是先说下我要实现的效果(在网吧写的,下了个flash8,编辑了,传了文件)

就是我要复制很多mc到场景中,然后让这些mc做位移。然后我又可以复制mc在我鼠标点击的地方。当让他们碰撞的时候改变在动态变量的值。我可以做到,但是现在却出现了很严重的问题,让我搞不明白。

1,我用attachMovie复制了10个mc到场景中(每1秒左右时间复制一个,在一个固定的地点)
帧速为60,库里有linkage是"enemy"的mc,主场景的帧里,代码如下::
tim=0;
depth=100;
onEnterFrame=function(){
  tim+=1;
  if(tim>=100){
  tim=0;
  }
  if(tim==0 and depth<=110){
    _root.attachMovie("enemy","enemy"+depth,depth++);
    _root["enemy"+depth]._y=200;
}//每次tim等于0的时候复制一个新enemy,共复制10个
}
测试没问题,但是问题出来了!!
我如果这样写:
  if(tim==0 and depth<=110){
    _root.attachMovie("enemy","enemy"+depth,depth++);
    _root["enemy"+depth]._y=200;
      _root["enemy"+depth]._x+=1;//问题关键
}
可以复制,也可以x方向移动,但是当新的"enemy"复制出来以后,前一个就停止不动了,怎么保持前面的mc也继续移动?当然我可以解决这个问题,就是  _root["enemy"+depth]._x+=1;不在这里写,在库里enemy里帧上写:
onEnterFrame=function(){
   this._x+=1;
}
这样实现了新复制的mc不会造成前一个复制mc停止,又可以实现都在移动,但是这样的话代码就很不方便维护和访问!
我想继续在主场景的帧里该怎样写?!还有就是我没有明白按上面的方法写,为什么新的"enemy复制出来后前面的"enemy"就不动了?!

/陆续还有问题,我先提交了,真的很茫然,求高手赐教!
复制问题.swf (3.42 KB)
复制问题.fla (32 KB)

[ 本帖最后由 qiangxiao 于 2008-4-4 22:02 编辑 ]

TOP

复制内容到剪贴板
代码:

if (tim == 0 and depth<=110) {
  _root.attachMovie("enemy", "enemy"+depth, depth++);
  _root["enemy"+depth]._y = 200;
  _root["enemy"+depth].onEnterFrame=function(){
   this._x+=1
  }
}

TOP

楼主每秒复制1个,没有必要用 tim加100次记时啊,可以用setInterval()我觉得更恰当
要让每个复制出来的MC都移动,可以各自创建onEnterFrame事件驱动自己的X坐标变化,也可在主时间轴的onEnterFrame事件中用for循环,让生成的所有MC位移
用AS3写了一下:
复制内容到剪贴板
代码:
package {
import flash.display.Sprite;
import flash.events.Event;
import flash.utils.Timer;
import flash.events.TimerEvent;
public class SampleCopy extends Sprite {
  private var T:Timer;
  public function SampleCopy():void {
   T=new Timer(1000,10);
   init();
  }
  private function init():void {
   T.addEventListener(TimerEvent.TIMER ,createNew);
   T.start();
  }
  private function createNew(_evt:TimerEvent ):void {
   var _sprite:Sprite=new Sprite;
   _sprite.graphics.beginFill(0x00ff00+T.currentCount *0x33);
   _sprite.graphics.drawRect(0,0,100,80);
   _sprite.graphics.endFill();
   _sprite.addEventListener(Event.ENTER_FRAME ,spriteMove);
   addChild(_sprite);
  }
  private function spriteMove(_evt:Event ):void {
   var _sprite:Sprite=_evt.target as Sprite;
   _sprite.x>=stage.width?_sprite.x=-_sprite.width :_sprite.x+=8;
  }
}
}

附件

duptest.fla (48 KB)

2008-4-4 20:47, 下载次数: 27

duptest.swf (635 Bytes)

2008-4-4 20:47, 下载次数: 35

SampleCopy.as (883 Bytes)

2008-4-4 20:47, 下载次数: 23

TOP

继续问题讨论(重新编辑了下,代码可以拷贝)

我在鼠标点击的地方同样复制另一个库里linkage为"hot"的mc,然后如果"enemy”碰到"hot"后,改变动态文本"num"的值,主场景代码如下:

tim=0;
num=0;
depth=100;
depthhot=0;
onEnterFrame=function(){
  tim+=1;
  if(tim>=100){
  tim=0;
  }
  if(tim==0 and depth<=110){
    _root.attachMovie("enemy","enemy"+depth,depth++);
    _root["enemy"+depth]._y=200;
   _root["enemy"+depth].onEnterFrame=function(){
   this._x+=1;
  }
}//每次tim等于0的时候复制一个新enemy,共复制10个
_root.onMouseDown=function(){
   _root.attachMovie("hot","hot"+depthhot,depthhot++);
  _root["hot"+depthhot]._x=_xmouse;
  _root["hot"+depthhot]._y=_ymouse;
}
  if(_root["enemy"+depth].hitTest(_root["hot"+depthhot])){
  num+=1;
  }
}


测试可以鼠标点击复制"hot",而且"enemy"碰到"hot"的时候"num也在不断+1,但是同样的问题又出现了,而且更严重!就是我只点鼠标复制一个的时候,碰撞检测只存在与新的"enemy"和这个"hot"之间,如果我点击鼠标再复制一个"hot",同样的问题前一个"hot"的碰撞就完全实效了!
碰撞也只在新复制的"hot"和新复制的"enemy"之间,求教大家,这到底是为什么?该怎么解决?
我想实现最开始所实现的效果该怎么做?就是“如果复制出来的敌人(enemy)碰到我点鼠标复制出来的热区(hot),num会+1”必须要每个复制的enemy和每个hot碰撞都有效!

谢谢大家!这个问题在实际应用中很重要,欢迎指导和交流

[ 本帖最后由 qiangxiao 于 2008-4-4 21:49 编辑 ]

TOP

谢谢大家的指导,我在网吧临时写的!!可能代码会有疏漏的地方!不过相信会看明白我的意思,楼上给的指导我先看下~~先谢谢!还有我跟贴的问题,可能也是这个问题

TOP

先谢谢版主,你用as3写的~我无法应用啊~~还是能用as2的指导下,as3还在学习中,我想先解决as2的这个问题,不管有没有必要,我想把手里的一个东西先做完

TOP

谢谢objectkuan,能这样写的~~想起来了,最近脑子不够用

TOP

看到BZ的提示也有所启发,就冒昧改进一下...
不知道这样实现好不好,有没有违背约定的地方,等等呢
&:BZ的OOP太强悍了....
复制内容到剪贴板
代码:

var depth = 100;
var num = 0;
var depthhot = 0;
function myFunction() {
if (depth>=110) {
  clearInterval(myInterval);
}
_root.attachMovie("enemy", "enemy"+depth, depth++);
_root["enemy"+depth]._y = 200;
_root["enemy"+depth].onEnterFrame = function() {
  this._x += 1;
};
}
myInterval = setInterval(myFunction, 3000);
_root.onMouseDown = function() {
_root.attachMovie("hot", "hot"+depthhot, depthhot++);
_root["hot"+depthhot]._x = _xmouse;
_root["hot"+depthhot]._y = _ymouse;
_root["hot"+depthhot].onEnterFrame = function() {
  for (var i = 100; i<=110; i++) {//总觉得这里好像有点耗,不知道可不可以解决呢...
   if (this.hitTest(_root["enemy"+i])) {
    num += 1;
    //trace(num);
   }
  }
};
};
[ 本帖最后由 objectkuan 于 2008-4-4 21:51 编辑 ]

TOP

原来有错的地方~我编辑了下~~现在问题中的代码可以直接拷贝了

TOP

原因在于每次创建一个enemy之后depth的值就更新了,然后每次创建的hot固然是判断与它创建时刻depth的值所对应的enemy

TOP

谢谢objectkuan,也谢谢以上达人,此问题已解决!

TOP

objectkuan,那个for循环确实有点耗,可能有更好的方法,我回家再想了,不过解决了每个都能碰撞,我把hitTest写到库里"hot"mc帧的onEnterFrame事件里吧~可能比for循环效率高点。主场景指定一个容器

mov=_root["enemy"+depth].onEnterFrame = function() {
  this._x += 1;
};

然后在库里hot mc的场景帧上写:
onEnterFrame = function() {
   if (this.hitTest(_root.mov){
    num += 1;
   }
}

这样可以避免for循环

[ 本帖最后由 qiangxiao 于 2008-4-4 22:34 编辑 ]

TOP

哦哈

TOP

发新话题