ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

GAINER.CCコミュのLEDマトリクスの個別制御について

  • mixiチェック
  • このエントリーをはてなブックマークに追加
はじめまして。最近Gainerを始めた初心者です。
少し行き詰まってしまったので質問させてください。

ActionScriptを使って8×8LEDマトリクスの点灯を個別に制御できるようなコードを書きたいのですが、うまく作動してくれません。
シンタックスチェックをしてもエラー等は発見されませんでした。

内容としては、スペースバーを押しているときだけ一番左上のLEDだけ点灯、押していないときは消灯というものです。

開発環境は、
Windows XP
Flash Pro 8

以下現在書いているコードです。


import gainer.*;

var gio:Gainer = new Gainer("localhost", 2000, Gainer.MODE7, true);

var pattern:Array = new Array;
var a1

var keyListener:Object = new Object();
keyListener.onKeyDown = function(){
if (key.getCode() == 32) {
a1 = 15;
}
else {
a1 = 0 }
};

Key.addListener(keyListener);

pattern = new Array(
a1, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0
);


gio.onReady = function() {
this.onFinished = function() {
gio.scanMatrix(pattern);
};
};

以上です。

よろしくお願い致します。

コメント(13)

まずはtrace文などを使って、意図するとおり動いていない部分を特定するべきだと思います。

キー入力によるa1の変化が上手くいかないのか、scanMatrixが呼び出されていないのか、scanMatrixが呼び出されたときのpatternはどうなっているか。


ActionScriptのコミュニティでも同様のコードで質問されていましたが、そちらでも
「※うまくいきませんでは、何がどううまく行かないのか、回答者にも分かりません。
 今後の質問時には注意した方が良いと思います。」
とコメントをいただきましたよね?

このコードで言えば、「scanMatrixが呼び出されない」「a1の値が変化しない」といったところまで分かっていればコメントも得られやすいと思います。

苦言失礼いたしました。
Gainerは手元に無いのでscanMatrixが呼ばれているかは分かりませんが、他の部分を検証してみました。

key.getCode()ではなくKey.getCode()です。ActionScriptのコミュでも指摘されていましたが・・・

pattern = new Array( a1, 0, 0・・・)とすると、patternという配列が作られるときにa1に入っている値が代入されます。このとき、a1が何かは宣言されていないのでundefinedになります。

これは、pattern = new Array(・・・の次の行に、trace(pattern);とすると、分かると思います。

スペースキーが押されたときにa1の部分を変えたいのであれば、

if (key.getCode() == 32) {
  pattern[0] = 15;
}
else {
  pattern[0] = 0;
}

とすると良いと思います。

あと、このままだと、キーが押されたときしか反応しないので、スペースキーを押す→左上点灯、スペースキーを離す→左上点灯、他のキーを押す→左上消灯、という動作になります。

スペースキーを離したときに左上を消灯したい場合にはonKeyUpイベントも追加する方法がありますが、他にも方法はあると思います。(scanMatrixする前に押されているキーを調べる等)


※ActionScriptが初めてなのか、プログラミング自体初めてなのか教えていただかないとどの程度掘り下げて説明すべきか困ります。
訂正
誤)if (key.getCode() == 32) {
正)if (Key.getCode() == 32) {
コメントありがとうございます。
確かにおっしゃる通りです。色々ご迷惑おかけして申し訳ありません。
プログラミング自体が初心者で、質問の際のルールやノウハウについても無知でした。というかむしろ質問する上での一般常識ですよね。。。

アドバイス頂いたtraceをやってみたのですが、trace(a1)に対してundefineと返ってきました。スペースバーを押していないときは0が返ってくるはずなので、a1の値がうまく定義できていないようです。
scanMatrixに関しては、var a1=15とするとLEDは光るので、呼び出されていると思います。

というかそもそもLEDマトリクスのキーボードによる個別制御が可能なのかすら疑わしく思えてきました。
アドバイス等があれば幸いです。
よろしくお願いします。
すいません入れ違いでコメントしてしまいました。
アドバイスありがとうございます。試してみます。
ActionScriptどころかプログラミング自体が初心者です。
最終的にどういったことがしたいのかにもよりますが・・・。

キーボードによる個別制御は可能だと思います。

switch文で処理したいキーコードをcaseで分けて、変えたいLEDの部分に相当する配列の値を変えれば良いので。
ただ、複数同時に押すの予定があるのであれば話は別ですが。


スペースキーを押したときだけ光るコードを書いてみました(確認はしていませんが
ちょっと下のコードを試しに実行してみてください。

import gainer.*;

var gio:Gainer = new Gainer("localhost", 2000, Gainer.MODE7, true);

var pattern:Array = new Array(
a1, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0
);

function checkKeyDown () {
if (Key.getCode() == 32) {
pattern[0]=1;
}
else {
pattern[0] = 0;
}
};

gio.onReady = function() {
this.onFinished = function() {
checkKeyDown();
gio.scanMatrix(pattern);
};
};
訂正・・・
誤)
var pattern:Array = new Array(
a1, 0, 0, 0, 0, 0, 0, 0,

正)
var pattern:Array = new Array(
0, 0, 0, 0, 0, 0, 0, 0,
そもそもやりたいことが間違って伝わっているかもしれないので追伸致します。

現在は一番左上のLEDの点滅だけを制御しようとしていますが、最終目標は
pattern = new Array(a1,a2,a3.......)というように配列すべてに変数を与えて、任意のLEDをキーボードを使って光らせるようにすることです。同時に複数を押すこともあります。
後出しジャンケンみたいになって申し訳ないです。一つのLEDを制御できたらあとは同じことをやればいいとおもって最初のような質問をしました。

いただいたコードを実行してみたところ、スペースを押したときに光りましたが、離しても消えませんでした。別の条件を加える必要があるようです。

というかキーボードに反応して光っただけで今感動してます。ありがとうございます。
if (Key.getCode() == 32) {
を
if (Key.isDown(32)) {
にするとどうでしょうか?
同時押しについても、isDownを使えばいけそうな気がします。

グーグルで「ActionScript 同時押し」で検索して(多分)上から4番目の「キーボード情報取得・・・」というサイトが少し参考になると思います。
> if (Key.getCode() == 32) {
> を
> if (Key.isDown(32)) {
> にするとどうでしょうか?

試してみましたがダメのようです。
`キーボードを離した`という信号を別に送らなければいけないようですね。
少し悩んでみます。

教えていただいたサイトも参考にさせていただきます。
夜遅くまで付き合っていただいて申し訳ないです。
Key.getCodeをkey.isDownに変えたらいけました!!
ありがとうございます!
遅くまで一緒に悩んでくれて本当にありがとうございます!
こんなに親切に教えていただけるとは思っていませんでした。
本当に助かりました。
質問する際のマナーの勉強にもなりました笑
本当にありがとうございます。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

GAINER.CC 更新情報

GAINER.CCのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング