2019年8月31日土曜日

Domidoで音源を変更して音を綺麗にリアルにする方法!!<MIDIシーケンサーDominoでSGM-V2.01を使用する>


はい、こんにちは。

皆さん、「Domino」っていうフリーソフト、ご存知ですか。



ピザじゃないです。
ドミノ・ピザ|HUNGRY TO BE BETTER - 宅配もお持ち帰りもピザはネット注文が便利!


それから、板とかを並べて倒していくやつでもないです。



この記事でいう「Domino」というのは、高機能で使いやすい無料のMIDIシーケンサーです。


音楽の楽譜を表すMIDIというファイル編集するためのものですね。



さすがにDAWとまではいきませんが、MIDIの打ち込みだったり、簡単な作曲くらいはDominoでもできます。

なんせ無料ですから、入門者には手が届きやすいですよね。




そんなDominoなんですが、大きな欠点を1つ挙げるとすれば、初期の音源がしょぼくて、リアリティがないことです。

これはDominoのせいというよりは、Windowsが悪いですね。



Dominoは初期の状態では、音源として、Windows標準搭載の「Microsoft GS Wavetable SW Synth(以後、MSGS)」を使用しています。


Windows XPまでは、これを変更とかできたらしいですが、それ以降のOSでは、できなくなっている模様。



これを何とかしたくていろいろと調べてみたところ、「XPモードを使用」だとか、「Windows7でYamaha XGを使う方法(64bit)」だとか、「DAWソフトにVSTを読み込む」だとか「サウンドフォントを使う」だとかいくつか方法が出てきました。

しかし、XPを使うというのはあまりやりたくないし、YamahaのXGも32bitじゃないといけないとかそうじゃないとか定かじゃない、それに、 設定がかなり大変そうでした。



ということで、僕がおすすめするのは「サウンドフォント」を使用する方法です。

準備が簡単で、64bit/32bit関係なく、Windows10でも動きます。


DAWにVSTを読み込ませる方法に比べたら、音は劣るのかもしれませんが、個人的には、サウンドフォントでも十分です。

ということで、実際にやっていきましょう。
記事の最後には、MSGSとサウンドフォント(今回は、SGM_v2.01というサウンドフォントを使用しました。)との比較動画も載せておきます。


VirtualMIDISynth + SGM-V2.01でDominoの音を素晴らしくする



Dominoでサウンドフォントを使用するためには、「VirtualMIDISynth」と いうフリーソフトをインストールする必要があります。

このソフトに各自用意したサウンドフォントを読み込ませ、Dominoの出力先をこのソフトに 設定することで、良い音が出るという仕組みになります。



サウンドフォントにもいろいろ種類があるのですが、今回は「SGM-V2.01」というサウンドフォントを使用します。


いろいろなサイトでこのサウンドフォントがおすすめ・紹介されていたため、そして、音が良く、いろいろな楽器が一通りそろっていてお得だからです。



では、VirtualMIDISynthのインストールから始めます。


まず、こちらのサイトにアクセスしてください。

http://coolsoft.altervista.org/en/virtualmidisynth#download


こんな画面が開くと思うので、一番上のバージョンをダウンロードします。



ダウンロードしたら起動してインストールを開始します。



言語を選択します。



「次へ」をクリック。



「次へ」をクリック。



インストール先を決めて、「次へ」をクリック。



「インストール」を押します。



自分好みにチェックを入れて、「次へ」を押します。



「完了」を押して、インストールを終わらせます。



VirtualMIDISynthのインストールが終わりましたので、次はサウンドフォントをダウンロードします。


今回使用する「SGM-v2.01」は、こちらのリンクからダウンロードできます。

https://ja.osdn.net/projects/sfnet_androidframe/downloads/soundfonts/SGM-V2.01.sf2/


拡張子が「sf2」となっているファイルがダウンロードされると思いますので、Cドライブ直下 とかに適当なフォルダ(例:soundfonts)などを作り、その中に入れておきましょう。



ここまでできたら、VirtualMIDISynthを起動して、「+」ボタンから、今ダウン ロードしたサウンドフォントファイルをリストに追加します。



これができたら、もうほぼ作業は完了ですね。


