Первый вопрос!Рандомайзер цикла ходьбы NPC работает по назначению (границы нуждаются в настройке), но не воспроизводит вложенные анимации ходьбы?(AS3) - PullRequest
0 голосов
/ 25 сентября 2019

Практически, анимация ходьбы не будет работать с оператором switch, я думаю?Вот как это выглядит, но сам рандомизатор работает нормально.Что я хотел сделать, так это переписать рабочий код для mc, но заменить ключевые входы регистрами (произвольно выбранными направлениями ходьбы) из оператора switch и подключить этот переписанный код отдельно в мозг NPC (roshi).

То, как я настроил код, это то, что NPC "roshi" - это видеоклип на сцене.Внутри находятся отдельные видеоклипы, в каждом из которых есть кадры для каждой анимации ходьбы, но они не будут воспроизводиться (например, roshiRightStand, roshiRightWalk и т. Д.).Он всегда застревает в выбранном кадре и никогда не попадает в мувиклип, как бы я ни связывался с кодом, скобками или логическими значениями.Может я не декларирую или не вкладываю что-то правильно или вообще?Анимации - это кадры внутри мувиклипа, вложенные в другой мувиклип, и имена, кажется, совпадают в свойствах?Не совсем уверен, как это объявить, но в какой-то момент я считаю, что, возможно, все это работало и все испортило.Оставил мой старый оставшийся код, если это могло помочь?Любой вклад будет высоко ценится!Учимся довольно быстро.:)

* Код с ошибками (вычеркнуты): https://textuploader.com/108de

* Код очищен и приведен в порядок: https://textuploader.com/108lw

* Загрузка игры (отражаеткод как есть; воспроизводится в вашем браузере с плагином): https://www.newgrounds.com/dump/item/e06224a5f9fd5645ce5a4604173f8bbd?fbclid=IwAR3HJdXMXEqxUN5TH2xaDvV82QBDmI0ewnVej1EQJFkZLb3RYuEK0dvMz74

import flash.display.MovieClip;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
import flash.events.Event;
import flash.display.Stage;
import flash.events.MouseEvent;


mc.gotoAndStop("standingRight");
toggle_btn.stop();


var played:Boolean=false;
var mySound:Sound = new MySound();
var myChannel:SoundChannel = new SoundChannel();

var rightPressed:Boolean = new Boolean(false);
var leftPressed:Boolean = new Boolean(false);
var upPressed:Boolean = new Boolean(false);
var downPressed:Boolean = new Boolean(false);
var mcSpeed:Number = 10;

var roshiTimer:Number = 0; //random roshi-cycle duration between 0-25
var roshiDuration:Number = Math.random() * 25;
var roshiFacing:Number = Math.floor(Math.random() * 4); //random # bwt 0-3 (ex. 4 is rounded down to 3)
var roshiSpeed:Number = 3; //roshi's walk speed


toggle_btn.addEventListener(MouseEvent.CLICK, togglePlay);
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler);
stage.addEventListener(Event.ENTER_FRAME, gameLoop);


function togglePlay(event:MouseEvent):void
{
   (!played)? played = true : played = false;
   (played)? myChannel=mySound.play():SoundMixer.stopAll();

   (played)? toggle_btn.gotoAndStop(2):toggle_btn.gotoAndStop(1);
    myChannel.addEventListener(Event.SOUND_COMPLETE,soundCompleted);
}
function soundCompleted(event:Event):void
{
	played = false;
	toggle_btn.gotoAndStop(1);
}


function keyDownHandler(keyEvent:KeyboardEvent):void
{
   if(keyEvent.keyCode == Keyboard.RIGHT)
   {
	   rightPressed = true;
   }
   else if(keyEvent.keyCode == Keyboard.LEFT)
   {
	   leftPressed = true;
   }
   else if(keyEvent.keyCode == Keyboard.DOWN)
   {
	   downPressed = true;
   }
   else if(keyEvent.keyCode == Keyboard.UP)
   {
	   upPressed = true;
   }
}

function keyUpHandler(keyEvent:KeyboardEvent):void
{
   if(keyEvent.keyCode == Keyboard.RIGHT)
   {
	   rightPressed = false;
	   mc.gotoAndStop("standingRight");
   }
   else if(keyEvent.keyCode == Keyboard.LEFT)
   {
	leftPressed = false;
	mc.gotoAndStop("standingLeft");
   }
   else if (keyEvent.keyCode == Keyboard.DOWN)
   {
       downPressed = false;
	   mc.gotoAndStop("standingDown");
   }
   else if(keyEvent.keyCode == Keyboard.UP)
   {
	   upPressed = false;
	   mc.gotoAndStop("standingUp");
   }
}


