LoginSignup
13
12

More than 5 years have 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言語くんかわいい

13
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
12