あとは、Dominoを起動し、「環境設定」の「MIDI-OUT」から、「MIDI OUT デバイス」を「VirtualMIDISynth #1」に変更するだけです。



どうでしょう。
Microsoftの音源と比べて、音質に変化は現れたでしょうか。

おそらく、高音質できれいなリアルな音になっていると思います。




ネット上にあった、「MEGALOVANIA」のMIDIフィルとかは、SGM-v2.01で聞くとすごかったです。


ぜひ、試してみてください。
これで終わります。

また次回お会いしましょう。


2019年8月25日日曜日

メインアドレスでも捨てアドでも便利なYahooメールの紹介!<超簡単に取れるフリーメールアドレス>


こんにちは。


ネットを使っていると、メールアドレスが必要になることがよくあると思いますが、皆さんは、メールアドレスとして何を使用していますか。



僕はメインのアドレスとして、gmailを使用しています。

主要な場合はこのアドレスを使えばいいのですが、場合によってはこの本アドレスを使用したくない場合などもありますよね。

例えば、ちょっとしたWebでの登録にメールアドレスが必要な時、あるいは、Web上で知り合った人などと連絡を取らなければならない場合などです。



こう場合に、メインのアドレスを使用するのは、リスクが高いです。



ということで、メインとは別に、サブのフリーメールアドレスを取っていこうとなるわけです。



フリーのメールアドレスと言えば、gmailやyahoo mail、outlookなどが思い浮かびます。

調べたところ、そんな中でもYahooメールは特に登録が簡単で、サブメールアドレスに適してそうなので、今回は、こちらをご紹介します。


もちろん、Yahooメールはサブメールアドレスだけでなく、メインのメールアドレスとしてでもおすすめです。


新規メールアドレス取得方法



まずは、こちらのページにアクセスします。

https://mail.yahoo.co.jp/promo/


おそらく上の画像のような画面が出てくると思いますので、「今すぐメールアドレスを作る」をクリックします。


すると以下のような、登録画面が開きます。



ここに必要な情報を入力し、登録を完了させます。

とはいえ、入力する情報はかなり最低限です。
他のメールサービスと比べると、入力内容がかなり少ないように思えます。


以前のYahooメールは、既存のメールアドレス無しで新規にメールアドレスの作成ができたようですが、現在はできなくなっています。

すでに持っているgmailなどのフリーメールアドレス、または、キャリアメールアドレスなどを入力する必要があるようです。

メールアドレス取得にメールアドレスが必要だなんて変な話ですが、本人確認のためなので仕方がないでしょう。


どうでしょうか。
メールアドレスの取得はできたでしょうか。
簡単だったと思います。


Yahooメールもgmail上でまとめて管理するのがおすすめ



無事、Yahooメールでサブメアドを用意したわけですが、もし、さらにサブメアドを作って いったりしたら、管理が大変ですよね。

ちなみに、Yahooメールは1人のアカウント所有数が決まっていないようなので、いくらでも作れます。



ということで、今回はgmailで管理する方法をお勧めします。

理由としては、gmailはほとんどの人が使用しているだろうということ、また、gmailの アプリは使いやすいというのもあります。


Yahooメールをgmailで扱うようになると次にようになります。

  • Yahooメールに届いたメールをgmailのアドレスに転送し、gamilで受信
  • gmailからgmailのサーバーを経由し、Yahooメールのアドレスでメールを転 送


メールの受信方法ですが、上に書いた方法(Yahooメールに届いたものを、gmailの方に 転送する方法)とは別に、Yahooで受信したものをgmailアプリから見に行くという方法もあります。

ただし、こちらは、メールの受信が遅れる(すなわち、リアルタイムに受信できない)、通知が来ないなどの問題がありましたので、あまりお勧めはしませ ん。



今回は、おすすめの方法でご紹介します。


メールの受信

まず、ブラウザでYahooメールにアクセスし、「メールの設定」から「IMAP/POP /SMTPアクセスとメール転送」という項目を開きます。



「ほかのメールアドレスにメールを自動転送する」を選択し、転送先メールアドレスにgmail のアドレスを入力します。


これで、Yahooメールに届いたメールは、gmailのアドレスに届きます。


gmailで通知設定をしていれば、同様にリアルタイムで通知が来ます。


なお、届いたメールがgmail宛てなのかYahooメール当てなのかは、見ればわかるようになっているので、ご安心ください。


