質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SpriteKit

SpriteKitは、iOSやOS Xで使用できるApple社製の2Dゲーム開発フレームワークです。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

1752閲覧

Timerの進み方が指定した速さより早く動いてしまうことがある。

moooooooolch

総合スコア13

SpriteKit

SpriteKitは、iOSやOS Xで使用できるApple社製の2Dゲーム開発フレームワークです。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

1グッド

0クリップ

投稿2017/06/03 06:59

編集2017/06/05 01:58

swift3.1、spriteKitでゲームを作っています。
ボタンのタップの速さを競うゲームで、ボタンのタップが早くなると、テクスチャの切り替えによりアニメーションさせているノードも早く動いているかのように見えるよう設定しました。

しかし、最初に設定した時、複数の画像を利用してテクスチャを切り替えていたのですが、処理が重くなったせいか時間を計測するTimerの進みが遅くなり、1秒をカウントする間が2秒ほどかかるようになってしまいました。

そこで、一枚の画像に複数の画像をまとめ、SKTexture(rect:in:)によって画像を切り替えるように設定し直しました。

すると今度は、一見期待通りのTimerの動きをしているように思えたのですが、プレイ中2秒間ほどの間、Timerが倍の速さで進んでいることに気づきました。
この現象は、1プレイ中に1回発生することがあり、2回は発生しません。

Timerの進み方に関連したコードには手をつけていないはずなのですが、このような現象が発生する原因はどのようなものが考えられるでしょうか。

追記
一度人を動かすアニメーションをやめてみたのですが、それでも問題の現象が発生しました。また、この現象が発生するのは毎回タイマーが発火して約17秒後であることに気づきました。デバッグが不十分なまま質問して申し訳ありません。

Bongo👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuzzball

2017/06/05 01:05

「2秒間ほどの間、Timerが倍の速さで進んでいる」ところ以外は全て1秒間隔なのでしょうか?
moooooooolch

2017/06/05 01:21

正確にはtimerのtimeIntervalは0.01で、認識できる速さの目安として1秒と言っています。それ以外の部分では処理が重いせいかほんのわずかなズレがあるようですが、ほぼ等間隔です。
fuzzball

2017/06/05 01:29

その「わずかなズレ」が積み重なって、その辻褄合わせで一時的に速くなっているということはないでしょうか?1プレイのトータルで見た場合、間隔×呼ばれた回数=プレイ時間にはなっていないでしょうか?
moooooooolch

2017/06/05 01:35

ええと、ゲームの終了条件がタイマーのカウントが0になった時などではなく、タップが特定の回数に達した時なので、1プレイのプレイ時間は毎回変わってしまうため、確認はできません。説明不足ですみません。
fuzzball

2017/06/05 01:38

毎回変わるとしても、ある1回の時の時間/回数で確認すればいいのですが‥。ただ、ドキュメントによると「辻褄合わせ」は行わないようなので、この件に関しては忘れて下さい。
guest

回答2

0

「倍の早さ」という点が気になりますね...作成されましたコードの中で、何らかの条件でタイマーが二重にスケジューリングされてしまう可能性のある箇所はないでしょうか?

投稿2017/06/04 04:21

Bongo

総合スコア10807

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

moooooooolch

2017/06/05 00:54

プレイ中の状況に合わせて"wait","ready","playing","timeUp"と変化する変数を用意しているのですが、その変数が"wait"の時にしかタイマーを発火させるコードは書いていません。update()でprintして確認してみても、"wait"になっているようなことはなかったので、ないのではと思います。
guest

0

自己解決

質問の内容から問題のコードとなる部分が多すぎてどのコードを載せればよいのかわからなかったので載せていなかったのですが、その中のイージーミスが原因でした。タイマーが早くなっているわけではなく、タイマーによって変化させていた変数が正確ではなかったことが原因でした。おさわがせして申し訳ありません。

投稿2017/06/05 02:26

moooooooolch

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問