if( Greenfoot.isKeyDown( "z" ) ){
String answer = Greenfoot.ask( "好きな食べ物は?" );
getWorld().showText( answer, 100, 50 );
// マウスが World 外にある時は null になるので注意
MouseInfo minfo = Greenfoot.getMouseInfo();
if( minfo != null ){
// マウス座標取得
int x = minfo.getX();
int y = minfo.getY();
getWorld().showText( "x="+x+",y="+y, 100, 50 );
// マウスボタンのクリック時に押したボタン番号を取得
// クリックした時だけ数値が入る。押しっぱなしの時やボタンを離した時は 0 になるので注意
int button = minfo.getButton();
if( button != 0 ){
getWorld().showText( "button="+button, 100, 100 );
// マウスを動かした時にカーソルの下にいるアクターを取得
// マウスを動かしてない時は null になるので注意
Actor actor = minfo.getActor();
if (actor != null){
getWorld().showText( "actor="+actor.getClass().getName(), 100, 150 );
public hoge(){
img_bkup = new GreenfootImage( getImage() );
getImage().scale( width,height );
public void act()
GreenfootImage img = new GreenfootImage(img_bkup);
// (注意) scale で画像サイズを変更してから setImage すること
img.scale( width++,height++ );
setImage(img);
public hoge(){
img_bkup = new GreenfootImage( getImage() );
getImage().scale( width,height );
public void act()
GreenfootImage img = new GreenfootImage(img_bkup);
// (注意) setImage してから scale で画像サイズを変更すると当たり判定が変になる
setImage(img);
getImage().scale( width++,height++ );
public class hoge extends Actor
private boolean movingleft = true; // 画像が右向きの場合は false をセット
public void act()
int x = getX();
int y = getY();
if( Greenfoot.isKeyDown( "left" ) ){
if( ! movingleft ){
movingleft = true;
getImage().mirrorHorizontally();
setLocation( x-1,y );
if( Greenfoot.isKeyDown( "right" ) ){
if( movingleft ){
movingleft = false;
getImage().mirrorHorizontally();
setLocation( x+1,y );
if( Greenfoot.isKeyDown( "up" ) ){
setLocation( x,y-1 );
if( Greenfoot.isKeyDown( "down" ) ){
setLocation( x,y+1 );
連想配列を使って左を押すと left.png、右を押すと images フォルダ内にある right.png に切り替える例
この例ではクラス名を hoge としているので適宜変更する
import java.util.HashMap;
public class hoge extends Actor
private HashMap<String,GreenfootImage> imgmap = new HashMap<String,GreenfootImage>();
public hoge()
imgmap.put("left",new GreenfootImage( "images/left.png" ));
imgmap.put("right",new GreenfootImage( "images/right.png" ));
public void act()
if( Greenfoot.isKeyDown( "left" ) ){
setImage(imgmap.get("left"));
else if( Greenfoot.isKeyDown( "right" ) ){
setImage(imgmap.get("right"));
if( Greenfoot.isKeyDown( "space" ) ){
World game = new WorldGame();
Greenfoot.setWorld( game );
左キーを押したら images フォルダ内にある img1.png を座標(100,100)に、 img2.png を座標(200,200)に描画する例
public class MyWorld extends World
public MyWorld()
super(600, 400, 1);
public void act()
if( Greenfoot.isKeyDown( "left" ) ){
GreenfootImage img1 = new GreenfootImage( "images/img1.png" );
GreenfootImage img2 = new GreenfootImage( "images/img2.png" );
getBackground().drawImage( img1, 100, 100 );
getBackground().drawImage( img2, 200, 200 );
super(800, 450, 1); // 画像サイズをセットする
back = new GreenfootImage( "./images/back.jpeg" );
back_flop = new GreenfootImage( "./images/back_flop.jpeg" );
back_width = back.getWidth();
public void act()
back_x += back_dx;
if( back_x > 0){
back_x -= back_width;
flop = !flop;
if( back_x < -back_width ){
back_x += back_width;
flop = !flop;
getBackground().drawImage( flop ? back_flop : back, back_x, 0 );
getBackground().drawImage( flop ? back : back_flop, back_x+back_width, 0 );
showText( "back_x : "+ back_x, 100, 10 );
if( Greenfoot.isKeyDown( "space" ) ){ // スペースで MyWorld2 表示
World world2 = new MyWorld2();
Greenfoot.setWorld( world2 );
// MyWorld で定義されているカウンタを利用
MyWorld.counter++;
showText( "counter = " + MyWorld.counter, 100, 50 );
if( Greenfoot.isKeyDown( "space" ) ){
getWorld().addObject( new TAMA(), getX(), getY() );
if( Greenfoot.isKeyDown( "space" ) ){
if( flag_tama == false ){
getWorld().addObject( new TAMA(), getX(), getY() );
flag_tama = true;
else flag_tama = false;
if( Greenfoot.isKeyDown( "space" ) ){
if( flag_tama == 0 ){
getWorld().addObject( new TAMA(), getX(), getY() );
flag_tama = 50; // 数字を変えると発射間隔が変わる
A. まず sounds フォルダの中に音声ファイルを入れます。
音声ファイルの形式は wav や MP3(※) 等です ※ greenfoot のバージョンが古いと MP3を再生出来ない場合があります
それからコンストラクタの中で GreenfootSound クラスからそのファイルを読み込み、started メソッドで playLoop メソッドを、 stopped メソッドで stop メソッドを呼び出します。
MyWorld と MyWorld2 があって、Hoge というキャラクタが space キーを押すとワールドとBGM(test.mp3 → test2.mp3)を切り替える例
・ MyWorld クラス
public class MyWorld extends World
GreenfootSound bgm = null;
public MyWorld()
super(600, 400, 1);
bgm = new GreenfootSound( "test.mp3" );
public void started()
bgm.playLoop();
public void stopped()
bgm.stop();
・ MyWorld2 クラス
public class MyWorld2 extends World
GreenfootSound bgm = null;
public MyWorld2()
super(600, 400, 1);
bgm = new GreenfootSound( "test2.mp3" );
public void started()
bgm.playLoop();
public void stopped()
bgm.stop();
・ Hoge クラス
public class Hoge extends Actor
public void act()
if( Greenfoot.isKeyDown( "space" ) ){
getWorld().stopped();
World world = new MyWorld2();
Greenfoot.setWorld( world );
world.started();
A. タイトルロゴを Actor クラスのサブクラスとして作っておき、 World のフィールドで定義します。
それから World のコンストラクタで addObject() して表示しておき、run を押したら act() の中で一回だけ removeObject() を呼び出して消します。
例えば下の様にします。
import greenfoot.core.TextLabel;
import greenfoot.WorldVisitor;
import greenfoot.util.GraphicsUtilities;
import java.util.ArrayList;
import java.awt.Graphics2D;
public class MyWorld extends World
// Reffered from core/TextLabel.java
// Licence: GPL2
class TextLabelEx extends TextLabel
boolean enable;
int xpos;
int ypos;
int size;
boolean bold;
greenfoot.Color gfcolor;
java.awt.Color color;
String text;
String[] lines;
private GraphicsUtilities.MultiLineStringDimensions dimensions = null;
@Override
public int getX(){ return xpos;}
@Override
public int getY(){ return ypos;}
@Override
public String getText(){ return text;}
public TextLabelEx(String _text, int _xpos, int _ypos, int _size, boolean _bold, greenfoot.Color _gfcolor )
super("", 0, 0 );
lines = new String[1];
xpos = _xpos;
ypos = _ypos;
reset( _text, _size, _bold, _gfcolor );
public void reset( String _text, int _size, boolean _bold, greenfoot.Color _gfcolor )
if( text == _text && size == _size && bold == _bold && gfcolor == _gfcolor ) return;
text = _text;
size = _size;
bold = _bold;
gfcolor = _gfcolor;
lines[0] = text;
dimensions = null;
if( text.length() == 0 ) enable = false;
else enable = true;
@Override
public void draw(Graphics2D g, int cellsize)
if( !enable ) return;
if(dimensions == null) {
dimensions = GraphicsUtilities.getMultiLineStringDimensions(lines, bold ? java.awt.Font.BOLD : java.awt.Font.PLAIN, size);
color = new java.awt.Color( gfcolor.getRed(), gfcolor.getGreen(), gfcolor.getBlue(), gfcolor.getAlpha() );
int ydraw = ypos * cellsize - dimensions.getHeight() / 2 + cellsize / 2;
int xdraw = xpos * cellsize - dimensions.getWidth() / 2 + cellsize / 2;
g.translate(xdraw, ydraw);
GraphicsUtilities.drawOutlinedText(g, dimensions, color, java.awt.Color.BLACK);
g.translate(-xdraw, -ydraw);
public void showTextEx(String text, int x, int y, int size, boolean bold, greenfoot.Color color )
for( TextLabel label : WorldVisitor.getTextLabels(this) ){
if( label.getX() == x && label.getY() == y ){
if( label instanceof TextLabelEx ){
((TextLabelEx)label).reset(text, size, bold, color);
return;
WorldVisitor.getTextLabels(this).add(new TextLabelEx( text, x, y, size, bold, color ) );
//showText( "labels: "+WorldVisitor.getTextLabels(this).size(), 80, 20 );
public MyWorld()
super(600, 400, 1);
((MyWorld)getWorld()).showTextEx( 文字列, x 座標, y 座標, サイズ, 太字(true か false ), 色 );
※ 色は
マニュアル
の Color のページを参考
使用例: ((MyWorld)getWorld()).showTextEx("hoge", 200, 200, 64, false, Color.RED );