ちなみにメールの実体は、Yahooのサーバーではなく、gmailのサーバーに残ります。


メールの送信

続いてメールの送信です。
gmailアプリからYahooのメールアドレスを使って送信できるようにしたいですよね。



幸いgmailには、他のメールアドレスを追加する機能が備わっていますので、それを使用します。


しかし、その前に、ここで使用するgmailのgoogleアカウントは2段階認証になっている必要があります。
もし、2段階認証にしてなければ、設定してください。
ついでにセキュリティが上がるので、おすすめです。


まず、gmailの設定画面を開きます。

「アカウントとインポート」というところを開き、「名前:」という欄にある「他のメールアドレ スを追加」をクリックします。


出てきた画面に従って入力してください。


SMTPの設定では次のように入力してください。
既存の設定では、Yahooの情報が入力されていると思いますが、先ほどメール受信の設定でYahooのSMTPサーバーは無効になってしまったので 使用できません。


  • SMTPサーバー: smtp.gmail.com
  • ポート: 587 (465でも可能)
  • ユーザー名: Gmailのユーザー名(gmailアドレスのうち、@より手前の部分)
  • パスワード: Gmailの2段階認証で取得したパスワード(後術)
  • SSL or TLS: ポートによって出る推奨に合わせる(587ならTLS、465ならSSL)


パスワードですが、googleにログインしたブラウザで以下のurlを開き、「アプリパス ワード」を生成してください。
そこで生成されたものを、上のパスワードのところに入力します。

https://myaccount.google.com/security


以上です。

これで、gmailでYahooのメールも管理することができるようになりました。


これで、快適なメールライフをお過ごしください。
では、さようなら。
また、お会いしましょう。


[Enchant.js]テトリスもどきをつくってみたかった...~落ちて2つに破壊する~


こんにちは。

皆さん、「Enchant.js」ってご存知ですか?


「Enchant.js」とは


Enchant.jsとは、ゲームやアプリを簡単に作れるJavaScriptのライブラリで す。
HTML5+JavaScript+CSSのWebアプリを作る際に使えます。


オープンソース(MITライセン ス)なので、無料で使え、また、商用利用などもできます。


Webアプリなので、サーバーにアップロードしておけば、PCだけでなくiPhone・Androidなどのスマホでもアプリを実行できます。

Webアプリの状態でも全画面表示にしてアプリっぽくしたり、あるいはPWAにしてオフライン対応にすることもできます。
もしくは、Apache Cordovaでネイティブアプリにもできます。


要するにマルチプラットフォームなわけです。



こちらの公式サイトからダウンロードできます。

http://enchantjs.com/ja/


Enchant.js本体だけでなく、ゲームに使える画像素材やプラグインなども入っています。


テ■リスをつくりたかったのに...


今回は、このEnchant.jsを使って、テ■リスもどきをつくっていこうと思います。

あくまでも流れを紹介するだけなので、詳しいことは省きます。
チュートリアルではないので、ご了承ください。


ファイルなどの準備

まずは、ファイルなどの準備をしていきます。



最初に用意するのは、HTMLファイルと、JavaScriptファイルですね。


フォルダ構成はこんな感じです。



次に画像の作成を行いました。

ゲーム自体に使う画像と、アイコンにする画像の2つを用意しました。
フリーの画像編集ソフト「GIMP」を用いて作成しております。



ゲームに使う方の画像は、色違いでひとマスずつ作成し、プログラムの方で各プロックを作成する ようにしました。

また、アイコンの方は、スマホ(Android or iPhone)でホーム画面に追加したときに表示されるアプリアイコン画像です。


続きまして、HTMLの中身を用意します。

<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="utf-8" />
    <title>T□TRIS</title>

    <meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
    <link rel="apple-touch-icon" href="./img/icon.png">

    <script type="text/javascript" src="./js/lib/enchant.min.js"></script>
    <script type="text/javascript" src="./js/main.js"></script>

    <style>
        body {
            padding: 0;
            margin: 0;
            background: #000000;
        }
    </style>
</head>

<body>

</body>

</html>


こんな感じです。

メインのJavaScriptファイル及びEnchant.jsの読み込み、アイコンの設定、 スマホでホーム画面に追加したときの全画面設定などを行っております。


