Screentendo-画面コンテンツに基づいたスーパーマリオブラザーズのレベルの生成

画像



Screentendoは、画面の選択した領域をSuper Mario Brosのプレイ可能なレベルに変えるデスクトップアプリケーションです。



以前にCocoaアプリを作成したことがなく、Sprite Kitを使用したことがないので、これは私にとって素晴らしい練習になりました。 ソースコードはこちらから入手できます







どのように機能しますか?



アプリケーションが起動すると、半透明のウィンドウが表示され、移動およびサイズ変更できます。 画面の一部の領域にウィンドウを配置した後、ウィンドウ内をクリックすると、アプリケーションはその下のコンテンツに基づいてレベルを作成します。



Screentendoには、主に2つの作業段階があります。選択した領域の構造を決定するための画像の処理と、レベルの作成です。



画像処理



最初のステップは、ウィンドウの下にある画面の選択領域を取得することです。 次の説明は、Safari内のGoogleスプレッドシート内でグラフを選択する例です。



アプリケーションは、CGWindowListCopyWindowInfo API(Quartz Window Servicesから)APIを使用して、画面に表示される順序で現在のセッションのウィンドウのリストを取得します。

Screentendoウィンドウおよび階層内の次のウィンドウ(このSafariウィンドウがあります)のウィンドウデータ(id、寸法など)は、このリストから取得されます。

ウィンドウ情報を使用して、CGWindowListCreateImageはSafariからスクリーンショットを取得します

スクリーンショットは、SafariウィンドウとScreentendoウィンドウの違い、およびScreentendoウィンドウの高さと幅を使用して、Screentendoウィンドウの境界に合わせてトリミングされます。



画像

Screentendoはターゲットウィンドウの上にあります(Googleスプレッドシートのグラフ)



画像

切り抜き画像



切り取られた画像は、Screentendoがゲームレベルを作成するために使用できる形式に変換される前に、いくつかのフィルターを通過します。



モーションブラー-全体的なノイズと視覚的なアーチファクトを低減します。

画像



輝度フィルター-画像の輝度の平均しきい値が計算され、2色に減らされます。

画像



ピクセル化フィルター-ピクセル化フィルターは、画像の詳細を単純化し、細分化のために準備します。

画像



サブブロック-画像はサブブロックに分割され、デフォルトのサイズは10x10ピクセルです。

画像



画像



配列の平均ブロック色-各サブブロックについて、平均色が計算されます。 2次元配列が作成され、主に黒で構成される各サブブロックは値1を取り、各サブブロックは主に白で、値0を取ります。

画像



レベル作成とゲームロジック



2次元配列としての画像の表現は、ゲームレベルを作成するGameSceneクラスに渡されます。 配列を調べ、値0を無視して値1のブロックを作成します。



画像



画像



ブロック、雲、背景、プレーヤーのスプライト



配列が処理されると、背景、雲、およびプレーヤーがシーンに追加されます。 ゲームの残りの部分は、Sprite Kit物理エンジン(プレイヤーの物理、衝突処理、空飛ぶブロックのアニメーションなど)で提示される基本的な物理原理に基づいています。



アプリケーションには、ブロックのサイズを変更するためのメニューがあります。 小型化により、解像度と処理時間が増加します。



制限事項



このアプリケーションは概念実証であり、いくつかの欠点があります。 これまでの画像処理は非常に遅く、画像をサブブロックに分割するのは遅くなります(各サブブロックはNSImageになります。これは解決するのにあまり効果的ではありませんが、実装は迅速です)。 元の画像の色の十分に強いコントラストも必要です。 物理学は少し曲がっています-私はスーパーマリオブラザーズのエミュレーターを書いたのではなく、「非常にうまく機能する」ものを書いただけです。 したがって、時々私はまだ克服していないいくつかの幽霊のようなピークがあります。



コードはgithubリポジトリで入手できます。



All Articles