読者です 読者をやめる 読者になる 読者になる

developer_RYO’s blog

スマホアプリやPCゲーム、音楽やイラストを自由気ままに作っている人の技術ログです

サクラエディタのマクロでsqlテキスト整形

JavaScript 仕事

f:id:developer_RYO:20160928231018g:plain

totech.hateblo.jp
サクラエディタにエクセルの表を貼り付けた後、sqlファイルを作ることがあるのですが、
仕事の効率化ができたらと思い、試しにマクロを作ってみました。

■このマクロで実行すること
・変換対象→選択しているテキスト
・タブ→カンマとクオーテーションに変換「','」
・行末→クオーテーションとカンマと丸括弧追加「'),」
・行頭→クオーテーションと丸括弧追加「('」
・文末→クオーテーションとセミコロンと丸括弧追加「');」
・null,NULLにはクオーテーション付けない

function TabTextToSQLText(text) {
  
  //タブ→カンマ変換
  text = text.replace(/\t/g,"','");
  //「改行」→「'),改行」に変換
  text = text.replace(/\r\n/g,"'),\r\n");
  //行頭に「('」を追加
  text = text.replace(/^(.+?)$/mg,"('$1");
  //null文字にかっこがついていたら、かっこを外す
  text = text.replace(/\'null\'/g,"null");
  text = text.replace(/\'NULL\'/g,"NULL");
  //最後に');を付ける
  text += '\');'
 return text;
}
//==========
// MAIN
//==========
// 選択範囲のテキストを取得
var text = Editor.GetSelectedString(0);
// 変換後のテキストを出力
if ( text !== "" ) Editor.InsText(TabTextToSQLText(text));

【Unity5.4.1f1】入れ子にしたcanvasの大きさやアンカーがゲーム開始時にずれる現象

C# Unity ゲーム開発

Unity5.3から、5.4にアップグレードしてみたところはまったところがありましたのでメモしておきます。
(僕の勘違いでしょうか。。。)

■現象の再現と内容
ヒエラルキー上で親canvasを作る
CanvasScalerのUIScaleModeを「Scale With Screen Size」にして、解像度を2560、1440に設定する。

②親Canvasの中に子Canvasを作る
CanvasのAnchorPresetsをmiddle・centerにする。(このときのwidthは2560、heightは1440)

デバッグ開始▶すると
AnchorPresetsがbottom・leftに自動で変更される。widthが837、heightが471になる。

デバッグ終了後
AnchorPresetsはbottom・leftのままでゲーム開始前に戻らない。
width、heightも同様にゲーム開始前に戻らない。

■解決方法
ゲームオブジェクトにアタッチされているCanvas、CanvasScaler、GraphicRaycasterを
すべて外す。(Remove Component)
外した後付け直す。
それか、Canvasを入れ子にする際は空のゲームオブジェクトから作るとか。

C# Windowsで、簡易的なマップエディタもどき(笑)を作ってみました

C#メモ プログラミング ゲーム

f:id:developer_RYO:20160806005933g:plain

こんばんは。

こんな深夜ですが、業務上サーバー負荷監視をしており、時間がありましたので
マップエディタっぽい何かを作ろうとしました。
業務のほうで、「パズルゲームのマップエディタあったらいいなあ~」という声がございましたので
プログラムを組んでいる次第です。

C# マップエディタ 作り方」で検索しますと、いくつかヒットしました。
d.hatena.ne.jp
Bird-Soft Weblog: マップエディタ作成中


他にもいろいろありましたが、僕が思う「これだ!」という資料が見つかりませんでした。

今回はC#でマップエディタがパパッと作れるかどうかの検討も合わせて
まず簡易的なものを作ってみようと試みました。
ちなみに、C#で作る理由は、自分が今書ける言語の内一番簡単そうに作れそうだったからです。


検証&作ったのは、下記になります。

  1. 画像を簡単にグリッド表示みたいなものできるか?
  2. 画像クリック時に、クリックした箇所のグリッドに画像を入れられるか?
  3. 画像ダブルクリック時に、ダブルクリックした箇所の画像を消せるか?


1.画像をグリッド表示みたいなものできるか?
→できた。
csファイルで、フォーム起動時にPictureBoxを生成。
作ったPictureBoxはListに格納。
参考にしたのはこちらのページです。
コントロールの配列を作成する: .NET Tips: C#, VB.NET


2.画像クリック時に、クリックした箇所のグリッドに画像を入れられるか?
3.画像ダブルクリック時に、ダブルクリックした箇所の画像を消せるか?
→できた。
生成したPictureBoxに対して、クリック等したときのイベントハンドラを設定。
イベントハンドラ内で、
MessageBox.Show(((System.Windows.Forms.PictureBox) sender).Name);
みたいな書き方をすると、クリックしたPictureBox取得できる。


ソースは下記になります。(gif画像で動いているものに相当)
いまのところ、クリック時にPictureBox.BackColorをいじっていますので
こちらを画像格納する記述にすればOKなはず!

 public partial class Form1 : Form
    {
        private List<List<PictureBox>> PiecePictureBoxList;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            PiecePictureBoxList = new List<List<PictureBox>>();
            InitPieceGrid(8, 9);
        }

        /// <summary>
        /// ピースグリッドの範囲をクリックしたときの挙動
        /// ここにパズルのピース画像を入れる処理を入れる
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void PiecePictureBox_Click(object sender, EventArgs e)
        {
            ((System.Windows.Forms.PictureBox)sender).BackColor = Color.Black;
        }

        /// <summary>
        /// ピースグリッドの範囲をダブルクリックしたときの挙動
        /// ここにパズルのピース画像を削除する処理を入れる
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void PiecePictureBox_DoubleClick(object sender, EventArgs e)
        {
            ((System.Windows.Forms.PictureBox)sender).BackColor = Color.White;
        }


        /// <summary>
        /// ピース画像を格納するグリッドを作成します。
        /// きれいにできないかな。。。
        /// </summary>
        private void InitPieceGrid(int x,int y)
        {
            for(int i = 0; i < y; i++)
            {
                var PiecePictureBoxLow = new List<PictureBox>();
                for(int j = 0; j < x; j++)
                {
                    PiecePictureBoxLow.Add(new PictureBox());
                    PiecePictureBoxLow.LastOrDefault().Name = "PictureBox" + "X"+ j + "Y" + i;
                    PiecePictureBoxLow.LastOrDefault().Location = new Point(60 * (j + 1), 60 * (i + 1));
                    PiecePictureBoxLow.LastOrDefault().Size = new System.Drawing.Size(60, 60);
                    PiecePictureBoxLow.LastOrDefault().BorderStyle = BorderStyle.FixedSingle;
                    PiecePictureBoxLow.LastOrDefault().BackColor = Color.White;
                    this.Controls.Add(PiecePictureBoxLow.LastOrDefault());
                    PiecePictureBoxLow.LastOrDefault().Click += PiecePictureBox_Click;
                    PiecePictureBoxLow.LastOrDefault().DoubleClick += PiecePictureBox_DoubleClick;
                }
                PiecePictureBoxList.Add(PiecePictureBoxLow);
            }           
        }
    }


とりあえず、何とか作れそうです。
そして、LINQの勉強不足が露呈しました。。。(苦笑)

【uGUI】下からスライドインするボタンを作りました

C# Unity ゲーム開発

f:id:developer_RYO:20160523235446g:plain

>夜分こんばんわ。
今回、gif画像に示すような、下から「スッ」と出てくるボタンを実装しました。
汎用的に使えそうな感じがするので、ブログに残しておきます。

目次

■1. uGUIのCanvasを用意する。
■2. uGUIの動かしたいButtonを3つ用意する。
■3. 「スッ」と動かす用のuGUIのButtonを用意する。
■4. iTweenを使って動きを付ける。
■5. 「スッ」と動かす用のuGUIのButtonをクリックしたときの挙動を決める。
■6. 参考サイト

※動作はwindows10,Unity5.0.0f4で確認しました。

///////////////////////////////////////////////////////////////////////////

■1. uGUIのCanvasを用意する。

f:id:developer_RYO:20160524000020p:plain
Hierarchy上で右クリックして、UI>Canvasを押す。CanvasがSceneに作られる。

■2. uGUIの動かしたいButtonを3つ用意する。

f:id:developer_RYO:20160524000021p:plain
Hierarchy上で右クリックして、UI>Buttonを押す。3個作る。TEXTの名前は適当に「START」、「SCORE」、「HELP」とでもする。
POSXは3個とも0にして、POSYをそれぞれ-400,-550,-700に設定する。

■3. 「スッ」と動かす用のuGUIのButtonを用意する。

f:id:developer_RYO:20160524000023p:plain
Hierarchy上で右クリックして、UI>Buttonを押す。TEXTの名前は適当に「上昇します~」とでもする。
POSXは330、POSYは-270に設定する。

■4. iTweenを使って動きを付ける。

csファイルを作る。ファイルの名前は適当にEaseUpUIとでもしておく。
EaseUpUiという関数によって、オブジェクトの動きを制御する。
動作を開始するまでのタイムラグを引数に設定しておく。

using UnityEngine;

public class EaseUpUI : MonoBehaviour {

	public void EaseUpUi(float delay)
    {
        iTween.MoveBy(this.gameObject,
            iTween.Hash(
                "delay"   , delay,
                "time"    , 0.8f,
                "y"       , 500,
                "easeType", iTween.EaseType.easeOutCirc
                )
            );
    }
}

■5. 「スッ」と動かす用のuGUIのButtonをクリックしたときの挙動を決める。

f:id:developer_RYO:20160524000025p:plain
「スッ」と動かす用のuGUIのButtonのInspectorの、ButtonコンポーネントのOn Click()をいじる。
動かしたいButtonをObjectとして設定し、EaseUpUI.EaseUpUiを選択。引数で動作開始時刻を調整する。

■6. 参考サイト

○uGUIをiTween使って動かしましょうというページ。
albatrus.com

○イージング動作のチェックに使ったページ。触っているだけで楽しい。
easing_demo

Siv3Dを触ってみました

C++ ゲーム開発 テクノロジー プログラミング

f:id:developer_RYO:20160403230850p:plain

www.nicovideo.jp

ニコ動でビジュアライザーの動画を見かけまして、何で作っているんだろーかなあと追っかけましたらSiv3Dというライブラリがありました。
サンプルコード触った感じ、面白そうです!

play-siv3d.hateblo.jp

複雑なインタラクションを短いコードで書くことができます。

コードの長さの基準がわからないのですが、こういう方針で作っていることを考えるとSiv3D使って本格的に開発取り組もうかなあとか思ってます。
個人で開発していると、ソースの長さが原因で心折れそうになるので。。


ライブラリ作っている人すごいな。。。

C#とPHP 文字列「ああああ」をint型に変換した時の挙動

PHPとC#

アプリを作っていることが会社に少しだけ、少しだけ認められ、
6か月間ずっとテストを行う日々から、少しずつソースを書くお仕事をいただくようになり。
PHPを触ることになりました。

んで、結構衝撃受けたのが、キャストの挙動。


C#のキャスト結果(Unityで検証 )

        string stringAAAA = "ああああ";
	int intAAAA = (int)stringAAAA;
	Debug.Log(intAAAA);

error CS0030: Cannot convert type `string' to `int'
エラーが走り、キャストはできない。うん。


次にPHPのキャスト結果(paizaのサイトで検証)

        <?php
        $stringAAAA = "ああああ";
        $intAAAA = (int)$stringAAAA;
        echo $intAAAA;
        ?>

出力されるのが・・・数字の0 。
これ、エラー出ないのか。

ProgressTimerの_percentageは上限が100、下限が0

確認したバージョン・・・cocos2d-x-3.7.1

プログレスバー周りで
percentが0未満になったらプログレスバーを消すコードを書いたのですが、うまく動作せず。。。

void MainScene::updateReadyProgress(float dt)
{
    //終了した時や、ゲーム状態が合わない時は処理しない
    if(state != STATE::INIT) return;
    if(readyProgress->getPercentage() <= 0) return;
    
    readyProgress->setPercentage(readyProgress->getPercentage() - 50.0f * dt);
    
    //↓の処理が走らない
    if(readyProgress->getPercentage() < 0){
        
        this->removeChild(readyProgress);this->removeChild(readyLabel);
        
        //ゲームプレイ開始
        state = STATE::RUN;
        if(state == STATE::RUN) printf("runになりました");
    }
}

原因は、percentの値がclampsで丸められているためであった。。
下記はcocosのsetPercentage。

void ProgressTimer::setPercentage(float percentage)
{
    if (_percentage != percentage)
    {
        _percentage = clampf(percentage, 0, 100);
        updateProgress();
    }
}

ということで、条件分岐するところを「未満」から「以下」に変更して解決!

//↓の処理が走らない
    if(readyProgress->getPercentage() <= 0){

変数のとりうる値を制限しておく処理、大事だなと思った。
150%とか-20%とか取ったらどんな処理になるんだろうか。恐怖。