メインのJavaScriptを書いていく

ゲームを動作させるメインのプログラムをJavaScriptで書いていきます。

実装させる基本的な処理はこちらです。

  • スタート画面作成
  • 枠組みの表示
  • 各ブロック生成
  • テ■リス落下
  • 移動、回転処理
  • 着地処理
  • 一列揃ったら消す
  • スコアを付ける

では、早速書いていきましょう。


スタート画面の作成は、特に難しいことはないですね。

シーンを2つ作って、一つをスタート画面、もう一方をゲームメイン画面とします。
最初はスタートのシーンを表示して、それをタッチするとメイン画面に切り替えるようにしてあります。



枠組みは、Enchant.jsのマップ機能を使用して作成しました。
最初に用意した画像のうち、茶色のマスを使用しています。



次に、ブロックの生成ですね。


最初に、このような画像を用意したと思います。

一番左のマスは、先ほど枠組みとして使用しましたから、テ■リスのブロック生成には、残りの4 色を用います。


作るブロックの形は、以下の5種類です。
色は気にしないでください。
形ごとに4色分のブロックを作りますので、合計20種のブロックができます。(本家だと形ごとに色が決まってたりしましたっけ?そのへんあやふやです みません。)



形の種類の数が本家と違うと思いますが、著作権の問題のためです。
そのまま同じにはできないわけです。


ではこの部分のソースコードです。

var tetris_map = [
                [
                    [1, 1, 1, 1]
                ],
                [
                    [1, 1],
                    [1, 1]
                ],
                [
                    [0, 1, 0],
                    [1, 1, 1]
                ],
                [
                    [1, 0, 0],
                    [1, 1, 1]
                ],
                [
                    [1, 1, 0],
                    [0, 1, 1]
                ]
            ];

            var tetris_surface = new Array();


            for (var i = 0; i <= 3; i++) {
                for (var j = 0; j <= 4; j++) {

                    var tmp_surface = new Surface(tetris_map[j][0].length * 32, tetris_map[j].length * 32);

                    for (var k = 0; k < tetris_map[j].length; k++) {
                        for (var l = 0; l < tetris_map[j][k].length; l++) {

                            if (tetris_map[j][k][l] == 1) {
                                tmp_surface.draw(game.assets['./img/tetris.png'], (i + 1) * 32, 0, 32, 32, l * 32, k * 32, 32, 32);
                            }

                        }
                    }

                    tetris_surface.push(tmp_surface);

                }
            }


Surfaceというのは、Canvasをラップしたもので、Enchant.js上で Canvasを使用するのに使います
Spriteのimageに代入することで、画像として表示できます。


ここでは、あらかじめ配列にブロックの形を用意しておいて、4重ループで、それに応じて20のブロックを生成し、tetris_surfaceという 配列にプッシュしています。


次に行きます。

テトリスの落下は、特に難しいことはないですね。
ただy座標を足していくだけです。

個人的にはなめらかに動いてほしくないので、毎フレームちょっとずつ動かすのではなく、何フ レームかごとに1マス分足しています。

この何フレームかごとというのは、if分と変数を使って処理しています。


では次にいきましょう。


次は移動回転処理ですね。

これが地味に難しかったです。


まず操作方法ですが、PCとスマホのどちらでも動くようにしたいので、キー操作とタッチ操作の両方を実装します。


<PCの場合>
・方向キーの左右で移動
・方向キーの上で右回転、「/」キーで左回転
・方向キーの下で加速落下


<スマホの場合>

・画面のタップで移動
(左半分をタップすれば左、右半分なら右)


・左から右へドラッグで、右回転
右から左へドラッグで、左回転


・上から下へドラッグで、加速落下



操作の部分はそこまで難しくないです。
が、問題は実際の回転の部分なのです。


正方形のブロックは回転の中心がちょうどいいところにくるので大丈夫なのですが、そのほかのブロックは回転の中心が微妙なところにくるので、回転した 瞬間、枠組みの配列に対して、ズレが生じるのです。


ということで、回転後に計算した分のずれを、x軸、y軸に足して、調節することにしました。


tetrisという変数は、メインの動かしているスプライトです。

