Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Следование за мышкой (http://www.flasher.ru/forum/showthread.php?t=211135)

MarkEvans 01.07.2015 18:48

Следование за мышкой
 
Здравствуйте, Flasher'ы!
Недавно узнал о проекте под названием Agar.io (http://agar.io/) и решил слепить что-то подобное...
Но очень скоро по своей неопытности натолкнулся на интересную проблему - следование ГГ за мышкой.
В AS 2.0 это вылядело примерно так:
Код AS1/AS2:

speed = 5;
this.onEnterFrame = function() {
        dx = this._xmouse-pl._x;
        dy = this._ymouse-pl._y;
        Q = Math.atan2(dy, dx);
        pl._rotation = Q*180/Math.PI;
        dist = Math.sqrt(dx*dx+dy+dy);
        if (dist>speed) {
                valx = Math.cos(Q)*speed;
                // постоянная скорость
                valy = Math.sin(Q)*speed;
                pl._x += valx;
                pl._y += valy;
                        }
};

Сколько я не бился, так и не смог этот код портировать в AS 3.0...
И ещё - незнаю как сделать спавн еды для ГГ по всему полю
Всё чего я добился:
Код AS3:

import flash.display.MovieClip;
 
var myPl2: MovieClip = new pl2 ();
 addChild(myPl2);
 myPl2.x >= 550;
 myPl2.y >= 400;

Прошу не ругаться сильно - я начинающий и на форуме это мой первый вопрос

samana 01.07.2015 23:41

Цитата:

Сколько я не бился, так и не смог этот код портировать в AS 3.0...
А вы покажите то, что у вас не получилось и мы попробуем подсказать, что не так. А то если напишем код за вас, то вы не получите +1 к своему опыту, для прокачки as3 навыка.

Цитата:

И ещё - незнаю как сделать спавн еды для ГГ по всему полю
Здесь явно нужно идти в сторону случайности, то-есть Math.random()

dimarik 02.07.2015 00:00

Лучше псевдорандом )

MarkEvans 02.07.2015 19:29

Вложений: 1
Вот, как и просили - и AS 2, и в AS 3...
Жду ответов))

ZackMercury 02.07.2015 20:05

В agar.io не везде генерится еда, а кусками. Поэтому выбираем случайную точку на карте, и генерим относительно неё раз 100 в пределах 500-700 пикселей от точки во все стороны. И так несколько итераций.

samana 02.07.2015 22:35

Цитата:

Сообщение от MarkEvans (Сообщение 1184379)
Вот, как и просили - и AS 2, и в AS 3...
Жду ответов))

Исходники открыть не удалось, видимо ваша версия Flash выше моей. Но совсем не обязательно выкладывать исходники, ведь можно просто показать код, который нуждается в помощи.

MarkEvans 02.07.2015 22:40

Т.е. мы берём, допустим 4 точки на карте и относительно них прибаляем координаты и там спавним еду?
А, и ещё вопросик - как мне сделать подсчёт очков при съедании? Самая очевидная мысль, наверное - это создать переменную и с помощью if'а прибавлять по одному очку... Но вот как вывести это на экран?
Заранее спасибо за ответы.

Добавлено через 10 минут
Ок, выкладываю весь код:
Версия AS3:

Код AS3:

stop();
 
import flash.display.MovieClip;
 
//▼ Это неудачная попытка реализовать тот самый спавн еды... ▼
 
//stage.addEventListener(Event.ENTER_FRAME, apelsin);
//function apelsin (e:Event) {
//        var myPl2: MovieClip = new pl2 ();
// addChild(myPl2);
//  myPl2.x = Math.random();
//  myPl2.y = Math.random();
//}
 
// ▼ Единственное, что я придумал для следования ГГ за курсором ▼
 
stage.addEventListener(Event.ENTER_FRAME, apelsin);
  function apelsin (e:Event) {
        Mouse.hide();
        pl.x = mouseX;
        pl.y = mouseY;
}
 
