なんかねー、昨日と違うんすよねー、動きが。
とりあえずですね、
スペースキーを押す
↓
keypressedが受け取りThreadをスタート
↓
runメソッドが走り、そこで無限ループ(ゲーム開始)
↓
3つのボタンが全て押されるとゲームオーバー
ここまで出来ました。
スペースキーを押すとボタンが反応してしまう件については、ゲームがスタートするまでボタンを不活性にしておくことで回避出来ました。
この状態でボタンは不活性です。
スペースキーを押します。
runメソッドの中に組み込んだSystem.out.printlnが表示されます。ボタンは活性化するので、順次押します。
目論見通りです。
しかも、ボタンはまた不活性の状態に戻ります。
これで中を作り込めばゲームは出来る。
1回だけ!何故か。
次にもう一度スペースキーを押します。
ドカンとエラーが出ます。
見ると、140行目でしくじってる。
そこは何かと問われれば〜、あ、あん、あん、と。
そう。Threadを再びスタートさせている。
ま、runメソッドをもう一度動かそうとしている訳です。
で、そこで
java.lang.IllegalThreadStateException
「スレッドの状態が異常だよ〜ん」
と言ってきてるのだな、ということまではわかりました。
で、どう異常やねん、ということは僕の知識ではログからは分かりませんでした。英語読めないし。
isAlive()というメソッドを持っているのでスレッドの生死は確かめられそう。やってみます。
最初はfalseです。その後、スタートですからね。
一旦ゲームオーバーさせたあとに、
スペースキーを押すと、おろ、falseなんですね。
そうなんですか。
ということでisAliveを使った調査は敢えなく失敗。
なんつってるうちに、keypressedが動くのは最初の一度だけ、一度ゲームーオーバーになるともうキーの入力を受け付けません。
一つのクラスで全部やろうとしてるのに無理があるかしら。
なんでもimplementsすればいいってものじゃないのかも。
なんちゃってね。解決しちゃいました。フォーカスの問題でした。
runメソッドの中で、ボタンが全部押されて無限ループから抜けた後、Widow自身にフォーカスを戻してやることでkeypressedが生きるようになりました。
で、さっきのスレッド系のエラーですが、
なんと、keypressedの中でnewしてやることで解決してしまいました。
しかし、こうすると、インスタンスである、tはrunメソッドの中では見えません。で、スピードを制御するsleepは、
Thead.sleep(300);
なんかクラスメソッドとしてあるみたいなので。
ちゃんと効いてんのかな。
こんなベタな方法で調べます。
効いてる臭いです。
一応sleep(1000)にして見たらグンと遅くなりました。
ということで、外身は完成です。
keypressedとフォーカスの関係、
Treadをなんどもstartさせる時のやり方。
だんだん、分かってきました。
あくまで、勝手に実験的にやっていることなのでベストな方法ではないとは思います。念のため。