Scratchの猫を表示させる

画像のサイズ変換

Scratchのインストールフォルダには、cat1-a.gifとcat1-b.gifがあります(95×111)。このままでは大きすぎるので、サイズを変更します(32×37)。このような画像変換などはiveiewが適当かと思われます。ここでは、さらにBMPに変換します。
cat1-a.gifcat1-b.gif
リソースを登録する

プロジェクトのプロパティをクリックします
リソースを選びます
リソースの追加の右側の三角をクリックします
既存のファイルの追加をクリックします
ファイルを選択すると追加されます。このアイコンをダブルクリックすると編集モードになります。
右下のプロパティのところの形式を16bpp BGR565にします。これを行わないと、これからこのリソースを読み込んで、プログラムで表示できる形式に変換できません。同様にcat1-b.bmpも読み込んでください。



猫を歩かせる
public partial class Program
{
    //                                                              x   y
    static BrainPad.Display.Image cat1 = new BrainPad.Display.Image(32, 37);
    static BrainPad.Display.Image cat2 = new BrainPad.Display.Image(32, 37);
    private void main()
    {
        BrainPad.Display.Clear();
        BrainPad.LightBulb.SetColor(BrainPad.Color.Black);
        getResourceBmp(cat1, Resources.BinaryResources.cat1_a);
        getResourceBmp(cat2, Resources.BinaryResources.cat1_b);
        while (true)
        {
            BrainPad.Display.DrawImage(64, 80, cat1);
            Thread.Sleep(500);
            BrainPad.Display.DrawImage(64, 80, cat2);
            Thread.Sleep(500);
        }
    }

    static void getResourceBmp(BrainPad.Display.Image image, Resources.BinaryResources id)
    {           // 16bpp BGR565から変換する
        byte[] z = (byte[])
                ResourceUtility.GetObject(Resources.ResourceManager, id); //32*37=2368
        BrainPad.Color color = new BrainPad.Color();
        int dt = 0x42;      // BMPのデータ開始アドレス
        for (int Y = image.Height - 1; Y >= 0; Y--)
        {
            for (int X = 0; X < image.Width; X++)
            {    // ピクセルデータの取得
                byte d = z[dt++];
                byte e = z[dt++];
                color.B = (byte)(d & 0x1f);
                color.G = (byte)(((d & 0xe0) >> 5) + ((e & 0x07) << 3));
                color.R = (byte)((e & 0xf8) >> 3);
                image.SetPixel(X, Y, color);
            }
        }
    }
}
 1 
 2 
 3 
 4 表示用オブジェクトを作る
 5 画像の入れ物を作る
 6 
 7 
 8 ディスプレイ消去
 9 
10 リソースからオブジェクトに変換
11 
12 
13 
14 x=64,y=80に表示させる
15 
16 
17 
18 
19 
20 
21 
22 
23 リソースオブジェクトデータを
24 一次元配列として得る
25 カラーオブジェクト
26 ヘッダーデータを飛ばす
27 
28 
29 
30 
31 
32 
33 BGR565からLCD用bitmapに変換する
34 
35 
36 
37 
38 
39 
40 


手をたたくとびっくりして飛び上がる猫
 BrainPadにはマイクが無いので、マイクの回路を作る必要があります。


びっくり猫
public partial class Program
{
    //                                                              x   y
    static BrainPad.Display.Image cat1 = new BrainPad.Display.Image(32, 37);
    static BrainPad.Display.Image cat2 = new BrainPad.Display.Image(32, 37);
    static  ADcon mic;
    static bool jumpState=false;
    private void main()
    {
        BrainPad.Display.Clear();
        BrainPad.LightBulb.SetColor(BrainPad.Color.Black);
        getResourceBmp(cat1, Resources.BinaryResources.cat1_a);
        getResourceBmp(cat2, Resources.BinaryResources.cat1_b);
        mic = new ADcon(CPU.E1);
        while (true)
        {
            BrainPad.Display.DrawImage(64, 80, cat1);
            Thread.Sleep(500);
            if (jumpState) jump();
            BrainPad.Display.DrawImage(64, 80, cat2);
            Thread.Sleep(500);
            if (jumpState) jump();
        }
    }

    static void micIn(object ob)
    {
        if (mic.Read() > 0.51) jumpState = true;
    }
    static void jump()
    {
        BrainPad.Display.DrawFilledRectangle(64, 80, 32, 37, BrainPad.Color.Black);
        BrainPad.Display.DrawImage(64, 20, cat1);
        Thread.Sleep(1000);
        BrainPad.Display.DrawFilledRectangle(64, 20, 32, 37, BrainPad.Color.Black);
        jumpState = false;
    }
    static void getResourceBmp(BrainPad.Display.Image image, Resources.BinaryResources id)
    {           // 16bpp BGR565から変換する
        byte[] z = (byte[])
                ResourceUtility.GetObject(Resources.ResourceManager, id); //32*37=2368
        BrainPad.Color color = new BrainPad.Color();
        int dt = 0x42;      // BMPのデータ開始アドレス
        for (int Y = image.Height - 1; Y >= 0; Y--)
        {
            for (int X = 0; X < image.Width; X++)
            {    // ピクセルデータの取得
                byte d = z[dt++];
                byte e = z[dt++];
                color.B = (byte)(d & 0x1f);
                color.G = (byte)(((d & 0xe0) >> 5) + ((e & 0x07) << 3));
                color.R = (byte)((e & 0xf8) >> 3);
                image.SetPixel(X, Y, color);
            }
        }
    }
}
 1 
 2 
 3 
 4 
 5 
 6 マイクの音をアナログ入力する
 7 音がしたかのチェック
 8 
 9 
10 
11 
12 
13 
14 マイク入力ははE1に接続する
15 
16 
17 
18 
19 大きい音がしたらジャンプする
20 
21 
22 
23 
24 
25 
26 
27 
28 大きい音の検出。0.5が無音
29 
30 猫をジャンプさせる
31 
32 
33 
34 
35 
36 
37 
38 説明は前項にしている
39 ので上記を参照してください
40 
41 
42 
43 
44 
45 
46 
47 
48 
49 
50 
51 
52 
53 
54 
55 
56 
57 



動作している動画を見る。