tetris_wとtetris_hは、それぞれ現在のブロックの幅と高さが入る変数です。
単純にtetris.widthとtetris.heightでは、回転した後も値が変わらず、現在表示されている状態での幅や高さにならないので、 わざわざこのような変数を用意して、回転に応じて値を調節しています。

tetris_center_xは、スプライトの中心のx座標です。
回転処理をしているうちにだんだん右に移動していったり、左にいったりなどということが起こってしまったので、この変数を使用して、それを防止してい ます。

これらの変数はあらかじめ宣言し、落下するブロックを生成した段階で、値を代入しています。


ソースコードを見てもらった方が早いですね。


var change_wh = function () {
    var tmp = tetris_w;
    tetris_w = tetris_h;
    tetris_h = tmp;
};

var tetris_left_rote = function () {
    tetris.rotation -= 90;
    change_wh();
    tetris.x = Math.floor((tetris.x + (tetris.width - tetris_w) / 2 - 4) / 32) * 32 + 4 - (tetris.width - tetris_w) / 2;
    tetris.y = Math.round((tetris.y + (tetris.height - tetris_h) / 2 - 80) / 32) * 32 + 80 - (tetris.height - tetris_h) / 2;

    if (tetris_center_x - 32 >= tetris.x + tetris.width / 2) {
        tetris.x += 32;
        tetris_center_x = tetris.x + tetris.width / 2
    }

    if (tetris.x + ((tetris.width - tetris_w) / 2) < 36) {
        tetris.x = 36 - (tetris.width - tetris_w) / 2;
    }
    if (tetris.x + tetris.width - ((tetris.width - tetris_w) / 2) > 324) {
        tetris.x = 324 - (tetris.width - ((tetris.width - tetris_w) / 2));
    }
};
var tetris_right_rote = function () {
    tetris.rotation += 90;
    change_wh();
    tetris.x = Math.ceil((tetris.x + (tetris.width - tetris_w) / 2 - 4) / 32) * 32 + 4 - (tetris.width - tetris_w) / 2;
    tetris.y = Math.round((tetris.y + (tetris.height - tetris_h) / 2 - 80) / 32) * 32 + 80 - (tetris.height - tetris_h) / 2;

    if (tetris_center_x + 32 <= tetris.x + tetris.width / 2) {
        tetris.x -= 32;
        tetris_center_x = tetris.x + tetris.width / 2
    }

    if (tetris.x + ((tetris.width - tetris_w) / 2) < 36) {
        tetris.x = 36 - (tetris.width - tetris_w) / 2;
    }
    if (tetris.x + tetris.width - ((tetris.width - tetris_w) / 2) > 324) {
        tetris.x = 324 - (tetris.width - ((tetris.width - tetris_w) / 2));
    }
};


回転した後に左右の枠をはみ出た際の処理も書いています。

移動でも同様な感じでズレの判定をしています。



では、次に行きましょう。

次は着地処理及び、消去処理ですが、ここで問題発生です。

ここら辺の書き方がよくわからなかった。
僕には少し早かったみたいです。


ということで、この部分の処理をやめて、違う処理を入れました。

落下し、着地した瞬間、こんな感じにします。



地面についた瞬間、2つに破壊されるんですね。



しょうもな...


ということで、やっていきましょう。


テ■リスを2つに破壊する



では、どうやって先ほどのように割るのかというと、JavaScriptでCanvasのピク セル操作を行うことで、破壊されたように見せます。


CanvasのコンテキストのgetImageDataで指定した範囲のピクセルデータを取得し、putImageDataで逆に書き出します。


実際に、プログラムを見てもらいましょう。

var mod = function (i, j) {
    return (i % j) < 0 ? (i % j) + 0 + (j < 0 ? -j : j) : (i % j + 0);
};

