tuedaの日記

2016-06-26

[] 微妙にenumの識別子を書くのがめんどいんだよなあ。何とかできないものか

キャラクターが右を向いているか左を向いているかを保持するのにenumを使うが、

        enum Direction {
            Left,
            Right
        }
        Direction dir;

この識別子(Direction)いらないんだよなあ。

     this.dir = Direction.Left;

せめて定義したクラス内部だけでも省略できないものか。

LeftとかRightとかわざわざDirectionをつけなくても見ればわかる。

C#にもRubyみたいな一行で書けるif文ほしい

Rubyの一行後置if文(?)は便利。あれは良い

    Zombie.MoveLeft() as velocity >= 0;
    Zombie.MoveRight() as velocity < 0;

2016-06-24

イギリスがEU離脱したよ!

これは驚いた。どうせ残留だろうと思っていた。

事前の調査だとやや残留派が優勢で、こういう大きな変革を求められた時は保守的な政策が支持されやすいと思って残留と判断していた。

これFXとかやってる人は上だぬきに視認が出ててるだろう。

2016-06-23 [C#] 単一変数をnewして代入する時に形名を書かなくても良いようにな

例えばプロパティに値を代入するときに非常にどうでも良いクラス名がプログラム中に現れることがよくある。

下記のコードで言えば Zombie や Zombie何とかは非常に重要なクラスだが、Vector2f ははっきり言ってどうでもいい。

代入の左辺を見れば型は自明なので書かなくてもコンパイラは困らない。

こういう時は new 演算子だけ書けばOKにしてくれないものだろうか。

        public static Node Create(float x, float y, string name) {
            var nod = new Node(name);
            var cmp1 = new Zombie();
            var cmp2 = new ZombiePhysics();
            var cmp3 = new ZombieController();
            nod.Attach(cmp1);
            nod.Attach(cmp2);
            nod.Attach(cmp3);

            // Vector2fを省略して下の形で書きたい
            nod.Position = new Vector2f(x, y);
            nod.Position = new (x, y);         

            return nod;
        }

・・・Vector2fを継承したクラスがあれば曖昧だな。プロパティがインターフェースだったら特に。

そういう場合は一番基底なのが選択されるとか・・・無理か

2016-06-16

[] C#でTiledで作ったマップをSFMLを使って表示するには

何年か前に書いたような気がしたが見つからなかったので書いておく。

2DのマップエディターはTiledがベスト。作ったマップ(.tmx)を読み込むにはNuGetにあるTiledSharpを使うのがおすすめ。

読み込んでSFMLで表示するプログラムはこんな感じになる。

(画像レイヤーとかオブジェクトグループは無視。単なるサンプルなので実践で使うにはもう少し頑張る必要がある)

using SFML.Graphics;
using SFML.System;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TiledSharp;

namespace HelloTiled {
    class TiledMap {
        TmxMap tmx;
        List<Sprite> sprites;

        public TiledMap(string fileName) {
            this.tmx = new TmxMap("Resource/LostGarden.tmx");
            this.sprites = new List<Sprite>();

            var dic = new Dictionary<int, Sprite>();
            
            // 使用するすべてのタイル(のスプライト)を作成
            foreach (var ts in tmx.Tilesets) {
                var tex = new Texture(ts.Image.Source);
                var w = ts.Image.Width.Value / tmx.TileWidth;
                var h = ts.Image.Height.Value / tmx.TileHeight;

                for(var i=0; i < ts.TileCount; i++) {
                    var gid = ts.FirstGid + i;
                    var spr = new Sprite(tex);
                    var x = (i % w) * tmx.TileWidth;
                    var y = (i / w) * tmx.TileHeight;
                    spr.TextureRect = new IntRect(x, y, ts.TileWidth, ts.TileHeight);

                    dic.Add(gid, spr);
                }           
            }
            
            // gidを見ながらタイルをコピーしてマップを作成
            foreach (var layer in tmx.Layers) {
                foreach (var tile in layer.Tiles) {
                    if(tile.Gid == 0) {
                        continue;
                    }
                    var spr = new Sprite(dic[tile.Gid]);
                    var x = tile.X * tmx.TileWidth;
                    var y = tile.Y * tmx.TileHeight;
                    spr.Position = new Vector2f(x, y);
                    sprites.Add(spr);
                }
            }
            
            foreach(var spr in dic.Values) {
                spr.Dispose();
            }
        }


        public void Draw (RenderWindow win) {
            foreach(var spr in sprites) {
                win.Draw(spr);
            }
        }
    }
}

んで、表示

f:id:tueda_wolf:20160616163246p:image

特に難しい話ではない。雛形として誰かの役に立てば。

2016-06-15

中国海軍、鹿児島沖の領海を侵犯

これなんで撃沈しないんだろう。軍艦の領海侵犯は即座に撃沈するのが世界標準だと思うが・・・

政府からきちんとした報告は出るんだろうか。