//P.S
//Да, код ужасен, но я новичёк в этом деле, и да - мне 14 лет))
//Так что я себя частично оправдываю...

И версия AS2:

Код AS1/AS2:

speed = 5;
Mouse.hide();//Прячем мышь
this.onEnterFrame = function() {
        dx = this._xmouse-pl._x;
        dy = this._ymouse-pl._y;
        Q = Math.atan2(dy, dx);
        pl._rotation = Q*180/Math.PI;
        dist = Math.sqrt(dx*dx+dy+dy);
        if (dist>speed) {
                valx = Math.cos(Q)*speed;
                // постоянная скорость
                valy = Math.sin(Q)*speed;
                pl._x += valx;
                pl._y += valy;
        }
};
 
// ▼ А это две глупых попытки спрятать "еду" ▼
 
/*if (pl._x = eda._x) {
        eda.visible = false;
}
if (pl._y = eda._y) {
        eda.visible = false;
}*/

 
 
if (pl.hitTestPoint(eda._x, eda._y)) {
        eda.visible = false;
}


samana 02.07.2015 23:28

Код AS3:

Mouse.hide();
 
var speed:float = 0.5; //скорость 0 - не двигается,  1-мгновенно перемещается
 
addEventListener(Event.ENTER_FRAME, apelsin);
 
function apelsin(e:Event)
{
        //Mouse.hide(); нет смысла каждый кадр скрывать мышь
 
        //pl.x = mouseX;
        //pl.y = mouseY;
 
        //можно и так, для плавного результата
        pl.x += (mouseX - pl.x) * speed;
        pl.y += (mouseY - pl.y) * speed;
}


MarkEvans 02.07.2015 23:42

Спасибо большое, пойду пробовать, только вот не понял, что делает
Цитата:

var speed:float = 0.5;

samana 03.07.2015 00:04

Цитата:

Сообщение от MarkEvans (Сообщение 1184392)
Спасибо большое, пойду пробовать, только вот не понял, что делает

Ох... перепутал с другим языком. Нужно вместо float прописать Number.

MarkEvans 03.07.2015 00:16

Ок...))
Извиняюсь, но тогда что делает Number?

Добавлено через 8 минут
Да, код работает отлично, но вот только мне нужно, чтобы шарик двигался за курсором, а не был прилеплен к нему...

samana 03.07.2015 00:39

Number - это такой тип, который умеет содержать в себе дробные числа (0.1, 5.00351, 0.0013).

Добавлено через 8 минут
Цитата:

Сообщение от MarkEvans (Сообщение 1184394)
Да, код работает отлично, но вот только мне нужно, чтобы шарик двигался за курсором, а не был прилеплен к нему...

Здесь идёт движение к курсору с постоянной скоростью.
Код AS3:

import flash.events.Event;
 
var speed:Number=5;
 
addEventListener(Event.ENTER_FRAME, ef);
function ef(e:Event):void
{
        var dx:Number=mouseX-player.x;
        var dy:Number=mouseY-player.y;
        var dist:Number=Math.sqrt(dx*dx+dy*dy);
 
        if(dist<speed)
        {
                player.x=mouseX;
                player.y=mouseY;
        }else
        {
                player.x+=(dx/dist)*speed;
                player.y+=(dy/dist)*speed;
        }
}


MarkEvans 03.07.2015 14:27

Ааа... Понял. Т.е. в первом варианте достаточно уменьшить скорость и он уже будет медленно тащится за курсором))
И да, последний код - это моё спасение.
Спасибо за ответ, samana, и все, кто помог.

Добавлено через 54 секунды
Только вот со спавном не решили...

ZackMercury 03.07.2015 14:34

Ну, попробуйте как вам сразу предложили, потом попробуйте, как я предложил.
Первый вариант выглядит так.

Код AS3:

var items:Array = [];
 
for(var i:int = 0; i < 300; i ++)
{
  var item:Item = new Item();
  item.x = Math.random() * 500;
  item.y = Math.random() * 400;
  addChild(item);
  items[i] = item;
}