var destroy = function (s) {

    var speed = s;

    tetris.visible = false;

    var destroy_imagedata = tetris.image.context.getImageData(0, 0, tetris.width, tetris.height);

    var destroy_surface_left = new Surface(tetris.width, tetris.height);
    var destroy_surface_right = new Surface(tetris.width, tetris.height);

    var destroy_left = new Sprite(tetris.width, tetris.height);
    var destroy_right = new Sprite(tetris.width, tetris.height);


    main.addChild(destroy_left);
    main.addChild(destroy_right);



    destroy_left.x = tetris.x;
    destroy_left.y = tetris.y;
    destroy_left.rotation = tetris.rotation;
    destroy_right.x = tetris.x;
    destroy_right.y = tetris.y;
    destroy_right.rotation = tetris.rotation;


    switch (mod(tetris.rotation / 90, 4)) {
        case 0:
            for (var h = 0; h < tetris.height; h++) {
                var r = Math.floor(Math.random() * 20) - 9;

                for (var w = 0; w < tetris.width; w++) {

                    if (w == (tetris.width / 2) + r - 1) {
                        destroy_surface_left.context.putImageData(destroy_imagedata, 0, 0, 0, h, w + 1, 1);
                    }
                    if (w == tetris.width - 1) {
                        destroy_surface_right.context.putImageData(destroy_imagedata, 0, 0, (tetris.width / 2) + r, h, tetris.width - ((tetris.width / 2) + r), 1);
                    }
                }
            }
            break;
        case 1:
            for (var w = 0; w < tetris.width; w++) {
                var r = Math.floor(Math.random() * 20) - 9;

                for (var h = 0; h < tetris.height; h++) {

                    if (h == (tetris.height / 2) + r - 1) {
                        destroy_surface_right.context.putImageData(destroy_imagedata, 0, 0, w, 0, 1, h + 1);
                    }
                    if (h == tetris.height - 1) {
                        destroy_surface_left.context.putImageData(destroy_imagedata, 0, 0, w, (tetris.height / 2) + r, 1, tetris.height - ((tetris.height / 2) + r));
                    }

                }

            }
            break;
        case 2:
            for (var h = 0; h < tetris.height; h++) {
                var r = Math.floor(Math.random() * 20) - 9;

                for (var w = 0; w < tetris.width; w++) {

                    if (w == (tetris.width / 2) + r - 1) {
                        destroy_surface_right.context.putImageData(destroy_imagedata, 0, 0, 0, h, w + 1, 1);
                    }
                    if (w == tetris.width - 1) {
                        destroy_surface_left.context.putImageData(destroy_imagedata, 0, 0, (tetris.width / 2) + r, h, tetris.width - ((tetris.width / 2) + r), 1);
                    }
                }
            }
            break;
        case 3:
            for (var w = 0; w < tetris.width; w++) {
                var r = Math.floor(Math.random() * 20) - 9;

                for (var h = 0; h < tetris.height; h++) {

                    if (h == (tetris.height / 2) + r - 1) {
                        destroy_surface_left.context.putImageData(destroy_imagedata, 0, 0, w, 0, 1, h + 1);
                    }
                    if (h == tetris.height - 1) {
                        destroy_surface_right.context.putImageData(destroy_imagedata, 0, 0, w, (tetris.height / 2) + r, 1, tetris.height - ((tetris.height / 2) + r));
                    }

                }

            }
            break;

    }



    destroy_left.image = destroy_surface_left;
    destroy_right.image = destroy_surface_right;


    destroy_left.tl.rotateBy(-270, speed);
    destroy_right.tl.rotateBy(270, speed)
    destroy_left.tl.and();
    destroy_right.tl.and();
    destroy_left.tl.moveBy(-200, 300, speed);
    destroy_right.tl.moveBy(200, 300, speed);

    destroy_right.tl.then(function () {
        main.removeChild(destroy_left);
        main.removeChild(destroy_right);

        createTetris();
        frame_cnt = 0;
        frame_max = 30;
        touch_down = false;

        down_fg = true;
    });

};


まず、破壊された後、左側に落ちるスプライトと、右側に落ちるスプライトの2つを用意します。


ブロックの回転具合によって、分割する箇所が異なるので、そこのところを場合分けで書いていきます。



いよいよピクセル処理の出番です。


Enchant.jsのSurfaceの方にも、getPixelとsetPixelというピクセル処理の機能が備わっているのですが、こちらは、1 ピクセルごとに処理するため、動作がかなり重いです。


なので、今回はラップされていないもともとの「getImageData」と「putImageData」を使用します。



回転による場合分けをした後、2重ループを使い、ブロックの幅をランダムな長さにしながら、左右のスプライトに分けています。



分けた後は、もとのメインスプライトを非表示にし、2つのスプライトをうまく動かして、落下させます。

