[[Turtle]]
----
論理思考とプログラミングで利用されている,Turtle ライブラリについて.
====== API (Turtle で利用できる命令) ======
===== 公開されている API =====
http://www.crew.sfc.keio.ac.jp/lectures/2007f_tcafe/html4/index_p7_c17.html#doc1_71
===== 公開されていない API =====
==== TextTurtle のサイズ変更 ====
|int|fontsize()|フォントのサイズ取得|
|void|fontsize(int size)|フォントのサイズを指定|
例:
TextTurtle message = new TextTurtle("ほげ");
message.fontsize(16); // フォントサイズを 16 に変更
message.fontsize(message.fontsize()/2); // フォントサイズを設定されている値の半分に変更
==== TextTurtle の色変更 ====
color() メソッドを使う.
必ず,**プログラムの1行目**に
import java.awt.Color;
を追加する.
例:
TextTurtle message = new TextTurtle("ほげ");
message.color(Color.RED); // 赤になる *1
message.color(new Color(0, 255, 0)); // 緑になる *2
*1 で指定できる色は,以下の通り.
|赤|Color.RED|
|黒|Color.BLACK|
|青|Color.BLUE|
|シアン|Color.CYAN|
|濃いグレー|Color.DARK_GRAY|
|グレー|Color.GRAY|
|緑|Color.GREEN|
|明るい緑|Color.LIGHT_GREEN|
|マゼンタ|Color.MAGENTA|
|オレンジ|Color.ORANGE|
|ピンク|Color.PINK|
|赤|Color.RED|
|白|Color.WHITE|
|黄色|Color.YELLOW|
*2 は,rgb を数字で直接指定する方法です.r(red)を0-255,g(green)を0-255,b(blue)を0-255の割合で混ぜた色になります.http://www.hi-ho.ne.jp/douton/htmlcolor.html とかで細かな色をみることができます.
==== プログラム中に存在する全ての Turtle オブジェクトを取得する ====
|ArrayList|this.getAllInstances()|プログラム中に存在する全ての Turtle オブジェクトを取得する|
例:
TextTurtle hoge1 = new TextTurtle("hoge1");
TextTurtle hoge2 = new TextTurtle("hoge2");
TextTurtle hoge3 = new TextTurtle("hoge3");
ArrayList allObject = (ArrayList)this.getAllInstances();
for (int i=0; i
==== オブジェクトの正確な座標を取得したい ====
授業で解説された getX(), getY() は,オブジェクトの真ん中(重心)の座標を返す.正確な座標を取得したい場合は,minX(), minY() メソッドを利用する.
|int|minX()|オブジェクトの左端の座標取得|
|int|minY()|オブジェクトの上端の座標取得|
例:
ImageTurtle image = new ImageTurtle("hoge.png");
print(image.getX()); // オブジェクトの重心の x 座標
print(image.getY()); // オブジェクトの重心の y 座標
print(image.minX()); // オブジェクトの左端のx座標
print(image.minY()); // オブジェクトの上端のy座標
print(image.minX() + image.getWidth()); // オブジェクトの右端のx座標
print(image.minY() + image.getHeight()); // オブジェクトの下端のy座標
====== 授業で教えていなくて,ゲーム作成に便利そうな java の機能 ======
===== オブジェクトのクラス名取得 =====
例:
ImageTurtle gaozu = new ImageTurtle("gazou.png");
print(gazou.getClass().getName()); // ImageTurtle と出力される
===== java で提供されている配列(入れ物) =====
ArrayList クラス(という機能)を利用します.
例:画像を 10 個読み込んでから,少しずつ右に移動させる場合
ArrayList list = new ArrayList();
for (int i=0; i<10; i++) {
ImageTurtle image = new ImageTurtle("hoge.png");
list.add(image);
}
*1
for (int i=0; i
ArrayList list = new ArrayList;
* list という名前の配列を準備する.
list.add(image)
* list に読み込んだ画像(image)を追加する.
*1 の時点で,配列は以下のようになっている
|0|1|2|3|4|5|6|7|8|9|
|image|image|image|image|image|image|image|image|image|image|
list.size()
* list の要素の個数を取得する.上記例の場合,10 が返る.
(ImageTurtle)list.get(i)
* list の i 番目の要素を取得する.取得した要素は (ImageTurtle) とキャストしなければならない.なぜなら,ArrayList に一度オブジェクトを追加すると,オブジェクトの情報(ImageTurtleとかTextTurtleとか)が失われてしまうので,明示する必要があるのです.
===== 精度の高いキーボード情報の取得 =====
Turtle 環境では,key() 命令を使えば押されたキーボードの情報が取得できますが,少し凝ったゲームを作ろうとした場合,キーが押された瞬間と離れた瞬間を取得したかったり,同時に押されたキーを取得したかったりします.それを実現するためには,KeyListener という java が提供する機能を直接利用した方が精度の高い情報を取得できます.(key() 命令も内部的には同じ機能を使っています)
必ず**プログラムの1行目**に
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
を追加してください.
public class Test extends Turtle ''implements KeyListener''{
public static void main(String[] args) {
Turtle.startTurtle(new Test());
}
int pressed_keycode = 0;
int released_keycode = 0;
public void start() {
while (true) {
print("pressed_keycode: " + pressed_keycode + ", released_keycode: " + released_keycode);
}
}
''public final void keyTyped(final KeyEvent keyEvent) {''
''; ''
''}''
''public final void keyPressed(final KeyEvent keyEvent) {''
''pressed_keycode = keyEvent.getKeyCode();''
''}''
''public final void keyReleased(final KeyEvent keyEvent) {''
''released_keycode = keyEvent.getKeyCode(); ''
''}''
}}
keyListener を利用するには,class の定義をしている行に,**implements keyListener** を付け加えます.これにより,対象クラス(上記例では Test クラス)にキーボードの状態を取得する機能を追加します.
keyListener 機能を追加したときの java の約束として,void keyTyped(KeyEvent keyEvent), void keyPressed(KeyEvent keyEvent), void keyReleased(KeyEvent keyEvent) というメソッドをクラス内に実装しなければなりません.なぜ上記 3 つかと言うと,キーボードが押された,という動作は,以下の二つに分解できるからです.
- キーボードが押された状態になった
- キーボードが離された
1. の状態は keyPressed メソッドで取得します.2. の状態は keyReleased で取得します.そして,両方を合わせた状態を keyTyped メソッドで取得します.
Turtle の key() メソッドとは違い,キーコードはキーボードが押された時点で取得されます.通常は start() メソッド内の命令が実行されていますが,キーボードが押された瞬間,start() 内の命令は中断され対応するメソッド(keyTypedなど)が実行されます.実行が終了したら,中断していた start() メソッド内の命令実行を再開します.キーコードの取得には,keyEvent.getKeyCode() という命令を使います.ここでは KeyEvent というクラスが出てきていますが,この概念を説明するとまた長くなってしまうので,ここでは keyEvent.getKeyCode() でキーコードが取得できるとだけ理解しておいてください.
上記プログラムを実行したとすると,キーボードを押している間はずっと,pressed_keycode にそのキーコードが入ります.離した瞬間,released_keycode に離したキーコードが入ることになります.
pressed と released が分離して取得できることにより,例えば以下のコードでは,右と左矢印が押されている状態を取得できます.
public class Test2 extends Turtle ''implements KeyListener''{
public static void main(String[] args) {
Turtle.startTurtle(new Test());
}
int keycode_left = 0;
int keycode_right = 0;
public void start() {
while (true) {
if (keycode_left == 1) {
print("左キーが押されている状態です.");
}
if (keycode_right == 1){
print("右キーが押されている状態です.");
}
}
}
public final void keyTyped(final KeyEvent keyEvent) {
;
}
public final void keyPressed(final KeyEvent keyEvent) {
int pressed_keycode = keyEvent.getKeyCode();
if (pressed_keycode == 37){
keycode_left = 1;
} else if (pressed_keycode == 39) {
keycode_right = 1;
}
}
public final void keyReleased(final KeyEvent keyEvent) {
int released_keycode = keyEvent.getKeyCode();
if (released_keycode == 37){
keycode_left = 0;
} else if (released_keycode == 39) {
keycode_right = 0;
}
}
}}