P.S. Вряд ли для такой игры вам понадобится псевдорандом.

А если ещё хотите цвет генерировать, то лучше на лету рисовать.

Код AS3:

var items:Array = [];
 
for(var i:int = 0; i < 300; i ++)
{
  var item:Shape = new Shape();
  with(item.graphics)
  {
      beginFill(Math.random()*0xFFFFFF);
      drawCircle(5,5,5);
      endFill();
  }
  addChild(item);
  item.x = Math.random() * 500;
  item.y = Math.random() * 400;
  items[i] = item;
}


MarkEvans 03.07.2015 16:09

Да, спасибо, всё работает отлично.
Последний вопрос - чтобы еда восполнялась, когда я её съедаю, надо добавить что-то типа такого?
Код AS3:

 если (i меньше 300) {
    i + 1
 }


ZackMercury 03.07.2015 18:06

После съедания просто добавляйте новый хавчик.

AlexCooper 03.07.2015 18:09

Кстати раз тут зашёл разговор об моделях поведения, никто не тыкнёт носом на ссылочку с использованием векторов и операций над ними для моделирования поведений: приследование, убегание, скопления и т.д. Был помню какой-то туториал, так не мог найти.

MarkEvans 03.07.2015 18:12

Возникла проблема с подсчётом очков:
Код AS3:

var t:TextField = new TextField(); // экземпляр класса
var score:Number = 0; // очки
t.text = String(score);
 
var items:Array = [];
 
for(var i:int = 0; i < 3; i ++)
{
  var item:Shape = new Shape();
  with(item.graphics)
  {
      beginFill(Math.random()*0xFFFFFF);
      drawCircle(4,4,4);
      endFill();
  }
  addChild(item);
  item.x = Math.random() * 550;
  item.y = Math.random() * 400;
  items[i] = item;
}
 
addChild(t);// добавляем на сцену текст
t.x = 530;
t.y = 10;
 
if (pl.hitTestObject(item)) {
        score ++;// пробуем прибавлять к переменной       
 }

Когда включаю, не считает очки(когда пытался поменять координаты item или сделать невидимым - то-же самое...)

ZackMercury 03.07.2015 18:18

Цитата:

Кстати раз тут зашёл разговор об моделях поведения, никто не тыкнёт носом на ссылочку с использованием векторов и операций над ними для моделирования поведений: приследование, убегание, скопления и т.д. Был помню какой-то туториал, так не мог найти.
Тут не заходил разговор, но вот:
http://demiart.ru/forum/index.php?showtopic=125911

Добавлено через 1 минуту


Код AS3:

addEventListener(Event.ENTER_FRAME, update);
function update(e:Event = null):void
{
  t.text = score;
}


AlexCooper 03.07.2015 18:25

Цитата:

Сообщение от ZackMercury (Сообщение 1184427)
Тут не заходил разговор, но вот:
http://demiart.ru/forum/index.php?showtopic=125911

Спасибо, то что искал)

MarkEvans 03.07.2015 18:37

1067: Неявное приведение значения типа Number к несоответствующему типу String.

ZackMercury 03.07.2015 18:38

Код AS3:

addEventListener(Event.ENTER_FRAME, update);
function update(e:Event = null):void
{
  t.text = score.toString();
}

А вообще, меня немного пугает ваш код. Как вы проверяете столкновение, почему проверка столкновения выполняется только один раз вначале игры?

MarkEvans 03.07.2015 18:48

Исправил всё, стало считать но сколько-бы ни было еды на сцене, очки прибавляються только при столкновении с определённым кружком
Кидаю код(весь):
Код AS3:

stop();
Mouse.hide();
 
import flash.display.MovieClip;
import flash.text.TextField;
import flash.events.Event;
 
 
var score:Number = 0; // очки
var items:Array = [];
 
