Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Проблема с removeChild (http://www.flasher.ru/forum/showthread.php?t=206542)

Godwarlock 11.02.2014 00:18

Проблема с removeChild
 
Код AS3:

Constants.stageRef=stage;
    var igrok:player = new player;
    igrok.x = 200;
    igrok.y = 300;
    igrok.name = "player";
    stage.addChild(igrok);

Создаем новый объект igrok при помощи addChild

Когда я пытаюсь его удалить, после нажатия кнопки
Код AS3:

function onClicks(e:MouseEvent):void{
        if (currentFrame == 2)
        {
        removeChild(igrok);
    }

Выдает такую фигню
Цитата:

ArgumentError: Error #2025: Предоставленный DisplayObject должен быть дочерним элементом вызывающего объекта.
at flash.display::DisplayObjectContainer/removeChild()
at MethodInfo-9()
Где косяк? А то и так, и сяк попробовал, но что-то не выходит

Akopalipsis 11.02.2014 00:38

Вы добавили на stage -
Код AS3:

stage.addChild(igrok);

а удаляете с this -
Код AS3:

removeChild(igrok);

Не правильно, когда добавляешь на stage.

Добавлено через 1 минуту
В Вашем случаи лучше без указания места добавления, просто addChild(...);

Godwarlock 11.02.2014 00:52

Код AS3:

Constants.stageRef=stage;
    var igrok:player = new player;
    igrok.x = 200;
    igrok.y = 300;
    igrok.name = "player";
    addChild(igrok);

Код AS3:

function onClicks(e:MouseEvent):void{
        removeChild(igrok);
    }

Та же самая ошибка

belv 11.02.2014 00:57

А Ваш класс player от какого класса унаследован?
Например, если от спрайта, то так должно работать removeChild(Sprite(igrok));

Godwarlock 11.02.2014 00:59

Код AS3:

public class player extends MovieClip
 {

Код AS3:

removeChild(MovieClip(igrok));

Не прокатило

Akopalipsis 11.02.2014 01:02

А Вы это добавляете и удаляете в одном классе?

belv 11.02.2014 01:03

А классов много, может выложите?

Godwarlock 11.02.2014 01:08

Цитата:

Сообщение от Akopalipsis (Сообщение 1159465)
А Вы это добавляете и удаляете в одном классе?

Да. Вот
Код AS3:

package 
{
 
import flash.display.MovieClip;
import flash.events.MouseEvent;
import flash.text.TextField;
import flash.events.Event;
import flash.display.DisplayObject;
import flash.display.Stage;
 
public class Main extends MovieClip
 
{
 public var map:Array = [
            [1,1,1,1,1,1,1,1,1,1,1,1],
            [1,0,0,2,1,1,1,1,1,2,0,1],
            [1,0,0,0,1,1,1,1,1,0,0,1],
            [1,0,2,0,0,1,1,1,1,0,1,1],
            [1,0,1,0,0,0,1,2,0,0,0,0],
            [1,0,0,1,0,0,1,0,0,0,0,0],
            [1,1,1,1,0,0,1,0,0,1,1,1],
            [1,0,0,0,0,0,0,0,0,0,0,1],
            [1,1,1,1,1,1,1,1,1,1,1,1],
            ];
 
    public var size:uint = 50;
 
 public function Main()
 {
 
        btn.addEventListener(MouseEvent.CLICK, onClick); }
 
 private function onClick(e:MouseEvent):void{
 
    if (login.text =="login" && pass.text=="pass"){
        this.gotoAndStop(2);
 
        createvillage();
    }
 else
  {
  res.text = "Вы ввели неправильные данные";
        }
 }
 
  function createvillage()
      {
for (var i:uint=0; i<map.length; i++)
        {
  for (var j:uint=0; j<map[i].length; j++)
  {
          if (map[i][j] > 0)
          {
    var obj:village = new village;
    obj.x = j*size;
    obj.y = i*size;
    obj.gotoAndStop(map[i][j])
    addChild(obj);
 
    Constants.stageRef=stage;
    var igrok:player = new player;
    igrok.x = 200;
    igrok.y = 300;
    igrok.name = "player";
    addChild(igrok);
 
        var buts:button = new button;
        buts.x = 277;
        buts.y = 540;
        buts.name = "btns";
        addChild(buts);
        buts.addEventListener(MouseEvent.CLICK, onClicks);
 
 }
    function onClicks(e:MouseEvent):void{
        removeChild(MovieClip(igrok));
    }
        }
        }
        }
  }
 
}

Класс player

Код AS3:

package  {
        import flash.display.MovieClip;
        import flash.events.Event;
        import flash.events.KeyboardEvent;
        import flash.ui.Keyboard;
 
 
        public class player extends MovieClip
 {
 
  var left_press:Boolean;
  var up_press:Boolean;
  var right_press:Boolean;
  var down_press:Boolean;
  var _speed:uint;
 
                public function player()
                {
                        Constants.stageRef.addEventListener(KeyboardEvent.KEY_DOWN, keyDownListener);
            Constants.stageRef.addEventListener(KeyboardEvent.KEY_UP, keyUpListener);
            Constants.stageRef.addEventListener(Event.ENTER_FRAME, go);
                        _speed = 3;
                }
function keyDownListener (e:KeyboardEvent):void {
if (e.keyCode==65) left_press = true;
if (e.keyCode==87) up_press = true;
if (e.keyCode==68) right_press = true;
if (e.keyCode==83) down_press = true;
}
function keyUpListener(e:KeyboardEvent):void {
if (e.keyCode==65) left_press = false;
if (e.keyCode==87) up_press = false;
if (e.keyCode==68) right_press = false;
if (e.keyCode==83) down_press = false;
}
 
function go(e:Event):void {
if (left_press) x -=_speed;
if (up_press) y -=_speed;
if (right_press) x +=_speed;
if (down_press) y +=_speed;
 
 
}
                }
 
        }


belv 11.02.2014 01:18

Все дело в том, что Вы объявляете igrok как локальную переменную, а локальные переменные доступны только в том методе, где Вы их объявляете. Можно сделать массив, в который запихивать всех игроков, а потом удалять их со сцены, обращаясь к ним через массив по индексу.

Godwarlock 11.02.2014 01:33

Цитата:

Сообщение от belv (Сообщение 1159470)
Все дело в том, что Вы объявляете igrok как локальную переменную, а локальные переменные доступны только в том методе, где Вы их объявляете. Можно сделать массив, в который запихивать всех игроков, а потом удалять их со сцены, обращаясь к ним через массив по индексу.

А можно пример?
Код AS3:

public var players:Array = [
            [1,2],
            ];

Вот к примеру создал массив, с элементами 1, 2. Как мне создать переменную, чтобы новый игрок по индексу попадал вместо элемента "1". Или не так совсем?))
И раз уж так, почему если public class player extends Main и когда я указываю в классе Main переменные
public var left_press:Boolean;
public var up_press:Boolean;
public var right_press:Boolean;
public var down_press:Boolean;
public var _speed:uint;
То при запуске, он говорит что нету таких переменных?


Часовой пояс GMT +4, время: 04:19.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.