Skip to content

djin-3/running_fingers

Repository files navigation

Running Fingers

指を足に見立ててタップで走るモバイルゲーム

プロジェクト概要

項目 内容
コンセプト 指を足に見立て、左右交互にタップして走る
目標 スイカゲームのように「シンプルだけど面白い」
ターゲット スコアアタック勢(将来的に大会も見据える)
プラットフォーム Android → iOS(クロスプラットフォーム)
サポーター要素 広告視聴・アプリ内購入(チケット/スキン/エフェクト)、課金でゲームが有利にならない設計

技術スタック

項目 技術
フレームワーク Flutter
言語 Dart
開発環境 Windows + Visual Studio Code
データ保存 SharedPreferences(ローカル)
バージョン管理 Git + GitHub

ゲーム仕様

操作モード

2本モード(スタンダード)

  • 画面下部に左右2つのボタンを配置
  • 左→右→左→右... と交互にタップ
  • 両手プレイ向け

1本モード(片手プレイ)

  • 片側のみを連打
  • 片手(親指)でプレイ可能
  • 通勤通学時など片手しか使えない状況向け

※ ランキングは各モードで分離

ゲームモード

タイムアタック(100回)

  • 100回タップするまでの時間を計測
  • 1/100秒単位の精度

タップチャレンジ(10秒)

  • 10秒間で何回タップできるかを計測

コアルール

タップ操作

  • 同じ側を連続タップした場合、最初の1回のみカウント(2本モード)

タップフィードバック

状況 エフェクト
正常タップ 波紋エフェクト + ボタン拡大縮小
無効タップ 赤色フラッシュ + シェイク
速度連動 速度に応じて5段階でエフェクト強化
振動 なし(連打ゲームのため)

エフェクトレベルシステム

速度は直近10タップの平均tpsで計算。速度が落ちたら即座にレベルダウン。

速度閾値

Lv 1本モード 2本モード
1 〜5 tps 〜10 tps
2 5〜8 tps 10〜15 tps
3 8〜11 tps 15〜20 tps
4 11〜13 tps 20〜23 tps
5 MAX 13 tps〜 23 tps〜

デフォルト演出(無料) — 白/薄青の光のみで5段階表現

Lv 波紋 ボタン 画面
1 小・1重・薄い 軽くフラッシュ なし
2 中・1重・はっきり 少し光る なし
3 大・2重 グロー(ぼんやり輝く) なし
4 大・3重・速い 強グロー 画面端がうっすら光る
5 MAX 全力・広がる 白フラッシュ 画面端が強く光る

課金スキン(色テーマ) — デフォルトと同じ光の動きに色を付与

スキン 波紋の色 グローの色 テーマ
デフォルト 白〜薄青 クリーン
オレンジ→赤 ホット
電撃 黄→白 エレクトリック
水色→白 水色 クール
オーラ 紫→白 ミステリアス

スタートフロー

  1. モード選択後、「スタート」ボタンを押す
  2. "On your mark"(固定秒数表示)
  3. "Set"(ランダム待機: 1.5〜3秒)
  4. "Go!!"(タップ開始)

フライングペナルティ

モード ペナルティ
タップチャレンジ マイナス表示からカウントアップ(例: -10から開始)
タイムアタック 一定秒数タップが無効

チケット機能

フライングペナルティなしでプレイできる特別アイテム。

チケットの効果

  • 使用するとフライングペナルティが発生しない
  • "Go!!"前にタップしても即スタート扱い
  • 記録が伸びやすくなる(有利)

チケットの入手方法

方法 獲得数 備考
広告視聴 1回分 無料
課金購入 10回分 アプリ内課金
スキップ 0 入手しない選択も可能

記録の表示

  • チケット使用時は記録に 🎫 マークを付与
  • 通常記録とチケット記録は同じランキングに表示
  • ランキングでは「チケット使用記録を含める/除外」のフィルタ機能あり
[フィルタ]
☑ チケット使用記録を含める

【ランキング】
1. Player_A  11.98秒 🎫
2. Player_B  12.34秒
3. Player_C  12.56秒
4. Player_D  12.60秒 🎫

タップ範囲とチート対策

タップ範囲の設計

項目 仕様
タップ位置 ユーザーが任意に設定可能
タップ範囲サイズ 小さめ固定(指1本分程度)
目的 複数指での同時タップ防止
大きいタップ範囲(NG):        小さいタップ範囲(採用):
┌─────────────────┐              ┌───┐
│ 複数の指が入る   │              │ 1 │ ← 指1本分
└─────────────────┘              └───┘

