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

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

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

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

Swift

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

Q&A

解決済

1回答

1475閲覧

移動させるとNodeが荒ぶる?

fugu

総合スコア35

SpriteKit

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

Swift

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

0グッド

0クリップ

投稿2018/08/07 07:06

編集2018/08/07 10:21

別のクラスから呼び出したノードを移動させると、ノードが左上とタッチ位置を
交互にブレるのですが、なぜこうなるのか、原因がわかりません。
座標がズレている感じです。
ゲームシーンに全て書けばこの現象は起きないのですが、
対処法をご存知の方よろしくお願いします。、
GameScene.swift

import SpriteKit class GameScene: SKScene { override func didMove(to view: SKView) { let square = Square() square.setScene(scene: self) self.addChild(square) } }

Square.swift

import SpriteKit class Square: SKSpriteNode { var gameScene: SKScene! func setScene(scene: SKScene) { self.gameScene = scene } init() { super.init(texture: nil, color: UIColor.blue, size: CGSize(width:50,height: 50)) self.position = CGPoint(x:100, y:100) self.physicsBody?.affectedByGravity = false self.isUserInteractionEnabled = true } override func touchesMoved(_ touches: Set<UITouch>, with: UIEvent?){ let location = touches.first!.location(in: self) self.position = location //この行を追加して座標を確認しました。 print("Square",self.position,"location",location) } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } }

座標のログの最初の数行です
四角ノードのポジションをx:100, y:100に設定しているので
ズレているようです。

log

1Square (-2.33332824707031, 6.3333740234375) location (-2.33332824707031, 6.3333740234375) 2Square (100.333320617676, 100.666618347168) location (100.333320617676, 100.666618347168) 3Square (-1.66666412353516, 7.66672515869141) location (-1.66666412353516, 7.66672515869141) 4Square (100.999992370605, 101.333267211914) location (100.999992370605, 101.333267211914) 5Square (-0.333320617675781, 10.0001068115234) location (-0.333320617675781, 10.0001068115234) 6Square (101.666641235352, 102.33325958252) location (101.666641235352, 102.33325958252) 7Square (1.66670227050781, 13.3334121704102) location (1.66670227050781, 13.3334121704102) 8Square (102.666625976562, 103.999969482422) location (102.666625976562, 103.999969482422) 9Square (2.00003814697266, 14.0000152587891) location (2.00003814697266, 14.0000152587891) 10Square (103.666618347168, 105.666679382324) location (103.666618347168, 105.666679382324)

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

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

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

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

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

fuzzball

2018/08/07 07:20

「座標がズレている感じ」ということは、座標はズレていないということでしょうか?
fugu

2018/08/07 07:30

「座標がズレている感じ」とは原因がわかないので感じと言ったのですが・・座標はズレているからこうなると言っているのでしょうか?
fuzzball

2018/08/07 07:39

実際の座標がどうなっているか調べていないということでしょうか?調べていないのなら調べて下さい。
fugu

2018/08/07 07:40

なるほど、そういう意味だったのですね、調べてみます。
fuzzball

2018/08/07 08:48

eventとズレに関係はないでしょうか?
fugu

2018/08/07 10:25

すみません、with event: UIEvent?を変更with: UIEvent?に変更してみたりしたのですが、変わりませんでした。これの事を言われているのかもピンと来ていません。
fuzzball

2018/08/08 00:27

eventは関係ないようなので元に戻しておいて下さい。そもそもの質問なのですが、何をしようとしているのでしょうか?画面内のタップした位置に四角を移動させたいのでしょうか?
fugu

2018/08/08 01:43

回答ありがとうございます。分けて書く事ができれば、わかりやすく管理できると思って質問しました。
fuzzball

2018/08/08 01:46

そういうことではなくて、何をしようとしているコードなのか?ということです。例えば、画面内のどこをタップ(ドラッグ)しても四角が移動するのか、それとも、四角をドラッグしたときだけ移動するのか、というようなことです。
fugu

2018/08/08 01:50

四角をドラッグしたときだけ移動するようにしたかったです。
guest

回答1

0

ベストアンサー

touchesMoved

SquaretouchesMovedを実装すると、Squareをタップしたときしか呼ばれません。
画面内の任意の位置に移動させたいのであれば、Scene側にtouchesMovedを実装して、そこでSquareの位置を変更しないといけません。

ゲームシーンに全て書けばこの現象は起きないのですが

というのは、おそらくそういうことですよね?

座標

touchesMovedを修正すれば関係なくなるのでサラっと書きます。

.location(in: self)を使っているので、取得できる座標は自分自身(Square)のローカル座標になってしまいます。その座標をScene座標系として使って(セットして)いるために、変な位置に移動&元の位置に戻る、を繰り返してしまいます。

本来やりたかったこと

四角をドラッグしたときだけ移動するようにしたかったです。

ということなので、現状のコードを少し修正すればOKです。
タップした座標をSceneの座標系で取得します。

swift

1let location = touches.first!.location(in: self.gameScene)

ちゃんと書くならこうです。

swift

1if let location = touches.first?.location(in: self.gameScene) { 2 self.position = location 3}

投稿2018/08/08 01:14

編集2018/08/08 02:01
fuzzball

総合スコア16731

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

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

fugu

2018/08/08 01:46

今回も色々勉強になりました。 本当にありがとうございました。
fuzzball

2018/08/08 02:01

回答に追記しました。
fugu

2018/08/08 02:04

こんな書き方があるんですね。 回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問