落下スピードに応じて、破壊後の動きにも変化をつけています。


破壊処理は以上ですね。


スコアは適当につけています。


かなり、はしょったわかりにくい説明だったと思います。
ソースコードもこれだけではよくわからないでしょう。


ということで、ソースコードの全体は、こちらから見れます。

http://kumakuma.life.coocan.jp/DestroyTetris/js/main.js


完成



プレイ動画(?)みたいなのは、この動画の後半にあります。


また、こちらのURLから遊ぶ(?)ことができます。

http://kumakuma.life.coocan.jp/DestroyTetris/


スマホで開いて、ホーム画面に追加するとアプリっぽくなります。
オフラインには対応してませんが。


では、これで終わります。
Enchant.js面白いので、ぜひ触ってみてください。


2019年8月18日日曜日

PDF編集するなら「PDFelement Pro」!低価格で高機能なおすすめソフトの紹介


どうも、こんにちは。


今日は、PDF作成・編集などに、とてもよく使えるソフト「PDFelement Pro」を紹介していきたいと思います。



皆さん、「パソコンでPDFの作成や編集をする必要がある」「なるべくいろいろなことができるPDFソフトが欲しい」などという風になったことはあり ませんか?

そんなときおすすめできるのが、株式会社ワンダーシェアー(Wondershare)さんの出しているこの「PDFelement Pro」です。


「PDFelement Pro」(Windows版、Mac版)
https://pdf.wondershare.jp/



なぜおすすめできるのかと言いますと、PDFの直接修正/編集、変換、作成を始めとし、OCR(光学文字認識)、注釈付け、フォーム作成、安全保護な どの様々な機能を備えるソフトにして、個人でも手が届くお手頃な価格帯で販売されているからです。


また、Microsoft Officeに似た操作性で、扱いも手軽、簡単です。




ざっと、ソフトの紹介をしたところで、具体的にソフトのインストール、機能などを見ていきましょう。


導入方法



製品の購入・ダウンロードは、こちらのリンクから行えます。
https://pdf.wondershare.jp/pdfelement-new/


現在のバージョンは、7.0で、Windows版とMac OS版があるみたいですね。



上記サイトの「購入」から、購入ができますが、まずは無料体験版(一部機能あり)を試してみることも可能です。




では、試してみましょう。


上記のダウンロードリンクにページの下の方に、このようなボタンがありますので、 「PDFelement Pro」の無料ダウンロードをクリックします。


Windowsだと「pdfelement-pro_setup_full5272.exe」のようなファイルがダウンロードされると思いますので、 これを開いてインストールしましょう。


このような画面が出ると思うので、「インストール」を押す。

インストールが終わると、ソフト本体が起動して、次のような画面が開きます。

これでインストール完了です。


では、実際に使ってみましょう。


PDFの新規作成


PDFファイルの新規作成をしてみます。

「ファイル」メニューから新規作成、と進み、用紙の設定をしてから、「空白」ボタンで新規作成ができます。


そうすると、このように、PDF編集モードになりますので、PDFを作成できます。

画面がシンプルで見やすいので、直観的に操作できると思います。


軽く触ってみました。

一般的にPDFなどの資料を作ろうと思ったら、Wordで作って、PDFに変換するというのが ほとんどだと思います。

しかし、このソフトを使うことで、PDFへの変換という作業をすることなく、直 接PDFを作成・編集できるので手間が省けてよいです。


他ファイルへの変換

PDFファイルができたら、他のファイルにも変換してみましょう。


「変換」メニューから、いろいろ変換できます。


ここにあるように、変換できるファイルには、

  • Word
  • Excel
  • PowerPoint
  • 画像ファイル
  • テキストファイル
  • HTMLファイル

などがあります。


無料版の制限

これまで、無料体験版で話を進めてきたわけですが、もちろん、こちらには次のような制限があり ます。

  • 保存後のPDFファイルに透かしが付く
  • PDF変換が毎回半分のページ数まで、最大5ページに限定されている
  • Pro版でOCR実行後のPDFファイルを保存できない
  • Pro版のバッチ処理では最大リスト二番目のファイルまで処理可能


こういった制限をなくすには、本製品の購入を検討しましょう。



PDFの編集におすすめなソフトのご紹介でした。


人気の記事