Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 如何在AS3中添加键盘交互_Actionscript 3_Flash_Audio_Intellij Idea_Keyboard Events - Fatal编程技术网

Actionscript 3 如何在AS3中添加键盘交互

Actionscript 3 如何在AS3中添加键盘交互,actionscript-3,flash,audio,intellij-idea,keyboard-events,Actionscript 3,Flash,Audio,Intellij Idea,Keyboard Events,我在这个应用程序中有16个不同的按钮,每个按钮播放不同的声音。目前我只能使用鼠标单击开始播放声音,然后再次单击停止,但现在我希望添加快捷键来访问这些曲目按钮,如按q键播放曲目1,按w键播放曲目2。有什么提示或提示,比如我该怎么做才能做到这一点?非常感谢 private var _ambientTracks:Array = [ambient1, ambient2, ambient3, ambient4]; private var _effectTracks:Array = [effect1, ef

我在这个应用程序中有16个不同的按钮,每个按钮播放不同的声音。目前我只能使用鼠标单击开始播放声音,然后再次单击停止,但现在我希望添加快捷键来访问这些曲目按钮,如按q键播放曲目1,按w键播放曲目2。有什么提示或提示,比如我该怎么做才能做到这一点?非常感谢

private var _ambientTracks:Array = [ambient1, ambient2, ambient3, ambient4];
private var _effectTracks:Array = [effect1, effect2, effect3, effect4];
private var _melodyTracks:Array = [melody1, melody2, melody3, melody4];
private var _beatTracks:Array = [beat1, beat2, beat3, beat4];

//handle click on track invoke  start / stop functions
private function onTrackClicked(event:MouseEvent):void {
    var track:Sprite = event.currentTarget as Sprite;
    var trackName:String = track.name;
    if (trackName in _playingTracks) {
        stopTrack(track);
        delete _playingTracks[trackName];
    } else {
        startTrack(track);
        _playingTracks[trackName] = trackName;
    }
}

//starts track animation and dispatch event for TrackMixer
private function startTrack(track:Sprite):void {
    Actuate.tween(track, 0.6, {alpha: 0.3}).reflect().repeat();
    dispatchEvent(new ObjectEvent(START_TRACK, track.name, true));

}

//stop track animation and dispatch event for TrackMixer
private function stopTrack(track:Sprite):void {
    Actuate.stop(track, "alpha");
    track.alpha = 1;
    dispatchEvent(new ObjectEvent(STOP_TRACK, track.name, true));
}

这是一个基本概念,与您试图实现的目标类似。您需要听一听按键,并使用特定的按键代码来处理正在按下的按键。如果您有很多按键命令,我建议使用开关盒

import flash.display.MovieClip;
import flash.events.KeyboardEvent;

var mc:MovieClip = new MovieClip();
mc.graphics.beginFill(0x000000);
mc.graphics.drawCircle(30,30,30);
mc.graphics.endFill();
stage.addEventListener(KeyboardEvent.KEY_UP,keyUp);

function keyUp(e:KeyboardEvent):void{
        if(e.keyCode == 81){//q
                addChild(mc);
            }
        if(e.keyCode == 87){//w
                if(mc.stage){
                        removeChild(mc);
                    }
            }
    }

它仍然会使用类似的概念,但是您需要以某种方式切换相同的键来播放和停止。布尔变量很适合跟踪按键的状态

import flash.display.MovieClip;
import flash.events.KeyboardEvent;

//Code to create a simple black circle xpos: 30 ypos: 30 radius: 30
var mc: MovieClip = new MovieClip();
mc.graphics.beginFill(0x000000);
mc.graphics.drawCircle(30, 30, 30);
mc.graphics.endFill();

//Adding event listener to stage for a key up event
stage.addEventListener(KeyboardEvent.KEY_UP, keyUp);

/*
Creating a boolean value to track "on" or "off" for one key. 
Default value for boolean is false.
*/
var bool: Boolean;


function keyUp(e: KeyboardEvent): void {
    if (e.keyCode == 81) {
        if (!bool) {
            addChild(mc);
            bool = true;
        } else {
            if (mc.stage) {
                removeChild(mc);
                bool = false;
            }
        }

    }
}
如果key==q且bool==false,则将mc添加到stage并将bool设置为true。 下次调用此方法时,bool将为true,在这种情况下,else语句
将被解雇,因为布尔不是假的。将检查阶段以查看mc是否存在以避免错误,mc将从阶段中删除,bool将设置回false以满足if语句bool为false的条件。

进行键盘交互非常简单,你到底坚持什么?看看我的答案,可能就是您要找的。@Cherniv,因为在本例中,我通过跟踪曲目名称来处理单击功能,如_playingtrack[trackName]=trackName;在数组中,但为了进行键盘交互,我必须制作16种不同的功能,对吗?@iggy嗨,我在那里看到了你的答案,但是如果我想制作像按下a触发声音,然后再次按下a停止声音这样的功能呢?@withinboy在这种情况下,你需要跟踪切换,这是一个简单的布尔值,例如:isSoundOn=true。您可以为每个键的切换创建一个包含255个条目的数组,当按下一个键时,将其设置为:toggles[e.keyCode]!=切换[e.keyCode];您好,谢谢您的概念,但是如果我想像按q键一样启动声音和动画,然后再按q键停止声音和动画,该怎么办?我可以使用同样的概念吗?谢谢,但是在这个例子中我使用的数组是:if trackName in _playingTracks{stopTracktrack;delete _playingTracks[trackName];}else{startTracktrack;_playingTracks[trackName]=trackName;}那么如果我想定义if.keyCode==81,然后播放曲目1环境1?我需要用1来定义1?或者我可以使用相同的方法_playingTracks[trackName]=trackName;同时检查钥匙码?谢谢你的耽搁,我去度假了。如果我记得你想按一个按钮进入下一个音轨?如果是这种情况,请输入某种计数器,然后按键时增加计数器,然后使用计数器播放数组值。e、 g.按下按钮,计数器增加到一个播放值[计数器],依此类推,直到达到数组长度并将计数器设置回0。