2015-05-02 2 views
0

Эй, все, поэтому я уже на это некоторое время и наконец решил попросить о помощи. Поэтому я создаю игру в AS3, где object вращается круговым движением слева направо в зависимости от пользователя мыши. Поэтому у меня есть некоторые переменные, созданные для того, чтобы действовать как трение. То, что я пытаюсь сделать, - это когда object больше или меньше определенной степени вращения. Я хочу, чтобы объект чувствовал, что он все больше и больше тянется к той стороне, в которой он сейчас находится, и единственный способ, который может сказать объект, вернуться к его исходному положению - если использование щелкает мышью достаточно, так что они больше не действуют на нее и говорят, что скорость увеличивается одновременно с трудностями.Неполадка создания силы тяги и изменения силы с помощью Mouse_Event

Вот переменные я в настоящее время работает с:

 //Variables 
     speed = 0.2; 
     vx = 0; 
     friction = 0.93; 
     maxspeed = 10; 

У меня также есть эти кнопки на сцене, так что пользователь может нажимать на них, чтобы изменить вращение object как так:

mainScreen.leftBtn.addEventListener(MouseEvent.CLICK, leftButtonClicked); 
    mainScreen.rightBtn.addEventListener(MouseEvent.CLICK, rightButtonClicked); 

private function leftButtonClicked(e:MouseEvent):void 
    { 
     clickLeft = true; 
     clickRight = false; 
    } 

    private function rightButtonClicked(e:MouseEvent):void 
    { 
     clickRight = true; 
     clickLeft = false; 
    } 

и я пытаюсь настроить механику в моем ENTER_FRAME слушателя событий следующим образом:

//RIGHT = CLOCKWISE +, Left = COUNTER CLOCKWISE - 
     if (clickRight) 
     { 
      vx += speed; 
      moveSlow = true; 
      moveFast = false; 
     }else 
     if (clickLeft) 
     { 
      vx -= speed; 
      moveSlow = true; 
      moveFast = false; 
     }else   
     { 
      vx *= friction; 
     } 

     //IF object is Past 15 Degrees make object go faster MOVE FAST 
     if (object.rotation > 15) 
     { 
      moveFast = true; 
      moveSlow = false; 
      trace("MOVE_FAST"); 
     }else 
     if (object.rotation < - 15) 
     { 
      moveFast = true; 
      moveSlow = false; 
     }else   
     { 
      vx *= friction; 
     } 

     object.rotation += vx; 
     //lumberJack.rotation += speed; 

     //boundaries of object 
     if (vx > maxspeed) 
      vx = maxspeed; 
     else if (vx < -maxspeed) 
      vx = -maxspeed; 

Я знаю, что мне нужно добавить что-то в if object.rotation, но не уверен, что я также знаю, что мне нужно добавить что-то в прослушиватели событий с нажатой кнопкой мыши, чтобы манипулировать скоростью или трением, чтобы пользователь мог отвлечься от силы, действующей на нее , Я пробовал несколько раз, но все еще не могу понять, как это понять. На данный момент объект вращается влево или вправо в зависимости от входа пользователя и говорит, что объект движется влево, а пользователь нажимает вправо. object медленно перемещается влево, а затем возвращается к нормальной скорости.

Пожалуйста, если кто-нибудь может помочь мне понять это, я буду очень благодарен!

+1

Вы пытаетесь заставить свой объект вести себя как колесо с центром масс ось? Для этого вам, вероятно, придется выполнить немного физических вычислений. – Vesper

+0

Да, это в значительной степени то, что я пытаюсь добиться благодаря весне. Я пойду проверить, могу ли я найти некоторые уроки. – Nathan

+0

Существует игра, в которой есть механика, пытающаяся реализовать. Если я пришлю вам ссылку, вы можете помочь мне узнать, что я имею в виду? – Nathan

ответ

1

Чтобы быть честным, у меня возникли проблемы, связанные с вашим вопросом, так что это может быть лишь частичный ответ. Я знаю, плохой, но мне не хватает глупых интернет-точек, чтобы оставить комментарий, так что это все, что я могу сделать, чтобы помочь, и я просто не могу заботиться о системе интернет-очков.

Во-первых, для любви Вставить божество, очистить все, что лишнее пробел.

Вот потенциальная проблема в вашем коде: свойство отображаемых объектов rotation возвращает значение между -180 и 180. Это означает, что каждые 180 градусов значение поворота меняет знак. Поэтому вы не можете использовать, является ли поворот положительным или отрицательным, чтобы определить, в каком направлении движется объект. Это должно храниться в отдельной переменной.

Еще одна вещь, которую следует учитывать: если moveSlow и moveFast никогда не являются истинными одновременно, вам не нужно иметь две переменные, потому что они избыточны. Вы не использовать эти переменные в коде выше, но предполагает, что вы написали это:

if (moveSlow) { 
    moveALittleBit(); 
} else if (moveFast) { 
    moveALot(); 
} 

Вы могли бы заменить его:

if (moveSlow) { 
    moveALittleBit(); 
} else { 
    moveALot(); 
} 

Мало того, что давая себе ненужную работу, но это плохо, потому что это означает, что вы можете создать «недопустимые состояния» (т. е. если вы допустили ошибку, а «moveSlow» и «moveFast» одновременно верны).

Аналогичным образом вам не нужны отдельные переменные для «clickedLeft» и «clickedRight», если они оба взаимоисключающие. Если они оба могут быть ложными, в то же время, однако, вы могли бы быть лучше с чем-то вроде:

clickDirection = "left"; 
clickDirection = "right"; 
clickDirection = "none"; 

Если вы пошли по этому пути, вы бы лучше использовать строковые константы вместо закодированных строк, но Я думаю, что это слишком не по теме.

После прочтения вашего вопроса много раз, похоже, что, возможно, то, что вы ищете, это импульс. Это покрывает то, что вам нужно?

if (clickRight) 
{ 
    vx += speed; 
    momentum = 0; 
} else if (clickLeft) 
{ 
    vx -= speed; 
    momentum = 0; 
} else  
{ 
    vx *= friction; 
} 

//IF object is Past 15 Degrees make object go faster MOVE FAST 
if (object.degreesRotated > 15) 
{ 
    momentum += 1; 
}else if (object.degreesRotated < - 15) 
{ 
    momentum -= 1; 
}else   
{ 
    vx *= friction; 
} 

vx += momentum; 
object.rotation += vx; 
object.degreesRotated += vx; //remember how much we've rotated 
//lumberJack.rotation += speed; 

Если объект является динамическим, вы можете добавить свойство «градусовRotated», когда захотите. В противном случае вам, возможно, придется создать новый класс, расширив любой тип отображения, который есть у объекта, и добавьте поле с градуированными полями в этот класс.

+0

Благодарим вас за подробный ответ. Определенно посмотрите на это и посмотрите, как это получается. Я вернусь к вам, если у меня есть вопросы, спасибо – Nathan

+0

Нет проблем, я надеюсь, что это поможет вам. – user45623

Смежные вопросы