function gameLoop(loopEvent:Event):void 
{  
	//MC's Movement Controls
    if(rightPressed && mc.currentLabel !="walkingRight" && upPressed == false && downPressed == false)
	{ 
       mc.gotoAndStop("walkingRight");
    }
    if(rightPressed && mc.currentLabel =="walkingRight")
    {
	   if(mc.x < 800)
	   {
          mc.x += mcSpeed;
	   }

	   else if (backenvironment.x > -650) //right world borderwall
	   {
	   backenvironment.x -= mcSpeed; 
	   frontenvironment.x -= mcSpeed;
	   }
    } 
	
    if(leftPressed && mc.currentLabel !="walkingLeft" && upPressed == false && downPressed == false)
    {
       mc.gotoAndStop("walkingLeft");
    }
    if(leftPressed && mc.currentLabel =="walkingLeft")
    {
	   if(mc.x > 200)
	   {
          mc.x -= mcSpeed;
	   }
	   else if (backenvironment.x < -130) //left world borderwall
	   {
	      backenvironment.x += mcSpeed;
	      frontenvironment.x += mcSpeed;
	   }
    }
	
    if(upPressed && mc.currentLabel != "walkingUp" && rightPressed == false && leftPressed == false)  
	{
       mc.gotoAndStop("walkingUp");
    }
    if(upPressed && mc.currentLabel == "walkingUp")
    {
	   if(mc.y > 200) //og 200
	   {
          mc.y -= mcSpeed;10
       }
	   else if (backenvironment.y < -10) //top world borderwall
	   {
	      backenvironment.y += mcSpeed;
	      frontenvironment.y += mcSpeed;
	   }
	}
	   
    if(downPressed && mc.currentLabel != "walkingDown" && rightPressed == false && leftPressed == false)
    {
       mc.gotoAndStop("walkingDown");
    }
	
    if (downPressed && mc.currentLabel == "walkingDown")
    {
	   if(mc.y < 485) //og 568 LESS MOVES MC UP CAMERA
	   {
          mc.y += mcSpeed;
       }
	   else if (backenvironment.y > -577) //bottom world borderwall og-577
       {
		   backenvironment.y -= mcSpeed;
		   frontenvironment.y -= mcSpeed;
       }
   }


   if(roshiTimer < roshiDuration)
   {
      switch(roshiFacing) //x=horozontal y=vertical +=right/up -=left/down
      {
			case 0 :
			roshi.gotoAndStop("roshiUpWalk");
			//roshi.addEventListener(Event.ENTER_FRAME)
			roshi.y -= roshiSpeed;
			break;
		
			case 1 :
			roshi.gotoAndStop("roshiDownWalk");
			roshi.y += roshiSpeed;
			break;
			
			case 2 :
			roshi.gotoAndStop("roshiLeftWalk");
			roshi.x -= roshiSpeed;
			break;
			
			case 3 :
			roshi.gotoAndStop("roshiRightWalk");
			roshi.x += roshiSpeed;
			break;
	  }
      roshiTimer ++;	
   }
   
   if(roshiTimer > roshiDuration)
   {
      roshiDuration = Math.random() * 25; //25
      roshiFacing = Math.floor(Math.random() * 4); //4
      roshiTimer = 0; //greater than 0
   }
}

~ Решено пользователем Organis.

import flash.display.MovieClip;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
import flash.events.Event;
import flash.display.Stage;
import flash.events.MouseEvent;


mc.gotoAndStop("standingRight");
toggle_btn.stop();


var played:Boolean=false;
var mySound:Sound = new MySound();
var myChannel:SoundChannel = new SoundChannel();

var rightPressed:Boolean = new Boolean(false);
var leftPressed:Boolean = new Boolean(false);
var upPressed:Boolean = new Boolean(false);
var downPressed:Boolean = new Boolean(false);
var mcSpeed:Number = 10;

var roshiTimer:int = 0;
var roshiDuration:int = 0;
var roshiFacing:int = 0;
var roshiSpeed:Number = 3

addEventListener(Event.ENTER_FRAME, onRoshi);
toggle_btn.addEventListener(MouseEvent.CLICK, togglePlay);
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler);
stage.addEventListener(Event.ENTER_FRAME, gameLoop);


function togglePlay(event:MouseEvent):void
{
   (!played)? played = true : played = false;
   (played)? myChannel=mySound.play():SoundMixer.stopAll();

   (played)? toggle_btn.gotoAndStop(2):toggle_btn.gotoAndStop(1);
    myChannel.addEventListener(Event.SOUND_COMPLETE,soundCompleted);
}
function soundCompleted(event:Event):void
{
	played = false;
	toggle_btn.gotoAndStop(1);
}


function keyDownHandler(keyEvent:KeyboardEvent):void
{
   if(keyEvent.keyCode == Keyboard.RIGHT)
   {
	   rightPressed = true;
   }
   else if(keyEvent.keyCode == Keyboard.LEFT)
   {
	   leftPressed = true;
   }
   else if(keyEvent.keyCode == Keyboard.DOWN)
   {
	   downPressed = true;
   }
   else if(keyEvent.keyCode == Keyboard.UP)
   {
	   upPressed = true;
   }
}

