this
ではなく、コンストラクターとメソッドで変数を使用すると、縮小後、4番目のthis
からバイトの保存が開始されるという事実について考えましたか?
// this.this.this.this. var s=this;ssss
私はこれと他の強化された方法を使用してjs13kGamesコンテストに参加しました。その目的は、サイズが13キロバイトを超えないゲームを作成することです。

ゲームはほとんど準備ができており、数日のうちに目を覚まします...
どんな競争?
js13kGamesは、ロシアではまだあまり人気がないようです。
- 2012年から毎年8月13日から9月13日まで開催されます。
- すべてのコードは1つのhtmlファイルに含める必要があります。
- このファイルを含むzipアーカイブのサイズは13キロバイトを超えてはなりません。
- ゲームはChromeとFirefoxの最新の安定したバージョンで実行する必要があります。
- ゲームは8月13日に表明されたテーマと相関することが望ましいです。
可読性を損なう
上記の例はビューティーコードに追加されませんが、 this
集中的に使用されるコンストラクターとメソッドでthis
、このアプローチは5回目から呼び出しごとに3バイトを節約します。 たとえば、デザイナーの1人にはこれが39個ありthis
。 それらをself
に置き換えると、100バイト以上を節約できました。
プロジェクト全体で、これらの置換のみが1キロバイト以上を節約したと思います。
おそらく、このような小さなスポーツプロジェクトにのみ適した別の手法は、多数のグローバル変数と関数です。 ほとんどすべての汎用ツール( random()
、 getUniqueID()
および多くの特定のもの(Canvasコンテキストでのスケーリング時にアンチエイリアスを無効にする関数など)はグローバルスコープにあります。 ここでは、もちろん、これらのツールの名前に特別な注意を払って、コードが可能な限り自己文書化されるようにする価値があります。
tr() // tools.random r() //
縮小中、これらの関数はすべて1文字を占有し(たとえば、オブジェクトに配置する場合は3文字ではなく)、非常に印象的な節約になります。 random()
関数のみがコードで77回発生し、その「グローバル」は150バイトを節約します。
非常に具体的な状況:base64でエンコードされたgifにスプライトを保存することにし、結果の行がすべてR0lGODlh
始まることにR0lGODlh
。 合計14個のスプライトがあり(元のアイデアによれば、もっとあるはずでしたが)、この最初の文字列を文字列をImage
オブジェクトに変換する関数にすると、さらに100バイト節約できました。
最後のニュアンスは、コードの認識に少しでも役立つ可能性がありますが、 DRYの原則に従う必要があります。 なぜそれが可能ですか? コードが断片化しすぎることがあるためです。 少なくとも2回繰り返されるコードのほとんど数行ごとが、関数への割り当ての候補になります。
ゲームプレイを食い止める
キャラクターが走る表面を模倣することで、ある程度のコードを避けることができました。実際、これはレベル境界であり、地球のテクスチャは単に「舞台裏」にあります。 残念ながら、この決定により、プラットフォーマーは実際、プラットフォーマーであることがほとんどなくなりましたが、そのような根本的な見落としを修正する時間はもうありませんでした。
一部のユニットは、「マイナスのプレイアビリティ」のカテゴリに分類されます。これはスペースをほとんど占有しませんでしたが、不十分であることが判明しました。
主な例:風景を多様化するように設計された石は、ジャンプできる表面になりませんでした。 代わりに、プレイヤーを撃退し、ダメージを与えます。 石をネズミの巣穴に変えたので、すぐにハックして出て行かなければなりませんでした。あなたがそれを叩き始めると、そこから5ストロークごとにネズミが現れます。
アニメーション
前にも言ったように、すべてのスプライトはbase64でラップされたGIFファイルに保存されます。 これらのサイズは最小限であり、アニメーションを作成すると、16倍になります(これはゲーム内の「ピクセル」のサイズです)。 スプライトの説明を持つオブジェクトは、サイズを決定するためにユニット設計者によっても使用されます。 つまり、アニメーションはユニットのサイズに調整されませんが、その逆も同様です。
未使用
アイデアの最初の段階では、 true
とfalse
を1
と0
に置き換えることはどこにでもありましたが、開発中にそれを完全に忘れてしまい、最後にしか覚えていませんでした。 幸いなことに、私はこれを行う必要はありませんでした。作品がコンペティションに提出されるまでに、サイズは通り過ぎました。このような信頼性の低いツールに頼ることでどれだけの恐怖に耐えなければならないかさえ想像できません。
音楽を作成するために、2文字ごとに音を表す表記法を使用しました。文字列は音符であり、数字はその長さの分母です(ゼロは文字列ではなく一時停止です)。 ミリ秒単位の実際の持続時間は、音符全体の持続時間を音符の持続時間の分母で割ることによって計算されます。
notes: [ 'A4', 4, 0, 8, 'G4', 8, 'A4', 8, 'A4', 16, 'G4', 16, 'C5', 8, 'D5', 8, 0, 4, 'A4', 8, 'A4', 16, 0, 16, 'A4', 8, 0, 8, 'G4', 8, 0, 8 ]
「サンプル」を導入することでサウンドトラックの音量を下げる計画でした。音楽フレーズを再利用しましたが、「Submit」ボタンをクリックする前の最後の1時間に音楽が書き込まれ、サウンドの種類が何もなかったため、
おわりに
おもしろそうに思えますが、これらの圧縮の最適化の大部分は不要でした。元のグローバル変数の名前でも、ゲームファイルは10.1 Kbのzipアーカイブになりました( index.htmlは31.9 Kb)。 本当に足りなかったのは時間でした。 特に、レベルデザイン、明確なサウンドトラック、少なくとも少数のプレイテストには不十分でした。
昨年js13kGamesにすでに参加していましたが、その時点で締め切りの2日前に仕事を始めました。 したがって、経験が少ないため、最初のパンケーキはゴツゴツと出てきました。 今年、私は誇りに思うものさえありますが、もちろん、gamedevはゲームの真の高さからはほど遠いです。
あなたのtinycode-projectsについて学び、コメントを共有することは興味深いです!