Don't wanna be here? Send us removal request.
Text
意見の言い方と人生
自分はある主張Aを聞いた時、それの反対となる主張Bを「こういう意見もあるよ」って言いたくなるんだけど、それを言った時に「喧嘩売ってる?」というふうにとられることがあるな~ということに気付いた。ほぼ40年生きてていまさらという感じだが…最近そういう事例があったということはなく、過去の人生を振り返って考えると、そういうことだったか~と気付いたという話。 自分はあまり自分の考えが正しいというスタンスはとっていなくて、「いろんな意見はあって当たり前」「完全な正解というのはなく、前提や条件によって良いと思える選択が変わるだけ」と思っている。あと自分の性質としてそもそも最初から最良と思える選択を自信もって提供できることが稀であること(まあ優柔不断ではある)、なんか検討する時はいろんな視点からものを考えたほうが良い選択ができると思っていること、主流からはずれたアイデアを大事にしがちなこと、マクドナルド理論的な意味で雑でもアイデアはどんどん言っていくべきと思っているため、対立しやすい意見を言うことが多いのかもしれない。そもそも自分の主張がスッと合意を得られないことも当たり前だし… (話がそれるけど、「マクドナルド理論」という用語、マクドナルドに失礼な気がする) 「喧嘩売ってる?」側の気持ちとしては、自分の意見を否定された=自分を否定された=喧嘩売ってる、という受け取り方なんだろうか…当然意見そのものを、まして人を否定しているつもりはないのだけど、Aという主張を強く信じている人に対して、「こういう意見もあるよ」という言い方は「うるせ~!知らね~!」となりそうな気もする。特にその考え方が長年の経験や考察を経て構築されたものであれば、人生を軽んじていると捉えられるのもしょうがないかもしれない。 じゃあどうすればいいのか。最初は「なるほどね~」って言いつつ、「自分がそういう(両論おさえておきたい)考え方だとわかってもらう」のがいいかなと思う。たとえば「一応Bという案も考えておきたい」「もしBという主張をされたらどう反論する?」みたいな言い方をするとか。…という話をClaudeに「批判的にみてどう?」と投げたら手厳しい話をされて涙目になった。特に「自分は主張があるのに相手はフワフワしたことしか言ってこない!安全地帯から石投げてきてるみたいでずるい!」「相手は解決や合意を求めてるのに、あなたは議論そのものを目的にしてる」みたいな話をされて割と刺さった。まあ難しいけど、やっていきましょう、人生。
0 notes
Text
ノートパソコンの天板を保護する方法
ノートパソコンの天板を保護する方法を調べてたのですが、車用のラップシートを使うのがよさそう
貼り方:
youtube
ステッカーを貼りまくってもシートごと外せる
0 notes
Text
2025年にC言語でゲームを作る
いまどきゲームを作るとしたら便利なゲームエンジンがいくらでもあるけど、あえてC言語で作るということを考えてみる。案外なんとかなるし便利な側面も多いのではというのが言いたいこと…だけど書いてたらなんかとりとめがなくなってしまった。
コード駆動ゲームプログラミングという概念(今考えた)があると思っていて、よくあるゲームエンジンはアセットデータがあってシーンにオブジェクトを置いて…みたいなのをデータとコードと行き来しながら作ってくものだという理解をしているんだけど、コード駆動だととにかくコードで全部実現する(データもコードに埋め込まれることが多い)みたいなやりかたで作ることになる。これがプログラマが1人でシンプルなゲームを作るという範囲にうまくマッチしているように思う。やっぱりmain()から書きたいんですよ。今どきな話でいうとLLMによるvibe codingとの相性がよさそうというのもある。
C言語で書くといっても全てを自分で書く必要はなくて、マルチプラットフォーム対応なライブラリがまあまあある。 stevinz/awesome-game-engine-dev: Awesome list of resources for Game Engine Development. SDLはメジャーバージョン3が最近出たし、floooh/sokolというのも活発に開発されている。SDLは単体だと3Dの表示ができないのでOpenGLとかと組み合わせて使うことになるけど、OpenGLを使うとMacOSやiOSでそのうち動かなくなるんでは…というのは気になる。まあ今のところその需要は自分の中で高くないし、動かなくなって困ったらその時はその時で…と思ってる。sokolはちょっと使った感じ、複数の描画バックエンド/対応プラットフォームを持ってて悪くはないけど、まだまだAPIの破壊的変更が行われてたりして付いていくのが大変そうな印象をもった。
その上で、他の言語じゃなくてなんでC言語なの?ってところはあるけど、何か困った時にコードを追ったり手直しができる範囲が大きいのがいいところかなあと。何かしらの既存のライブラリを組み込むのも容易だし、問題があればデバッガで処理を追っていける。C言語でライブラリを書いた上でLuaのような言語を組み合わせるのも悪くはない(love2dとか良く出来てる)…が、複数の言語や処理系の組み合わせによって作られているプログラムはそれぞれデバッグする必要があって面倒という話が出てくる。
C言語は最近の言語と違って言語処理系自体にパッケージ管理の仕組みが備わっていなくて、ライブラリをビルドしてpathを通してというライブラリを導入するまでの手間がまあまあある。これをなんとかする仕組みとして、header-file libraryという風習とvcpkgというパッケージマネージャを紹介する。
Cのライブラリはheader-fileとして提供されているものもある。代表的なのがstb。header-fileとして提供されているライブラリであれば、使う人はヘッダファイルを#includeするだけでよい。C言語だと.hと.cという2種類のファイルに分けて.hに関数宣言、.cに関数定義を書くというスタイルになっていることが多いけど、header-fileライブラリは.cに相当する内容を得るために「事前にこのHOGE_IMPLEMENTATIONマクロを定義しておけば関数定義に相当する部分を得られるよ、どこか1つの.cから#includeしてね」というものを提供していたりする。なんだったらヘッダファイルをプロジェクトにコピーしてしまえば簡単にリポジトリに含めることもできるし、ライブラリを導入するまでの手数が(C言語にしては)めっちゃ少ない。
vcpkgはMicrosoftが主体となって開発しているパッケージマネージャ。ライブラリもライブラリを利用する側もCMakeで管理されている場合にいい感じにビルド方法を統合してくれる。(一応CMake以外でも使えるっぽいが… )。
細かいところでいうと、C99の指示付初期化という構文がめっちゃ便利。複雑な構造体や配列の入れ子構造をサクッと初期化できる。 例。C++20でC++でも一部使えるようになったけど、配列には対応してないっぽい。
ここまで書いておきながら、自分はoperator overloadが使いたいので結局C++を使うんですが… n3051きてくれ~
というふうなことを考えながらneguse/ngというライブラリを作っています。裏で作ってる機能がちょいちょいあるけどまだpublic repoに出せてない…
1 note
·
View note
Text
Rustはじめ
Rust by Exampleをやってみている。
9章でclosureと借用の話がでてきてなんのこっちゃ感が強まったけど、15章でmoveの話とかが出てくるっぽいので一旦わからないまま進めたほうがよさそう。
ポインタとref matchの中でref mutを使うのが最初よくわからなかったけど、mutだけだと変更がlocalに閉じるしrefだけだと変更できないということっぽい
let-else この構文はめっちゃ便利そう。Goでいうif err := Do(); err != nil { return err; } みたいな...
tumblrでcodeを整形しないで書くの、どうやればいいんだ…
0 notes
Text
love.js
love2dがブラウザで動けばいいな~と思って調べていたら、こちらのリポジトリを見つけた
さっそく以前作ったゲームが動くか試してみたところ、ちゃんと動いてそうだった
いい感じ。これなら自分でエンジンやライブラリ開発を頑張らないで、love2dでもりもりゲーム作っていくのでいいのではという気持ちになった
0 notes
Text
ジャム用にめっちゃ遅いブロック崩しを作って考えたことを雑に。
一般的にゲームスピードは速ければ速いほど難しいと思うけど、逆にめっちゃ遅くするとそれはそれで難しくなるという気づきがあった。現在のボールの進行方向がわかりにくい。ゲームが長時間になるため休憩や睡眠をどう取るかの戦略が必要。これはもはやスポーツゲームなのでは(肉体に挑戦するという意味で)。最初は着弾まで1日ぐらいかかってた気がするけど、さすがにジャム中になんも動かないと試遊した人に怒られそうと思って20分ぐらいにした。
ジャムの結果は思ったよりはよかったけど賛否両論(否の方がまあ多い)という感じで、少数でも賛があるなら成功と思ってる。どっちにも尖れないのが一番よくない。もっと尖っていこう。
pico8は思ったより少機能低スペックで、だからこそ作り込める余地が少なくて良いとは思いつつ、最終的には枷を外せるような環境がいいなと思った。love2dは機能セットはいい感じに揃ってていいけど、いろんなブラウザでちゃんと動くのかが未知数なんだよな〜。細かいところでは、print命令がめっちゃ便利でデバッグ機能これでけっこう事足りるんではと思った。あと実時間を取る方法がけっこうむずくて(timegmっぽい関数を自前実装した)うーんってなった。
「ブラウザでまともに動くものが作れる」「シンプル」「四角や丸などプリミティブが一命令で描画できる」「デバッガが使える」あたりを、いい感じに拡張の余地がありつつ提供してくれる何か…欲しい!
1 note
·
View note
Text
雑なアウトプットをしていきたい
SNKRXを開発したゲーム開発者のブログを最近読んでいる
いろいろと気付きがあって面白い。2~3日で作って1~2ヶ月で整えるぐらいの規模いいな~とか、SNSで承認欲求を満たせてしまうとゲームづくりそのものへの熱が減ってしまうな~とか、作ったゲームが当たるかどうか運とはいえ運まかせでたくさんゲームを作るのはモチベーションの面で大変そうだな~とか。
別の話で、The 20 Games Challengeというのを知った。既存のゲームを真似て実装することでゲーム作りの方法を学ぶことができるらしい。
pico8かlove2dあたりで小さいゲームをちょこちょこ作るやつをやろうかな~と考えている。個人的興味・志向としてはエンジン部分も作りたさはあるけど、まず ある程度の品質の(デモのレベルでない、たとえばジューシーな装飾がされている) ゲームがどういうふうに作れるのかというのを知らないとどうしたらいいかわからんな~という…今まではエンジンとゲームを両方同時に作ったり、毎回エンジンを変えたりしていたけど、それだとコードとして再利用可能な形で積み重なるものが少ない(多少なり経験にはなると思うけど)
pico8は解像度が低かったり、他の人のソースコードを見て勉強しやすそうなところ、BBSによる配布の仕組みが揃っているのがよさそうに見えている。love2dは以前使った時に割と機能の揃い方がよかったのと、SNKRXやBalatroでも使っててよいかな~と思っている。いずれにせよ絵作り(2D, 3Dどっちも)の力があんまりない状況でなんとかなるようになってほしい。
2 notes
·
View notes
Text
buntdb について
buntdb とは
tidwall/buntdbは Pure Go で書かれた KVS ライブラリ。 インメモリで処理を行うが、ディスクに永続化することもできる。またトランザクションや Index がある。 Go からは mattn/go-sqlite3を使えば SQLite が使えるが、 SQLite は cgo が必要なので、環境によってはややビルド方法などで気を使う必要がある。 そのため Pure Go で使える DB ライブラリがほしかった。 buntdb は KVS なので SQLite ほど柔軟にクエリや集計できるわけではないが、用途によっては使えるかと思った。
シンプルな使い方
https://play.golang.org/p/wSHTfPSmmHp
package main import ( "fmt" "log" "github.com/tidwall/buntdb" ) func main() { db, err := buntdb.Open(":memory:") if err != nil { log.Fatal(err) } defer db.Close() // 読み書きができるトランザクションを生成 db.Update(func(tx *buntdb.Tx) error { // レコードの登録 tx.Set("key3", "value3", nil) tx.Set("key1", "value1", nil) tx.Set("key2", "value2", nil) return nil // エラーが返らない場合コミットされる }) // 読み込みのみのトランザクションを生成 db.View(func(tx *buntdb.Tx) error { // 全レコードを昇順でイテレート tx.Ascend("", func(key, value string) bool { fmt.Println(key, value) return true }) return nil }) }
結果
key1 value1 key2 value2 key3 value3
トランザクションは、読み書き, 読み込みのみ, どちらの場合も関数として表現する
Key も Value も string 型
Index を使う
https://play.golang.org/p/tchBZ89nFwy
package main import ( "fmt" "log" "github.com/tidwall/buntdb" ) func main() { db, err := buntdb.Open(":memory:") if err != nil { log.Fatal(err) } defer db.Close() // keyに`key:`というprefixがつくレコードを対象に、valueを文字列としてソートする`indexstr`という名前のインデックスを生成 db.CreateIndex("indexstr", "key:*", buntdb.IndexString) // keyに`key:`というprefixがつくレコードを対象に、valueを数値としてソートする`indexint`という名前のインデックスを生成 db.CreateIndex("indexint", "key:*", buntdb.IndexInt) db.Update(func(tx *buntdb.Tx) error { tx.Set("key:1", "13", nil) tx.Set("key:2", "2", nil) tx.Set("key:3", "9", nil) return nil // エラーが起きていなければ自動でコミットされる }) db.View(func(tx *buntdb.Tx) error { fmt.Println("iterate over indexstr") tx.Ascend("indexstr", func(key, value string) bool { fmt.Println(key, value) return true }) fmt.Println("iterate over indexint") tx.Ascend("indexint", func(key, value string) bool { fmt.Println(key, value) return true }) return nil }) }
結果
iterate over indexstr key:1 13 key:2 2 key:3 9 iterate over indexint key:2 2 key:3 9 key:1 13
Index の対象とするレコードは、Key のパターンで指定する
パターン文字列には*(任意の文字列)と?(任意の 1 文字)が使える https://pkg.go.dev/github.com/tidwall/match#Match
Multi Value Index を使う
https://play.golang.org/p/eEMPdWVoy6X
package main import ( "fmt" "log" "github.com/tidwall/buntdb" ) func main() { db, err := buntdb.Open(":memory:") if err != nil { log.Fatal(err) } defer db.Close() // 全レコードを対象に、valueをJSONとみなしてi1, i2の値の順にソートする`index`という名前のインデックスを生成 db.CreateIndex("index", "*", buntdb.IndexJSON("i1"), buntdb.IndexJSON("i2")) db.Update(func(tx *buntdb.Tx) error { var err error records := []struct { Key string Value string }{ // 値が文字列 {Key: "s12", Value: `{"i1":"1", "i2":"2"}`}, {Key: "s21", Value: `{"i1":"2", "i2":"1"}`}, {Key: "s22", Value: `{"i1":"2", "i2":"2"}`}, {Key: "s322", Value: `{"i1":"3", "i2":"22"}`}, {Key: "s32", Value: `{"i1":"3", "i2":"2"}`}, {Key: "s11", Value: `{"i1":"1", "i2":"1"}`}, {Key: "s31", Value: `{"i1":"3", "i2":"1"}`}, {Key: "s33", Value: `{"i1":"3", "i2":"3"}`}, // 値が数値型 {Key: "n12", Value: `{"i1":1, "i2":2}`}, {Key: "n21", Value: `{"i1":2, "i2":1}`}, {Key: "n22", Value: `{"i1":2, "i2":2}`}, {Key: "n322", Value: `{"i1":3, "i2":22}`}, {Key: "n32", Value: `{"i1":3, "i2":2}`}, {Key: "n11", Value: `{"i1":1, "i2":1}`}, {Key: "n31", Value: `{"i1":3, "i2":1}`}, {Key: "n33", Value: `{"i1":3, "i2":3}`}, } for _, record := range records { _, _, err = tx.Set(record.Key, record.Value, nil) } return err }) db.View(func(tx *buntdb.Tx) error { // indexを昇順にイテレート fmt.Println("iterate over index") tx.Ascend("index", func(key, value string) bool { fmt.Println(key, value) return true }) // indexの値が `{"i1":3, "i2":1}` と同じレコードをイテレート fmt.Println("iterate over index equal to n31") tx.AscendEqual("index", `{"i1":3, "i2":1}`, func(key, value string) bool { fmt.Println(key, value) return true }) // indexの値が `{"i1":3, "i2":1}` より大きいレコードをイテレート fmt.Println("iterate over index greater or equal to n31") tx.AscendGreaterOrEqual("index", `{"i1":3, "i2":1}`, func(key, value string) bool { fmt.Println(key, value) return true }) // i1 = 3のレコードをi2の値で昇順にイテレート fmt.Println("iterate over index where i1 = 3") tx.AscendRange("index", `{"i1":3, "i2":0}`, `{"i1":4, "i2":0}`, func(key, value string) bool { fmt.Println(key, value) return true }) return nil }) }
結果
iterate over index n11 {"i1":1, "i2":1} n12 {"i1":1, "i2":2} n21 {"i1":2, "i2":1} n22 {"i1":2, "i2":2} n31 {"i1":3, "i2":1} n32 {"i1":3, "i2":2} n33 {"i1":3, "i2":3} n322 {"i1":3, "i2":22} s11 {"i1":"1", "i2":"1"} s12 {"i1":"1", "i2":"2"} s21 {"i1":"2", "i2":"1"} s22 {"i1":"2", "i2":"2"} s31 {"i1":"3", "i2":"1"} s32 {"i1":"3", "i2":"2"} s322 {"i1":"3", "i2":"22"} s33 {"i1":"3", "i2":"3"} iterate over index equal to n31 n31 {"i1":3, "i2":1} iterate over index greater or equal to n31 n31 {"i1":3, "i2":1} n32 {"i1":3, "i2":2} n33 {"i1":3, "i2":3} n322 {"i1":3, "i2":22} s11 {"i1":"1", "i2":"1"} s12 {"i1":"1", "i2":"2"} s21 {"i1":"2", "i2":"1"} s22 {"i1":"2", "i2":"2"} s31 {"i1":"3", "i2":"1"} s32 {"i1":"3", "i2":"2"} s322 {"i1":"3", "i2":"22"} s33 {"i1":"3", "i2":"3"} iterate over index where i1 = 3 n31 {"i1":3, "i2":1} n32 {"i1":3, "i2":2} n33 {"i1":3, "i2":3} n322 {"i1":3, "i2":22}
buntdb.IndexJSON()を使うと JSON の特定のフィールドに対しての Index を作れる
buntdb.CreateIndex()の引数に複数の Index 関数を設定できる
buntdb.IndexJSON()の順は JSON 中の型による。文字列型であれば文字列として、数値型であれば数値として並ぶ
0 notes
Text
Wildfire
Wildfireというゲームを遊んだ。 https://www.twitch.tv/collections/R4b6MNsFWxaBgw
Wildfireは特殊能力をあやつってステルスする2Dアクションゲーム。 ステージがたくさんあり、1つクリアすると次のステージが遊べるようになる。
敵に見られたり音を聞かれたりすると気づかれるので、それを避けるような行動をとるとステルスできる。 具体的には、草むらや段差、橋の下に隠れたり、走りや落下音が鳴らないよう歩いたり草むらに落下するようにしたり。
能力は3種類あって、最初は火だけ、あとから水、草も使える。
火の使い方や影響はいろいろある。
可燃物(草、橋など)を燃やす。
敵にぶつけて脅かす。
ヤマネコ(においで追跡してくるので隠れても無駄で、めっちゃ強い)を怯えさせて、距離をとらせる(人間以外の生き物は火が怖いので。でも近づきすぎると襲ってくる)。
雪を溶かす。
暗いところで光源になる。敵の松明の火を奪うことで暗闇にして視界を奪う。
温度が上昇する。
Wildfireは能動的に敵を殺す術があまり無く、能力で直接できるのはせいぜい脅かすぐらい。 たとえば以下のようなことをやると殺せるけど、ゲームの達成項目に「不殺」というのもあって、 殺しまくりプレイはあまり推奨されていないように感じる。
火で温度を上げる。基本敵は火を見ると逃げるので閉じ込めるような場所がないとできず、あまり狙えない。
敵に物(死体とか)をぶつけると酸素値が減って、酸素値が0になると気絶する。気絶中に敵を水中に投げて窒息死させる。
高いところから落下させる。脅かしたり、橋を燃やしたり。
スイッチで開閉するシャッターで挟む。
爆弾樽に火を付けると爆発して、その爆風に巻き込む。
ただ、自分のプレイでは能力のアップグレードを積極的には行わずに進めたので、 ちゃんと能力アップグレードを行えばもっと強力になるのかもしれない。
なめらかに動くドット絵のキャラクター、きれいな炎のアニメーション、 状況によってダイナミックに移り変わるBGM(敵に見つかると緊張感が出る)など、演出面はけっこう力が入っている。
ステルスプレイが主体のゲームをあまり遊んだことがないのだけど、割と楽しく遊べた。 能力やオブジェクトの相互作用がたくさん用意されていて、この場面ではこういうことをやれば切り抜けられるんじゃないかという方法を探していくのが楽しい。 気になった点としては、ステージ内でチェックポイントとオートセーブがあってリトライ時にステージ中から遊べるのだけど、 オートセーブの間隔がわかりづらくけっこう戻されることがあった。それでも最初からよりはだいぶましだけど。
クリアまでのプレイ時間はおよそ7時間だった。 ステージごとにサブ目標があったり、不殺、完全ステルス、仲間を全員助ける、リトライなしでクリア、スピードランなど直接クリアには関係ない項目もあって、 それらをすべて達成するのはかなり骨が折れそう。
0 notes
Text
2020年ふりかえり
生活
年始に引っ越しをして、騒音問題がだいぶ解消されたのはよかった。 その後いきなりCOVID-19騒動。テレワーク主体となる。 一時期安定した睡眠が難しくなる。毎朝の散歩や夜極力光を浴びないようにするなど工夫して今は比較的落ち着いてる。 COVID-19以外にも香川県ネット・ゲーム依存症対策条例など色々とネガティブになるニュースが多い年で、 外部からの情報をシャットアウトすることが精神衛生上有効なのではないかという気がしている。
ゲーム
Celeste
とてもよかった。 だいぶ難しめのアクションを要求されるけど、画面単位でリトライが速やかにできるところや、若干入力が遅れてもアクションを受け付けてくれるなど操作しやすさに工夫があってストレスは少ない。 セレステ山を登る話で、ゲーム主人公の成長とプレイヤーの腕前の成長とがあって、登頂できたときには達成感が強い。
Momodora: Reverie Under The Moonlight
とてもよかった。 世界観がだいぶ暗めで、パンデミック下でやると沁みる。 敵の攻撃が雑魚敵でもだいぶダメージを受けるなど難易度は少し高めだけど、操作が快適で、チェックポイントも多めなのでストレスは少ない。
カメさんぽ
散歩のおとも
クロノレガリア
3月末にサービス終了してしまったけど、COVID-19さわぎで遊びおさめが十分にできなかった。 対戦型ゲームとして今までで一番はまったゲームで、PCで遊べるようにしてほしいという気持ちが強い。
Oculus Quest
DJMAX RESPECT V
PS4版を持っていたけど、PCでやれると手軽なので購入。 めっちゃ遊んでたら腱鞘炎になった。 そのままでもボリューム多いし、DLCたくさんあるしで遊びでがある。 対戦が熱い。
A Short Hike
島でほのぼの登山。 難易度は高くないけど、クリアすると達成感はある。
A Dance of Fire and Ice
オリジナリティある音ゲー。 1ミスで終了するため緊張感ある。曲を覚えて徐々に先まで進めるようになるので成長を感じられる。
Seven Scrolls
https://venbrux.itch.io/seven-scrolls
Tormentor❌Punisher
https://note.com/alohatengu/n/n700cf11e17c7
グノーシア
よかった。
レイジングループ
気持ちの良い話のまとめ方で、よかった。
リトルウィッチノベタ
よくできてる。
リングフィット
さぼりがち。
Tower of Heaven
だいぶ難しめのアクションを要求されるけど、画面単位でリトライが速やかにできるところや、入力に対して遅延なく反映されるところなど、ストレスは少なめ。 曲、雰囲気がめちゃくちゃいい。
Katana ZERO
最初動きが(Tower of Heavenと比べて)もっさりしてるかと思ったけど、慣れてくるといい感じに動かせる。 だいぶ難しめのアクションを要求されるけど、画面単位でリトライが速やかにでき、ストレスは少なめ。 雰囲気がよい。
スーパーメトロイド
レベルデザインが練られていると感じた。行けないところと行けるところの割合がよいというか、徐々に行けるところが増えてくる感じ。 操作性(スペースジャンプとか振り向きとか)が独特だったり、ボス戦がやや大味(ダメージ覚悟でミサイル連打する戦略がだいぶ有効)とかは微妙に感じた。
Hollow Knight
クリアまでおよそ20時間ぐらいかかった。十分楽しめたけど、個人的にもう少し手軽に遊べるゲームのほうが好み。 プレイ時間が長くなる要員として、マップが広かったりバリエーション豊かな強いボスという長所もあるけど、 チェックポイントからボスまでの距離があるのでリトライしづらかったり、ファストトラベルで移動できる場所が荒くて目的地まで移動に時間がかかったり、デスペナルティでお金を失って買い物ができなくなるなどストレスに感じるところもあった。 音をうまく使っていて、地図を売ってくれるキャラクターの鼻歌が聞こえてくると安心できたりする。
Minit
音楽
Crema Binaria
最高
料理
引っ越しを期に自炊中心の生活を試してみて、その一環で宅配系サービスを試してみた
Oisix
毎週メニューが異なるミールキットが注文できる。 20分で2人分調理できるのはいいが、そもそも調理が面倒になってきてしまった。 配送料の都合で毎週4000円ぐらい注文できるとよいが、ミールキットだけだとちょっと厳しい。
BASE FOODS
栄養がひととおり含まれたパンやスパゲッティが注文できるサービス。 毎日朝食にBASE BREADを1つずつ食べている。
ローソンフレッシュピック
ミールキットや食材など、スマホアプリで注文しておくとローソンで受け取りができるサービス。 他の宅配サービスに比べて1回の注文の量が少なくてもOKだったり注文間隔が短くてもOKというところがとても便利だったけど、残念ながらサービス終了。
茹で野菜の漬け
電子レンジで野菜を3分ほど加熱して(700Wの電子レンジなのでたぶん火の通りが速い)、調味液に漬け込むという調理をたまにやっている。 保存がきくし手軽に野菜がとれて便利。
もやし+酢+ごま油+めんつゆ+唐辛子
なす+しめじ+油揚げ+酢+めんつゆ+唐辛子
キャベツ千切り+ツナ+レモン果汁+オリーブオイル
味付けはめんつゆ以外にもごま+マヨネーズ、塩昆布などもよい。
保存容器
そのままレンジ保存容器が便利。 上記の調理済みミールキットの残りを入れたり、漬けに使ったり、炊いたご飯を冷凍したり、いろいろ使える。 ラップを使うことはほぼなくなった。
動画
オモコロチャンネル
毎週おもしろ動画がアップロードされていて、精神的にまいっていたときに延々と見ていてだいぶ助かった。
フリー素材でにらめっこしたら楽しすぎた!!
バカが作ったウミガメのスープを高知能集団に解かせよう!
一流ビジネスマンのチャット流儀
INDIE Live Expo
インディーゲームの紹介番組。かなり盛り上がっていた。
Game Maker's Toolkit
ゲームデザインなどについて議論しているチャンネル。 面白いのだけど、最近第三者が字幕をつける機能がYouTubeから削除されてしまい、日本語字幕が付かなくなってしまった。
技術
あまり集中してプログラミングの時間をとることができず、これといった成果物は出せなかった。 この状況ではしかたないかという気持ち。
本
しあわせの書
乱れからくり
プリンタニア・ニッポン
かわいい
「山奥ニート」やってます。
山奥で低生活費で暮らすのいいなーと思った。 ただスケールメリットを出すには複数人で暮らさないといけなそう
猫とともに去りぬ
https://twitter.com/neguse/status/1317065923174354944
殺戮にいたる病
自作の小屋で暮らそう
小屋を建てることで低生活費で暮らすのいいなーと思ったけど、 毎日風呂に入るのは厳しそう(主に下水の問題で)なのでやっぱり厳しそう。 あと本当の意味で一人だけの暮らしは厳しさがありそう https://dot.asahi.com/aera/2018083100054.html
そのへんのアクタ
ゆらゆらQ
おとなりに銀河
地図にない場所
その他
DeepL
だいぶ質がよい翻訳サービス。課金済み。 よいけどたまに文が抜ける。
Philips Hue
夜に明かりを減らすために利用。
羅小黒戦記
かわいい
1 note
·
View note
Text
散歩中にPodcastを聴いている
最近部屋で過ごしがちなので、意図的に散歩時間をとるようにしている。毎日同じ道を散歩していると飽きるのでPodcastを聴くようにしている。散歩中に本を読むと危ないけど、Podcastなら比較的安全に情報を摂取できて便利。
以下聴いているPodcast
Turing Complete FM
Rebuild.fm
yatteiki.fm
Misreading Chat
IGN JAPAN しゃべりすぎGamer
ゲームデザインの話
ボードゲームのゲームデザイン
そのうち自分もPodcast収録してみたい(けど手頃な題材もトーク力も呼べるゲストもない…)
0 notes
Text
最近遊んだゲーム
ここ最近いわゆる2D Platformer(足場を渡っていく、スーパーマリオのようなアクションゲームのジャンル)を中心にいろいろTwitch で配信しながら遊んでいる。ゲーム作る方のモチベーションがいったん切れてしまった感じなので、遊ぶ方をやろうかと。
とりあえず10月ぐらいからクリアしたのが以下のもの。
Minoria
天国の塔
Katana ZERO
Apple Slash
Noitu Love 2 Devolution
GRIS
ホソナガの野望
忍者ゲーム
スーパーメトロイド
Minit
長いものでも10時間以内にクリアできるぐらいのボリューム。このぐらいがほどよく感じる。
ミスした場合のリトライが速やかにできてチェックポイントが頻繁にあるのが自分的には好ましいということがわかった。Celeste、天国の塔、Katana ZEROなどは精密な操作が要求されるけど、リトライで戻される量が比較的小さくストレスがたまりづらいように感じた。リトライでかなり戻されてしまうと心が折れやすい。
0 notes
Text
雑にゲームを作る(7)
雑にゲームを作る(6) の引き続き。
https://neguse.github.io/ng/demo/tetris/ng.html
テトリス実装RTAの2回目をやってみたけど、タイマー操作をミスして測定できてなかった。およそ70分ぐらいで1時間切れず。事前に使えそうな処理をライブラリ化しておいたのだけど、うーん…
ついでなので、その後乱数まわりの実装をしてみた。同じテトリミノが複数回連続で選ばれないよう、7種類全部出たら次の7つをシャッフルして備える感じの実装とした。
次はアステロイド的なゲームを作って、そろそろオリジナルなゲームに取り掛かりたい。もともとこの取組を始めたのは1週間に1つシンプルなゲームを作りたいというところから来ているので。(ここには初めて書いた気がする)
最近ABA Gamesさんが1時間で小さいゲームを作る取り組みをしていて参考になりそう。確かにrect()とbox()両方あると便利だなーとか。(rectだけだとサイズを保ったまま動かす用途で引数渡すときに計算が必要で面倒)
https://github.com/abagames/crisp-game-lib
1 note
·
View note
Text
雑にゲームを作る(6)
雑にゲームを作る(5) からの引き続き。今回はテトリスっぽいものを作った。およそ1.5時間でできた。
https://neguse.github.io/ng/demo/tetris/ng.html
やったこと
盤面のデータ構造定義、初期化、表示
テトリミノのパターン定義
テトリミノの表示、移動、配置できるか判定
列の削除
Future Work
タイトル画面、ゲームオーバー画面
回転のパターンをもう少し自然にする、Oは回しても回らないなど
スコア、たくさん行消すとスコアが上がるなど
徐々に落下速度を上げる
テトリミノの種類ごとに色を変える
予告表示
テトリミノの出現頻度を適正にする(randの剰余でやってるので同じのが連続して出たりする)
よかったこと
途中まで番兵というか、壁を配列内にデータとして定義していたのだけど、それだと揃えて消したときに再度壁をつくらないといけないのが面倒でやめた。配列外の分は、「Y軸上方向を超えた分は何もなし扱い、それ以外は壁扱い」とした。これによって、行が埋まって消えたときの処理が単に上の行から下の行にコピペするだけで済んで、すごいきれいに書けてよかった。
glm::ivec2が大活躍。xとyそれぞれ引数などに渡さなくてすむし、+演算子で足せるので超便利。
途中までAt()をSetter, Getter両方の意味で使ってたのだけど、配列外になることが多そう(Iを回すと一時的に配列外になったり)ということがわかって急遽SetAt()とGetAt()に変えた。これがうまくはまって、特に消すところがよくかけた。
なんとかしたい
最終形が見えてない状態でもりもり書いてて、結局不要になった処理はそこそこあった。壁とかAtとか。何回かやりなおして手順最適化して、タイムアタック動画として投稿したい
rand()に頼らなくてすむよう、乱数ライブラリを導入したい
Board型をライブラリに導入できればタイムが縮むが、汎用化するのは難しい気がしている。どこまでライブラリとして切り出せるか
1 note
·
View note