function keyUpHandler(keyEvent:KeyboardEvent):void
{
   if(keyEvent.keyCode == Keyboard.RIGHT)
   {
	   rightPressed = false;
	   mc.gotoAndStop("standingRight");
   }
   else if(keyEvent.keyCode == Keyboard.LEFT)
   {
	leftPressed = false;
	mc.gotoAndStop("standingLeft");
   }
   else if (keyEvent.keyCode == Keyboard.DOWN)
   {
       downPressed = false;
	   mc.gotoAndStop("standingDown");
   }
   else if(keyEvent.keyCode == Keyboard.UP)
   {
	   upPressed = false;
	   mc.gotoAndStop("standingUp");
   }
}


function gameLoop(loopEvent:Event):void 
{  
	
    if(rightPressed && mc.currentLabel !="walkingRight" && upPressed == false && downPressed == false)
	{ 
       mc.gotoAndStop("walkingRight");
    }
    if(rightPressed && mc.currentLabel =="walkingRight")
    {
	   if(mc.x < 800)
	   {
          mc.x += mcSpeed;
	   }

	   else if (backenvironment.x > -650) 
	   {
	   backenvironment.x -= mcSpeed; 
	   frontenvironment.x -= mcSpeed;
	   }
    } 
	
    if(leftPressed && mc.currentLabel !="walkingLeft" && upPressed == false && downPressed == false)
    {
       mc.gotoAndStop("walkingLeft");
    }
    if(leftPressed && mc.currentLabel =="walkingLeft")
    {
	   if(mc.x > 200)
	   {
          mc.x -= mcSpeed;
	   }
	   else if (backenvironment.x < -130)
	   {
	      backenvironment.x += mcSpeed;
	      frontenvironment.x += mcSpeed;
	   }
    }
	
    if(upPressed && mc.currentLabel != "walkingUp" && rightPressed == false && leftPressed == false)  
	{
       mc.gotoAndStop("walkingUp");
    }
    if(upPressed && mc.currentLabel == "walkingUp")
    {
	   if(mc.y > 200) 
	   {
          mc.y -= mcSpeed;10
       }
	   else if (backenvironment.y < -10) 
	   {
	      backenvironment.y += mcSpeed;
	      frontenvironment.y += mcSpeed;
	   }
	}
	   
    if(downPressed && mc.currentLabel != "walkingDown" && rightPressed == false && leftPressed == false)
    {
       mc.gotoAndStop("walkingDown");
    }
	
    if (downPressed && mc.currentLabel == "walkingDown")
    {
	   if(mc.y < 485) 
	   {
          mc.y += mcSpeed;
       }
	   else if (backenvironment.y > -577) 
       {
		   backenvironment.y -= mcSpeed;
		   frontenvironment.y -= mcSpeed;
       }
   }

}


var RF:Array = 
[
    "roshiUpWalk", "roshiDownWalk",
    "roshiLeftWalk", "roshiRightWalk",
];

var RX:Array = [0, 0, -1, 1];
var RY:Array = [-1, 1, 0, 0];

function onRoshi(e:Event):void
{
      roshiTimer ++;	

      if (roshiTimer > roshiDuration)
    {
        roshiDuration = 10 + Math.random() * 25;
        roshiTimer = 0;
		
        while (Roshi.currentLabel == RF[roshiFacing])
        {
            roshiFacing = Math.random() * 4;
        }

        Roshi.gotoAndStop(RF[roshiFacing]);
    }

    Roshi.x += RX[roshiFacing] * roshiSpeed;
    Roshi.y += RY[roshiFacing] * roshiSpeed;
}

1 Ответ

0 голосов
/ 26 сентября 2019

Ну, давайте все равно попробуем.Поместите это в отдельный проект вместе с графикой Roshi.Основное различие между вашим кодом и тем, что я не запускаю Roshi.gotoAndStop каждый кадр, только один раз, когда Роши меняет направление.

// Integers, because you don't have to round them.
var roshiTimer:int = 0;
var roshiDuration:int = 0;
var roshiFacing:int = 0;
var roshiSpeed:Number = 3;

addEventListener(Event.ENTER_FRAME, onRoshi);

// Let's do this instead of switch.
var RF:Array = [
    "roshiUpWalk", "roshiDownWalk",
    "roshiLeftWalk", "roshiRightWalk",
];

var RX:Array = [0, 0, -1, 1];
var RY:Array = [-1, 1, 0, 0];

function onRoshi(e:Event):void
{
    roshiTimer++;

    if (roshiTimer > roshiDuration)
    {
        roshiDuration = 10 + Math.random() * 25;
        roshiTimer = 0;

        // Let's make Roshi ALWAYS change direction
        // without occasionally proceeding to the same one.
        while (Roshi.currentLabel == RF[roshiFacing])
        {
            roshiFacing = Math.random() * 4;
        }

        Roshi.gotoAndStop(RF[roshiFacing]);
    }

    Roshi.x += RX[roshiFacing] * roshiSpeed;
    Roshi.y += RY[roshiFacing] * roshiSpeed;
}
...