不正防止機能

対策 説明
同時タップ検知 2本モードで左右同時押しは無効
異常速度検知 人間の限界を超えるタップ速度は無効
範囲外タップ 設定範囲外のタップは無効

画面構成

2本モード

┌───────────────────────┐
│                       │
│   タイマー/           │
│   カウンター表示      │
│                       │
├───────────┬───────────┤
│  ┌───┐    │    ┌───┐  │
│  │ L │    │    │ R │  │ ← 小さいタップ範囲
│  └───┘    │    └───┘  │
└───────────┴───────────┘

1本モード

┌───────────────────────┐
│                       │
│   タイマー/           │
│   カウンター表示      │
│                       │
├───────────────────────┤
│         ┌───┐         │
│         │ ● │         │ ← 位置はカスタマイズ可能
│         └───┘         │
└───────────────────────┘

画面遷移

1. ホーム画面
   ├─ タイムアタック選択 → プレイ画面(100回)
   └─ タップチャレンジ選択 → プレイ画面(10秒)

2. プレイ画面
   - チケット使用選択(広告視聴/課金/スキップ)
   - 「スタート」ボタン押下
   - "On your mark" → "Set" → "Go!!"
   - タップ開始
   - フライング時: ペナルティ演出(チケット未使用の場合)
   └─ 完了 → リザルト画面

3. リザルト画面
   - 今回の記録(チケット使用時は🎫マーク付き)
   - ベストとの差分
   - 履歴表示
   ├─ 「もう一度」→ プレイ画面
   └─ 「メニュー」→ ホーム画面

※ 中断時(バックグラウンド等): 記録破棄してホームへ

データ構造

SharedPreferences設計

// プレイヤーデータ
class PlayerData {
  // チケット所持数
  int tickets = 0;

  // 2本モード - タイムアタック100回
  RecordData? timeAttack100Best_2finger;
  List<RecordData> timeAttack100History_2finger = []; // 直近10件

  // 2本モード - タップチャレンジ10秒
  RecordData? tapChallenge10sBest_2finger;
  List<RecordData> tapChallenge10sHistory_2finger = []; // 直近10件

  // 1本モード - タイムアタック100回
  RecordData? timeAttack100Best_1finger;
  List<RecordData> timeAttack100History_1finger = []; // 直近10件

  // 1本モード - タップチャレンジ10秒
  RecordData? tapChallenge10sBest_1finger;
  List<RecordData> tapChallenge10sHistory_1finger = []; // 直近10件

  // タップ位置設定
  TapPositionSettings tapPositionSettings;
}

class TapPositionSettings {
  // 2本モード: 左右ボタンの位置
  Offset leftButtonPosition;
  Offset rightButtonPosition;

  // 1本モード: ボタンの位置
  Offset singleButtonPosition;
}

class RecordData {
  final double value; // 秒 or タップ数
  final DateTime date;
  final bool hadFalseStart;
  final bool usedTicket;
  final int fingerMode; // 1 or 2
}

重要な設計ポイント

1. タップ精度が最重要

連打ゲームでタップ漏れや誤検出は致命的。プロトタイプ段階で徹底的に検証する。

2. フライングは駆け引き要素

大会を見据えているため、フライングでのリスタートではなく、ペナルティ制を採用。見切りスタートも戦略の一つ。

3. チケットは公平性を保つ仕組み

チケット使用記録は🎫マーク付きで区別。ランキングでフィルタ可能なため、通常プレイヤーとの公平性を維持。

7. 課金はあくまでおまけ・サポート

スキン・エフェクトは見た目のカスタマイズのみ。チケットはランキングで区別されるため実力評価に影響しない。広告スキップも選択肢の一つ。課金したからといってゲームで有利になることはない(Pay-to-Winなし)。

4. スイカゲームを参考に

シンプルなルール、中毒性のあるゲームプレイ、すぐ遊べてもう一回やりたくなる体験を目指す。

5. 1本モードで通勤通学をターゲット

片手でプレイできる1本モードにより、電車でつり革を持ちながらでもプレイ可能。通勤通学のスキマ時間を狙う。

6. チート対策は設計段階から

タップ範囲を小さくし、同時タップや異常速度を検知することで公平性を担保。


環境構築手順

1. Flutter SDKのインストール

# Windows: https://docs.flutter.dev/get-started/install/windows
# ダウンロード後、パスを通す

2. Android Studioのインストール

3. VS Code拡張機能

  • Flutter
  • Dart

4. 動作確認

flutter doctor

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors