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

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

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

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

Q&A

解決済

2回答

1480閲覧

swift3 ゲームでダンジョンの移動時の再描写

binga

総合スコア7

Swift

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

0グッド

0クリップ

投稿2017/04/30 14:49

swift3を用いてダンジョンRPGを作成しています。
ダンジョンを描写させて、主人公を移動させる際に、ダンジョンを1マス分移動させるのですが、普通にダンジョンの再描写では表示がおかしくなり、メモリー使用量もどんどん増えていきます。
一度描写したダンジョンをクリアした後に再描写したいのですが、どうすればいいのでしょうか?

以下にコードをの記載しましたが、必要ないと思う場所は行毎省略しています。

let mapview = mapcreate().mapview(map1:map1!,x1:x1!,y1:y1!) mapview.forEach { addChild($0) }
func mapview(map1:[Array<Any>],x1:Int,y1:Int)-> [SKSpriteNode] { var map3 = [SKSpriteNode]() for (i, data) in (map1.enumerated()) { for (j, value) in (data.enumerated()) { x2 = x1を加工 y2 = y1を加工 map2.position = CGPoint(x:x2,y:y2) map2.zPosition = -1 map3.append(map2) } } return map3 }

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

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

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

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

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

fuzzball

2017/05/01 00:23

どう表示がおかしくなるのでしょうか?
binga

2017/05/01 00:31

きちんと再描写される場所とされない場所があります。例えば、階段はひとつしかないのに移動を重ねると階段が複数表示されます。removeChildrenでNodeを削除しようとしたのですが、そもそもNodeの型が合ってないのかエラーがでます。全くの初心者ですので頓珍漢なことを言ってるかも知れませんが、宜しくお願いします。
guest

回答2

0

ベストアンサー

おそらく、関数内でいちいち新しくSpriteインスタンスを生成しているのが、原因なのではないかと思います。
これだと、Sprite消しづらいわ、メモリがいちいち消費されるわで、いいことがないと思います。
なので、sceneクラスのプロパティでか、もしくは、グローバルスコープあたりにSprite変数を宣言し、常にその変数にaddChildさせる方がいいかと思います。
そして、マス一個一個を個別に操作するためにSpriteを格納する配列も、同じくsceneクラスのプロパティとして用意しておくといいでしょう。
たとえば、、、

swift

1class GameScene: SKScene { 2 // クラス内で自由に使うために、プロパティとして宣言 3 var mapView: SKSpriteNode = SKSpriteNode(); 4 // 一個一個を格納するためのプロパティを宣言 5 var mapSingleArr: Array<SKSpriteNode>(); 6 7 override func didMove(to view: SKView) { 8 // 各マス用配列に全マス分のSpriteを入れておく 9 for mapNo in 0..<マップ全マスの個数 { 10 var innerSprite: SKSpriteNode = SKSpriteNode(); 11 self.mapSingleArr.append(innerSprite); 12 } 13 // シーンクラスにSpriteを入れておく 14 self.addChild(mapView); 15 } 16// 省略 17 func mapview(map1:[Array<Any>],x1:Int,y1:Int)-> [SKSpriteNode] { 18 19 for (i, data) in (map1.enumerated()) { 20 for (j, value) in (data.enumerated()) { 21 x2 = x1を加工 22 y2 = y1を加工 23 map2.position = CGPoint(x:x2,y:y2) 24 map2.zPosition = -1 25 // 配列プロパティに格納 26 self.mapSingleArr[i+j] = map2; 27 // クラスに宣言しておいたSpriteにSpriteデータを入れる。(必ず、クラスの配列プロパティから入れるようにする) 28 // self.mapView.append(self.mapSingleArr[i+j]); これは間違い 29 self.mapView.addChild(self.mapSingleArr[i+j]); 30 } 31 } 32 } 33 // マップを一旦クリアするメソッド 34 fun removeMaps(){ 35 self.mapView.removeAllChildren(); 36 } 37 38}

みたいな具合に。

また、全部を逐一再描画させるのではなく、
更新に必要な分だけを再描画(削除)させる、
というやり方にした方が、効率がよく、メモリの節約になると思えます。
常に見える分より一マス多く外周も描画させておき、
キャラクターが上に移動したら、上の一列を追加描画、
下の一列を削除、みたいな具合に。
組むとなると、けっこう時間かかるので、
概念だけ・・・。

投稿2017/05/01 05:09

編集2017/05/02 15:10
miyabi_takatsuk

総合スコア9528

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

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

binga

2017/05/01 14:51

丁寧な回答ありがとうざいます。 一点質問ですが、 // クラスに宣言しておいたSpriteにSpriteデータを入れる。(必ず、クラスの配列プロパティから入れるようにする) self.mapView.append(self.mapSingleArr[i+j]); ここをもう少し説明いただけないでしょうか? 描いていただいたコードをそのまま使用してみたところ、上記で「 タイプ 'SKSpriteNode'の値にメンバー 'append'がありません」のエラーが出てしまいます。
miyabi_takatsuk

2017/05/02 07:19

大変失礼しました、 そこ、appendではなく、addChildでした・・・。 正しくは、 self.mapView.addChild(self.mapSingleArr[i+j]); です。 大変失礼しました!
binga

2017/05/02 13:59 編集

addChildにしましたが駄目でした。 ビルドができてマップの描画までは行くのですが、removeMaps()を実行してもマップの左一列と場合によって下一列が除去されるだけで、右上の大部分はそのまま残ってしまいます。
miyabi_takatsuk

2017/05/02 15:14

回答の方の、removeMaps() メソッドの中身を変えました。 中途半端な回答ばかりですみません・・・。 いっそ、self.mapView内の子Nodeを全て消してしまう形にしました。 self.mapView内に、マップ要素以外の子Nodeがないのであれば、大丈夫かと思います。
binga

2017/05/02 15:52

できました!!! ありがとうございます。 本当に丁寧に回答していただき感謝です!
guest

0

メモリ使用量が増えるとか、階段が増えるという症状からすると、再描画するときに前回の表示を消していない(削除していない)のではないでしょうか?

投稿2017/05/01 00:42

fuzzball

総合スコア16731

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

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

binga

2017/05/01 00:55

仰るとおりであり、前回の表示を消す方法がわからなくて困ってます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問