実現したいこと
スト6のコンボ練習用にどの行動が何フレーム遅いかなどを調べるプログラムの作成をしたい。
発生している問題・分からないこと
発生している問題は!
イメージ説明
このようにゲーム内のフレームとプログラム内のフレームに誤差が発生することです。
原因か修正方法があれば知りたいです。
該当のソースコード
python
1import pygame 2import time 3 4# Pygameの初期化 5pygame.init() 6pygame.joystick.init() 7 8# ジョイスティックの初期化 9joystick = pygame.joystick.Joystick(0) 10joystick.init() 11 12print(f"コントローラー名: {joystick.get_name()}") 13 14# 前回の入力状態を保存する変数 15previous_button_states = [0] * joystick.get_numbuttons() 16previous_axis_states = [0.0] * joystick.get_numaxes() 17button_press_start_frame = [-1] * joystick.get_numbuttons() 18button_press_start_time = [-1] * joystick.get_numbuttons() 19axis_move_start_frame = -1 20axis_move_start_time = -1 21current_frame = 0 22current_direction = "中立" 23frame_time_ns = 1_000_000_000 / 60 # 1フレームは1/60秒 24 25# Pygameの時計 26clock = pygame.time.Clock() 27 28# 方向の記号を取得する関数 29def get_direction(x, y): 30 if y < -0.5: 31 if x < -0.5: 32 return "↖" 33 elif x > 0.5: 34 return "↗" 35 else: 36 return "↑" 37 elif y > 0.5: 38 if x < -0.5: 39 return "↙" 40 elif x > 0.5: 41 return "↘" 42 else: 43 return "↓" 44 else: 45 if x < -0.5: 46 return "←" 47 elif x > 0.5: 48 return "→" 49 else: 50 return "中立" 51 52# ボタンと軸の状態をチェックする関数 53def check_joystick_input(): 54 global previous_button_states, previous_axis_states, button_press_start_frame, button_press_start_time 55 global axis_move_start_frame, axis_move_start_time, current_frame, current_direction 56 pygame.event.pump() # 入力状態を更新 57 58 # ボタンの状態を取得 59 for i in range(joystick.get_numbuttons()): 60 button_state = joystick.get_button(i) 61 if button_state != previous_button_states[i]: 62 if button_state: 63 button_press_start_frame[i] = current_frame # ボタンが押された瞬間のフレームを記録 64 button_press_start_time[i] = time.perf_counter_ns() # ボタンが押された瞬間の時間を記録 65 print(f"ボタン {i} が押されました") 66 else: 67 press_duration_ns = time.perf_counter_ns() - button_press_start_time[i] # 押されていた時間(ナノ秒)を計算 68 press_duration_seconds = press_duration_ns / 1_000_000_000 # 秒に変換 69 press_duration_frames = round(press_duration_seconds / (1 / 60)) # 秒から1/60秒のフレーム数に変換 70 button_press_start_frame[i] = -1 71 button_press_start_time[i] = -1 72 print(f"ボタン {i} が離されました - 押されていた時間: {press_duration_frames}F ({press_duration_seconds:.5f}秒)") 73 previous_button_states[i] = button_state 74 75 # 軸の状態を取得 76 x_axis = joystick.get_axis(0) 77 y_axis = joystick.get_axis(1) 78 direction = get_direction(x_axis, y_axis) 79 80 if direction != current_direction: 81 if current_direction != "中立": 82 duration_ns = time.perf_counter_ns() - axis_move_start_time 83 duration_seconds = duration_ns / 1_000_000_000 # 秒に変換 84 duration_frames = round(duration_seconds / (1 / 60)) # 秒から1/60秒のフレーム数に変換 85 print(f"{current_direction} {duration_frames}F ({duration_seconds:.5f}秒)") 86 current_direction = direction 87 axis_move_start_frame = current_frame 88 axis_move_start_time = time.perf_counter_ns() 89 90 previous_axis_states[0] = x_axis 91 previous_axis_states[1] = y_axis 92 93# メインループ 94running = True 95start_time_ns = time.perf_counter_ns() 96while running: 97 for event in pygame.event.get(): 98 if event.type == pygame.QUIT: 99 running = False 100 101 check_joystick_input() 102 current_frame = int((time.perf_counter_ns() - start_time_ns) / frame_time_ns) # フレーム数をリアルタイムに計算 103 104 clock.tick(60) # 毎秒60フレームに設定 105 106pygame.quit() 107
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
chatgptでのコードの変更をためしたがうまくいかなかった。
補足
特になし
![guest](/img/icon/icnUserSample.jpg)
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。