最も難しいゲーム

正当化



私はHabr自身で書くかどうか考えました! このようなAndroidクラフトについて。 その結果、彼は興味を持っている人のために-彼らはそれを読んで、そうでない人のために-彼らは過去をめくると決めた。 そして、結局、誰も気分が悪くなることはありません。 興味のない人がこの投稿はここにはないともっと思うように、私は特別にほとんどすべての投稿をカットの下に隠しました。

数週間前にゲームを作成しました(1日のオフで作成しました)が、今ではそれを思い出してPlayマーケットに公開する自由時間があります。

物語全体は、ゲームの説明、実装の説明、およびゲームに直接関係のないニュアンスの説明に分かれています。



1.ゲームの本質





これは論理的なパズルで、円の回転とチップを空のセルに移動するため、同じ色のチップを一列に並べる必要があります。 異なる数の色と異なる数の円を選択することは、より困難です。 解決されるパズルの複雑さが増すと、スコア乗数が増加します。 合計ポイントは、パズルの複雑さと行われた動きの数に依存します。



2.いくつかの技術的なポイント



2.1グラフィックス


このゲームは、エンジンを使用せず、ビットマップを使用しなくても、クリーンなCanvasに実装されます。

アーキテクチャ的には、これはすべてのチップのリストを含むCustomViewです。 また、円のリストも含まれています。各円は、描かれているチップを指します。 CustomViewは、すべてのクリックイベントをキャッチし、それらを階層(円とトークン)に渡します。

おそらく円の回転を除いて、レンダリング全体はかなり平凡です-ここでは、arctgを介して必要な回転角度を見つける必要がありました。

それでも、彼女は回転します!





2.2保存


ゲームを可能な限り迅速に保存することは、設定(そのPrefferences)を使用して実装されました。 データベースまたはファイルキャッシュを使用することが可能であったことは明らかですが、実行されて以来、非常に高速です。 Googleを使用しないソリューションは、メモリから5分で作成されます。 ところで、それは次のとおりです。

Javaコード
public class PrefsManager { private static final String PREFS_TAG = "prefs_tag"; public static void save(Context c, String tag, String val) { SharedPreferences p = c.getSharedPreferences(PREFS_TAG, Context.MODE_PRIVATE); Editor e = p.edit(); e.putString(tag, val); e.apply(); } public static String get(Context c, String tag, String defVal) { SharedPreferences p = c.getSharedPreferences(PREFS_TAG, Context.MODE_PRIVATE); return p.getString(tag, defVal); } public static void delete(Context c, String tag) { SharedPreferences p = c.getSharedPreferences(PREFS_TAG, Context.MODE_PRIVATE); Editor e = p.edit(); e.remove(tag); e.apply(); } }
      
      







2.3ダイアログの評価アップ


ちょっとしたトリックですが、長い間使われてきました。 アプリケーションを初めて起動すると、RatingBar(5つ星を表す)とアプリケーションの評価を求めるユーザーの要求を示すダイアログが表示されます。 そして、2つのオプションがあります:



ユーザーをマーケットに送信するために、アプリケーションの起動回数はすべて同じPreferensに保存されます|| メールは単に意図によって使用されます。



3.興味



なぜなら アプリケーション自体の実装は非常に簡単なので、2つの新しいテクノロジーを使用することにしました。



なぜなら ゲームは適切な工数を消費しなかったため、広告を埋め込むのは間違っています。 もちろん、同じことが有料版にもさらに適用されます。 だからこそ、私は別の種類の収益化を検討することにし、Playhavenを見つけました。 標準の広告に加えて、彼らはMore gamesウィジェットのインストールを提案します。 このボタンを見ているユーザーは、高い確率でこのボタンを広告として認識しないため、全員の気分は素晴らしいままです。

この広告アフィリエイトプログラムの統合は、一般にコードの量の点で非常に注目に値しますが、正直なところ、このコードの例はすぐには見つかりませんでした。

More Gamesウィジェットのサンプル表示コードは次のとおりです
  /* *  ,  onCreate   onResume,        . */ private void prepareMoreGamesRequest() { moreGamesRequest = new PHPublisherContentRequest(this, MORE_GAMES_PLACEMENT); moreGamesRequest.preload(); } /* *  ,        ,        . */ findViewById(R.id.moreGames).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { moreGamesRequest.send(); prepareMoreGamesRequest(); } });
      
      







一般に、このサイトはすべての人を満足させますが、収入に関してはこれまでのところ評価するものはありません。最初からアプリケーションは非常に低かったため、私、私、そして家族全員によってインストールされました。



Scoreloopは私をそれほど喜ばせませんでした。 一方では、無料のサーバーにデータベースを提供します。 一方で、もっと既製で複雑なものを統合したいと思います。 説明します。 以前は、次のようなScoreloopを使用したアプリケーションをよく観察しました。



つまり これはかなり標準化されたビューです。 そして、インターネット上でのリーダーボードアクティビティの実装例はまだあります。 1回のインテントコールで、アプリケーションには包括的なハイスコアがあります。 ただし、このアクティビティは新しいSDKには含まれていません。 そのため、独自のListViewのフェンス、クエリの作成、ProgressBarsの表示などを行う必要があります。なぜ必要なのかわかりません。 しかし、おそらくドイツ人はよく知っています。

Scoreloopで他に気に入らなかった点-評価の得点と位置を持つユーザーの通常のリストを表示するには、2つのリクエストを行う必要があります。 1つはユーザーのリストを取得し、もう1つはユーザーの1人のランク(ランキングの位置)を取得します。 この方法でリーダーボードを実装した後:



完成したアクティビティをSDKから削除する必要がある理由が二重に明らかになりました。 しかし... ...ドイツ人はよく知っています。



PS



突然誰かが他の実装の詳細に興味があるなら、尋ねてください。 ここですべてを始めたからだけではありません。



All Articles