for(var i:int = 0; i <250; i ++)
{
  var item:Shape = new Shape();
  with(item.graphics)
  {
      beginFill(Math.random()*0xFFFFFF);
      drawCircle(4,4,4);
      endFill();
  }
  addChild(item);
  item.x = Math.random() * 550;
  item.y = Math.random() * 400;
  items[i] = item;
}
 
addEventListener(Event.ENTER_FRAME, hit);
 function hit(e:Event)
 {
 if (pl.hitTestObject(item)) {
        score ++;
 
 }
 }
 
 
var speed:Number = 0.03; //скорость 0 - не двигается,  1-мгновенно перемещается
 
addEventListener(Event.ENTER_FRAME, apelsin);
 
function apelsin(e:Event)
{
        //можно и так, для плавного результата
        pl.x += (mouseX - pl.x) * speed;
        pl.y += (mouseY - pl.y) * speed;
}
 
addEventListener(Event.ENTER_FRAME, update);
function update(e:Event = null):void
{
  t.text = score.toString();
}
 
var t:TextField = new TextField(); // экземпляр класса
 
 addChild(t);// добавляем на сцену
t.x = 530;
t.y = 10;


ZackMercury 03.07.2015 18:52

Код AS3:

addEventListener(Event.ENTER_FRAME, update);
function update(e:Event = null):void
{
  for(var i:int = 0; i < items.length; i ++)
  {
      if(p1.hitTestObject(items[i])) t.text = (int(t.text) + 1).toString();
  }
}


MarkEvans 03.07.2015 19:32

Сделал вот-так, теперь еда исчезает, но стало по-адски лагать
Код AS3:

addEventListener(Event.ENTER_FRAME, update);
function update(e:Event = null):void
{
  for(var i:int = 0; i < items.length; i ++)
  {
      if(pl.hitTestObject(items[i])) {
                  removeChild(items[i]);
                  t.text = (int(t.text) + 1).toString();
          }
 
  }
}

Наверное из-за этого:
ArgumentError: Error #2025: Предоставленный DisplayObject должен быть дочерним элементом вызывающего объекта.
at flash.display::DisplayObjectContainer/removeChild()
at AgarIO3_fla::MainTimeline/update()

samana 03.07.2015 19:53

Когда вы удаляете объект с экрана, вам так же нужно удалить его из массива, чтобы в следующий раз, удалённый объект уже не проверялся на столкновения.

MarkEvans 03.07.2015 20:12

Ок, только я незнаю как удалять из массива...

samana 03.07.2015 20:19

Тогда думаю есть над чем поэкспериментировать и узнать что-то новенькое ) http://help.adobe.com/ru_RU/FlashPla...t/3/Array.html

MarkEvans 03.07.2015 21:34

Спасибо
Нашёл там функцию splice(),а вот как пользоваться незнаю
Даже святой гугл не помог...

ZackMercury 03.07.2015 21:53

Эм...
http://cs627117.vk.me/v627117630/6743/hdKxjbFtNpI.jpg

dimarik 03.07.2015 22:51

ZackMercury, а почему бы ссылку не дать человеку на справку? Как он по скрину ее найдет? )

ZackMercury 03.07.2015 23:08

dimarik, давали уже, давали.
Цитата:

Сообщение от samana (Сообщение 1184445)
Тогда думаю есть над чем поэкспериментировать и узнать что-то новенькое ) http://help.adobe.com/ru_RU/FlashPla...t/3/Array.html

P.S. сарказм не понял

MarkEvans 05.07.2015 21:20

Вложений: 1
Спасибо за ссылку - долго ломал голову, но задачу решил.
Решил сделать регенерацию еды, но не пашет:
Код AS3:

if (i < 300) {
  new Shape();
  with(item.graphics)
  {
      beginFill(Math.random()*0xFFFFFF);
      drawCircle(4,4,4);
      endFill();
  }
  addChild(item);
  item.x = Math.random() * 550;
  item.y = Math.random() * 400;
  items[i] = item;
}



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

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