• 12
    Like
  • 0
    Comment
More than 1 year has passed since last update.

D言語くんかわいい

dman_optimized.gif

ボタンを押すと「D言語くんかわいい」と表示されます。D言語くんかわいい。

ソースコードの説明

app.d
import std.stdio;
import std.random;
//サンプルコードにはdlangui.allと書いてるけどこう
import dlangui;

//サンプルコードにはDLANGUI_ENTRY_POINTと書いてるけど変わってる
mixin APP_ENTRY_POINT;

extern(C) int UIAppMain(string[] args)
{
    Platform.instance.uiLanguage = "ja";
    //UIのテーマを設定
    Platform.instance.uiTheme = "theme_default";

    //Windowを生成
    auto window = Platform.instance.createWindow("Hello World!",null);
    //日本語フォントの読み込み。デフォルトでは豆腐になった
    auto jaFont = FontManager.instance.getFont(20,FontWeight.Normal,false,FontFamily.MonoSpace,"JKゴシックM");
    //HorizontalLayoutを継承した「D言語くん可愛い」の文字が表示されるウィジェット
    auto layout = new DmanLayout(jaFont);
    //D言語くんクラス。画像表示するだけ
    auto dman = new Dman;
    //ボタン。Buttonを継承してフォントを変更出来るようにした
    auto btn = (new JaButton(jaFont)).text("D言語くん可愛い!!!");
    //ボタンが押された時に実行されるデリゲートを代入。引数で渡されるsrcはイベントの起こったWidget
        btn.onClickListener = delegate(Widget src)
        {
            layout.kawaii(); //「D言語くん可愛い」を表示
            return true;
        };
    layout.addChild(dman);
    layout.addChild(btn);
        //Windowにlayoutを追加
    window.mainWidget = layout;
    //表示
        window.show();
     //メッセージループ突入
    return Platform.instance.enterMessageLoop();
}

class DmanLayout : HorizontalLayout
{
private:
    //「D言語くん可愛い」を描画する位置の集合
    Point[] textPositions;
    FontRef jaFont;
    this(FontRef jaFont)
    {
        this.jaFont = jaFont
        backgroundColor = 0xFFFFC0;
    }
    //JavaのSwingで言うところのpaint。
    override void onDraw(DrawBuf buf)
    {
        //親メソッドのonDrawを呼び出す。これをしないと背景が描画されなかったり
        super.onDraw(buf);
        //すべての「D言語くん可愛い」を再描画
        foreach(str;textPositions)
            jaFont.drawText(buf,str.x,str.y,"D言語くん可愛い",0xFF0000);
    }
    void kawaii()
    {
        auto rndX = uniform(0,width);
        auto rndY = uniform(0,height);
        textPositions ~= Point(rndX,rndY);
        //onDrawの呼び出しを要求する
        invalidate();
    }
}

class Dman:Widget
{
private:
        DrawBuf image;
    this()
    {
                //画像をロード。DrawBufを継承したColorDrawBufというものが返ってくる
        image = loadImage("compiler-dmd.png");
                //ピクセル数も簡単に取得
        layoutHeight = image.height;
        layoutWidth = image.width;
    }
    override void onDraw(DrawBuf buf)
    {
        super.onDraw(buf);
        //渡されたDrawBufに描画
        buf.drawImage(0,0,image);
    }
}

class JaButton:Button
{
private:
        FontRef jaFont;
    this(FontRef jaFont)
    {
        this.jaFont = jaFont;
        //最大の高さを設定
        maxHeight = 100;
        //余白の設定
        margins = Rect(50,50,50,50);
    }
    //fontメソッドをオーバーライドして使用されるフォントを変更
    override FontRef font() @property const
    {
        return cast(FontRef)jaFont;
    }
}

struct Point
{
    int x,y;
}               

DlangUIなかなか楽で楽しいです。デリゲートを使ったりとD言語の機能を使えるのがなかなかいいです。D言語くんかわいい