パックマン風ゲームにおける当たり判定について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
keito94
記事: 264
登録日時: 1年前
連絡を取る:

パックマン風ゲームにおける当たり判定について

#1

投稿記事 by keito94 » 1年前

どうもkeito94です。
只今スプライトクラスのバグ事件を乗り越え、迷路を作っているところなのですが、
少しわからないことがあったので質問させていただきます。
パックマンには、緊急回避のために左右がつながっているワープトンネルがあります。
ワープ通路であることを表すチップをマップデータに入れるというのはわかっているのですが、

コード:

    def create(self, screen,blocks):
        transColor = self.image.get_at((0, 0))
        self.image.set_colorkey(transColor, RLEACCEL)
        for y in range(MAP_HEIGHT):
            for x in range(MAP_WIDTH):
                if MAP[y][x] == BLOCK:
                    cell = Block(self.imageList[1], (x * CHIPSIZE, y * CHIPSIZE), screen)
                    blocks.add(cell)
                elif MAP[y][x] == FOOD:
                    screen.blit(self.imageList[2], (x * CHIPSIZE, y * CHIPSIZE))
                elif MAP[y][x] == WARP:
                    # ここにワープの処理を入れる
                    pass
                else:
                    pass

パックマンをワープさせる方法がわかりません。
あと、迷路を表示したときの処理落ちの原因が、メインループでMap.create(元Map.draw)を直接実行していたということがわかったので、
プレイヤーの部分も含め、少し手を加えました。(そりゃあ、マップチップが増えれば増えるほど処理落ちするもんね…。)

コード:

def Main():
    pygame.init()
    screen = pygame.display.set_mode((640, 480))
    player = pygame.sprite.Group()
    blocks = pygame.sprite.OrderedUpdates()
    pacman = Player()
    maze = Map()
    player.add(pacman)
    clock = pygame.time.Clock()
    # 迷路を生成する。
    maze.create(screen,blocks)
    # メインループ
    while True:
        clock.tick(60)

        screen.fill((0, 0, 0))

        blocks.draw(screen)

        player.update(blocks)

        pacman.draw(screen)

        pygame.display.update()  # 画面を更新


        # イベント処理
        for event in pygame.event.get():
            if event.type == QUIT:  # 閉じるボタンが押されたら終了
                pygame.quit()  # Pygameの終了(画面閉じられる)
                sys.exit()

追記:本来の主題とはかけ離れていったので、タイトルを変えました。
最後に編集したユーザー keito94 on 2017年7月28日(金) 18:23 [ 編集 1 回目 ]
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

アバター
usao
記事: 1449
登録日時: 5年前

Re: パックマン風ゲームにおけるワープ通路の実装の仕方がわからない。

#2

投稿記事 by usao » 1年前

> パックマンをワープさせる方法がわかりません。

そのワープトンネルとは無関係な場所をパックマンが移動する場合において,
いかなる処理によりパックマンを「移動」させているのでしょうか?

当該「移動」とは,おそらく
「パックマンの位置」なる座標値を,ある値から別のある値へと更新することにより成されるものと思いますが,
そのようである場合,「移動」と「ワープ」との間の違いとは何になるのでしょうか?

アバター
keito94
記事: 264
登録日時: 1年前
連絡を取る:

Re: パックマン風ゲームにおけるワープ通路の実装の仕方がわからない。

#3

投稿記事 by keito94 » 1年前

>>usaoさん
教えますね。

ワープトンネルとは無関係なところを移動させる処理を簡単に説明すると、
①プレイヤーのキー入力を確認する
②パックマンの移動する方向を入力した方向に変更する
③パックマンが壁に衝突するのなら、そこで停止
(今のだと操作感がめちゃくちゃ悪いかも…。なにか改善案出してくれますか?)

ワープトンネルを移動するときの処理を簡単に説明すると、
①パックマンがワープトンネルを移動している時に画面外に消えたら
②パックマンの座標を右の通路なら左の通路、左の通路なら右の通路を通っているように更新する。
(左右がつながっているように見せる。)
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

アバター
usao
記事: 1449
登録日時: 5年前

Re: パックマン風ゲームにおけるワープ通路の実装の仕方がわからない。

#4

投稿記事 by usao » 1年前

> パックマンをワープさせる方法

に関して

> ワープトンネルを移動するときの処理を簡単に説明すると、
> ①パックマンがワープトンネルを移動している時に画面外に消えたら
> ②パックマンの座標を右の通路なら左の通路、左の通路なら右の通路を通っているように更新する。
> (左右がつながっているように見せる。)

のように処理内容を順序立てて説明できるのであれば,
このトピックにおける質問内容は一体何なのでしょう?

アバター
keito94
記事: 264
登録日時: 1年前
連絡を取る:

Re: パックマン風ゲームにおけるワープ通路の実装の仕方がわからない。

#5

投稿記事 by keito94 » 1年前

>>usaoさん

主語がなかったですね…。
どうやってパックマンが画面外に出たかどうかを判定するか?
ということです。
オフトピック
説明不足がまたたたった…。
拙い文章だけどわかってくれるかな…。
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

アバター
purin52002
記事: 235
登録日時: 1年前
連絡を取る:

Re: パックマン風ゲームにおけるワープ通路の実装の仕方がわからない。

#6

投稿記事 by purin52002 » 1年前

こんにちは

ワープトンネルのチップの座標とプレイヤーの座標が一致したらワープさせるのでしょうか?
それとも、プレイヤーの座標がマップの右端の座標以上(もしくは左端以下)になったらワープさせるのでしょうか?

パックマンで遊んだことがないので詳しい仕様がわからないのですが、おそらくは座標を判定に使えばいいと思います^^
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^

ISLe
記事: 2624
登録日時: 8年前
連絡を取る:

Re: パックマン風ゲームにおけるワープ通路の実装の仕方がわからない。

#7

投稿記事 by ISLe » 1年前

オフトピック
keito94 さんが書きました:パックマンには、緊急回避のために左右がつながっているワープトンネルがあります。
ワープ通路であることを表すチップをマップデータに入れるというのはわかっているのですが、
まるでパックマンにワープ通路を表すチップがあるかのような書き方ですね。
パックマン『風』とパックマンはきちんと区別して欲しいと思います。

パックマンにこだわらないなら、以下は気にしなくてもかまいません。

パックマンには、「ワープ通路であることを表すチップ」というものはありません。
モンスターの速度が遅くなる部位設定というものはあります。

パックマンは、上下・左右がそれぞれ円筒状に繋がったマップです。
迷路の見えている部分は224x256(パックマンは16x16)で、マップ自体は256x256の広さがあります。
つまり、ワープトンネル内(見えない範囲)は32ピクセルあります。
座標が256以上になる部分は反対側に表示されます。

ワープトンネルが複数あったり上下にあったりする海賊版のパックマンだと確認しやすいです。

原作のパックマンでも256面でバグって迷路が崩れる際、上下に行き来できます。

ISLe
記事: 2624
登録日時: 8年前
連絡を取る:

Re: パックマン風ゲームにおけるワープ通路の実装の仕方がわからない。

#8

投稿記事 by ISLe » 1年前

keito94 さんが書きました:ワープトンネルとは無関係なところを移動させる処理を簡単に説明すると、
①プレイヤーのキー入力を確認する
②パックマンの移動する方向を入力した方向に変更する
③パックマンが壁に衝突するのなら、そこで停止
(今のだと操作感がめちゃくちゃ悪いかも…。なにか改善案出してくれますか?)
改善案とは?
それこそパックマンを真似れば良いのではないでしょうか。

パックマンは…
進行中に逆方向に入力があるとその場で反転しますが、進行方向と垂直の方向の入力があってもそのまま直進し、曲がり角に達すると入力方向に曲がります。

さらに、曲がり角に達する前から曲がりたい方向に入力していた場合、正面の壁に突き当たることなくわずかにショートカットします。
曲がり角が連続する地形を利用することでモンスターの追跡を躱しやすくなります。

アバター
keito94
記事: 264
登録日時: 1年前
連絡を取る:

Re: パックマン風ゲームにおけるワープ通路の実装の仕方がわからない。

#9

投稿記事 by keito94 » 1年前

purin52002 さんが書きました: プレイヤーの座標がマップの右端の座標以上(もしくは左端以下)になったらワープさせる
僕の頭の中では、そう考えてます。
でも、ワープトンネルのチップの座標をどうやって教えるのかがわかりません。

コード:

                elif MAP[y][x] == WARP:
                    # ワープトンネルのチップの座標を教える。
                    pass
ここからはPygameの初歩的な質問になるのですが、マップチップなどの画像を使うのがスプライトなのは知っています。
ワープトンネルのように画像を使わないが、ゲーム上重要な情報を教えるチップの処理にはどんな機能を使えばいいのでしょうか?
オフトピック
ISLe さんが書きました: 進行中に逆方向に入力があるとその場で反転しますが、進行方向と垂直の方向の入力があってもそのまま直進し、曲がり角に達すると入力方向に曲がります。
そのアルゴリズムの組み方がよくわからないので、その手がかりとなるものを教えて下さい。
あと、これは現在のパックマンの操作のルーチンです。
具体的な変更点を教えて下さい。

コード:

        if pressed_key[K_RIGHT]:
            self.freamnum = RIGHT
            self.change_speed(2, 0)
        if pressed_key[K_LEFT]:
            self.freamnum = LEFT
            self.change_speed(-2, 0)
        if pressed_key[K_UP]:
            self.freamnum = UP
            self.change_speed(0, -2)
        if pressed_key[K_DOWN]:
            self.freamnum = DOWN
            self.change_speed(0, 2)
ISLeさんのご指摘を受けてオフトピにしました。
最後に編集したユーザー keito94 on 2017年7月25日(火) 17:53 [ 編集 1 回目 ]
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

ISLe
記事: 2624
登録日時: 8年前
連絡を取る:

Re: パックマン風ゲームにおけるワープ通路の実装の仕方がわからない。

#10

投稿記事 by ISLe » 1年前

keito94 さんが書きました:
ISLe さんが書きました: 進行中に逆方向に入力があるとその場で反転しますが、進行方向と垂直の方向の入力があってもそのまま直進し、曲がり角に達すると入力方向に曲がります。
そのアルゴリズムの組み方がよくわからないので、その手がかりとなるものを教えて下さい。
手がかりは書いたとおりのことですよ。
書いてあることをコードに落とし込めばよいだけです。

#keito94さんが何を期待しているのかが分からない。

あと、これはワープ問題とは別の事案なので新規にトピをたてたほうが良いと思います。
#No.8もオフトピであるべきでした。

アバター
usao
記事: 1449
登録日時: 5年前

Re: パックマン風ゲームにおけるワープ通路の実装の仕方がわからない。

#11

投稿記事 by usao » 1年前

オフトピック
一体何が問題点になっているのか? が本当に理解できない私でございます.

「ワープ」を行うべきタイミングを如何にして確定するのか,について
(その手段がマップチップだろうが座標値だろうが何だろうが構わないと思うが)
マップチップでどうこうするという手段を選んだのであれば
もうその時点で,「ワープ」を行うべきタイミング(≒パックマンが画面外に出た)の判定方法は確定的に明らかではないのか?

だって,そのために
> ワープ通路であることを表すチップ
とかいう概念を導入したのでしょう?
あえて用いているそのチップという概念は何のためのもの?

アバター
keito94
記事: 264
登録日時: 1年前
連絡を取る:

Re: パックマン風ゲームにおけるワープ通路の実装の仕方がわからない。

#12

投稿記事 by keito94 » 1年前

ISLe さんが書きました: あと、これはワープ問題とは別の事案なので新規にトピをたてたほうが良いと思います。
#No.8もオフトピであるべきでした。
ワープ問題が一段落したら、質問したいと思います。
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

アバター
keito94
記事: 264
登録日時: 1年前
連絡を取る:

Re: パックマン風ゲームにおけるワープ通路の実装の仕方がわからない。

#13

投稿記事 by keito94 » 1年前

>>usaoさん
問題点は一つあります。
ワープのアルゴリズムは一通り完成しているのですが、
Pygameで、画像を使わないマップチップをどうするのかがわからないということです。
オフトピック
そのやり方が分かっていたら、そもそもこんな質問していないし…。
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

アバター
usao
記事: 1449
登録日時: 5年前

Re: パックマン風ゲームにおけるワープ通路の実装の仕方がわからない。

#14

投稿記事 by usao » 1年前

オフトピック
「マップチップ」というデータ形式の概念に,
> 画像
なんてものは無関係だと思うが…

アバター
keito94
記事: 264
登録日時: 1年前
連絡を取る:

Re: パックマン風ゲームにおけるワープ通路の実装の仕方がわからない。

#15

投稿記事 by keito94 » 1年前

usao さんが書きました:
usao さんが書きました:
オフトピック
「マップチップ」というデータ形式の概念に,
> 画像
なんてものは無関係だと思うが…
まあ、たしかにそうですよね…。

僕が言いたいことを順におって説明すると、
①ワープトンネルを表すマップチップを作った。(ここまではOK)
②でも、マップチップがあるところに画像を表示させる方法しか知らない。(screen.blitやRectやらで大苦戦している。)
③だからここで質問している。
…となります。
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

アバター
purin52002
記事: 235
登録日時: 1年前
連絡を取る:

Re: パックマン風ゲームにおけるワープ通路の実装の仕方がわからない。

#16

投稿記事 by purin52002 » 1年前

例えばプレイヤーにマップ上の座標を持たせるというのはどうですか?

自分の座標がワープトンネルの座標と一致していたらワープみたいな感じで、、、
オフトピック
②と③の間がだいぶ飛んでいると思うのは私だけなのかな...
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^

アバター
usao
記事: 1449
登録日時: 5年前

Re: パックマン風ゲームにおけるワープ通路の実装の仕方がわからない。

#17

投稿記事 by usao » 1年前

ふぅむ,「マップチップ」という言葉の定義が,私と質問者様とで異なっているように見受けるので,
私側の定義を別名で「マップチップU」と記します.


「マップチップU」とは:

(1)ゲームフィールドをマス目の集合として考える
(2)各マス目は,その場所に関する{通路,壁,このマスに侵入したら別の地点にワープすべき,…}というような属性値を持つ
(3)あるキャラクタの座標から,そのキャラクタの存在位置に対応するマス目を特定してそのマス目の属性値を調べることにより,
 そのキャラクタに対して必要な処理を判断し得る.

というような データの持ち方(1)(2),および使い方(3) のことです.

例えば,
(2)において,あるマス目に ”このマスに侵入したら別の地点にワープすべき” という属性値を持たせておいた場合,
(3)の処理にて,「そのマス内に侵入したキャラクタはワープすべきだ」ということを判定し得る.


以上の内容の中には,「画像」は一切出てきません.
ゲームシーンの描画に際して,(2)のデータを参照することはあるかもしれませんが,それは本件とは全く別の無関係な話です.

#あなたの貼ったコードを見るに,既に(1)(2)が存在しているのだと思った.
#そして,そのようにしてあるのは(3)を行う目的であろうと推測したので,No.11のようになる.
オフトピック
個人的には,このような「マップチップU」的方法はパックマンに向かないように思える.

ISLe
記事: 2624
登録日時: 8年前
連絡を取る:

Re: パックマン風ゲームにおけるワープ通路の実装の仕方がわからない。

#18

投稿記事 by ISLe » 1年前

オフトピック
keito94さんの念頭には、[pygame]画像が分割して表示されない…。に添付されているソースファイルにあるブロック関連のコードと同じ方法でワープ通路を実装したいというのがあるのでしょうかね。

マップデータ配列から、位置とチップ画像をセットにしたブロックの情報を個々に生成したものをグループ化、当たり判定はグループで行い、その際、チップ画像のサイズを利用している、というもの。

でもリンク先のトピックでもこのトピックでも、そのへん一切話題になってない。
過去に一度も触れていないことを前提にされてもなあ、って思います。

そもそも、どこかのサイトを参考にしたらしいコードですが、パックマン風の当たり判定にはまったく不向きですし。
何より、この方法、以前keito94さんがC++&DXライブラリで挑戦した上で投げ出したのと瓜二つなんですよね。

アバター
keito94
記事: 264
登録日時: 1年前
連絡を取る:

Re: パックマン風ゲームにおけるワープ通路の実装の仕方がわからない。

#19

投稿記事 by keito94 » 1年前

usao さんが書きました: 以上の内容の中には,「画像」は一切出てきません.
画像は一切関係なかったんですね…。
てっきり、マップというのは画像に依存するものかと…。
usao さんが書きました:個人的には,このような「マップチップU」的方法はパックマンに向かないように思える.
では、パックマンに向いたマップデータの考えを教えてくれますか?
ISLe さんが書きました:
オフトピック
keito94さんの念頭には、[pygame]画像が分割して表示されない…。に添付されているソースファイルにあるブロック関連のコードと同じ方法でワープ通路を実装マップデータ配列から、位置とチップ画像をセットにしたブロックの情報を個々に生成したものをグループ化、当たり判定はグループで行い、その際、チップ画像のサイズを利用している、というもの。したいというのがあるのでしょうかね。
それは言えてます…。でも、あなたの発言からするに、それは無理だとわかりました…。
改善案を教えてくれませんか…。
そもそも、どこかのサイトを参考にしたらしいコードですが、パックマン風の当たり判定にはまったく不向きですし。
何より、この方法、以前keito94さんがC++&DXライブラリで挑戦した上で投げ出したのと瓜二つなんですよね。
あの方法は全体的に不向きでしたか…。(初心者向けコードの延長線でかないということですか…。初めて知りました…。)
あなたが考えるパックマン風の当たり判定の考え方と、
将来的にはアクションゲームを作りたいから、あなたが考えているアクションゲームの当たり判定の考え方を教えて下さい。
(同じなら同じと言ってくださいね)
purin52002 さんが書きました:例えばプレイヤーにマップ上の座標を持たせるというのはどうですか?

自分の座標がワープトンネルの座標と一致していたらワープみたいな感じで、、、
分かりました!検討してみます!
オフトピック
移動量を使う当たり判定をどうやって卒業するのかが脱プログラミング初心者の鍵となる…かも。
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

ISLe
記事: 2624
登録日時: 8年前
連絡を取る:

Re: パックマン風ゲームにおけるワープ通路の実装の仕方がわからない。

#20

投稿記事 by ISLe » 1年前

keito94 さんが書きました:改善案を教えてくれませんか…。
改善案とは?
それこそパックマンを真似れば良いのではないでしょうか。

パックマンを真似るというのは、どこかにあるそれっぽいコードをコピペすることではないですよ。
パックマンの動作を見て、自分でデータ構造やアルゴリズムを考えることが「真似る」ということです。
keito94 さんが書きました:あの方法は全体的に不向きでしたか…。(初心者向けコードの延長線でかないということですか…。初めて知りました…。)
あなたが考えるパックマン風の当たり判定の考え方と、
将来的にはアクションゲームを作りたいから、あなたが考えているアクションゲームの当たり判定の考え方を教えて下さい。
(同じなら同じと言ってくださいね)
不向きとは書きましたが、初心者向けとは?

いわゆるパックマンもどきでは見逃されがちな部分も含めて、既に客観的に仕様をいくつか記述しましたが?
具体的なコードを求めているのなら、この件に関しては申し訳ないですが、このような公の場所に書くことはできません。

アバター
keito94
記事: 264
登録日時: 1年前
連絡を取る:

Re: パックマン風ゲームにおけるワープ通路の実装の仕方がわからない。

#21

投稿記事 by keito94 » 1年前

ISLe さんが書きました: パックマンを真似るというのは、どこかにあるそれっぽいコードをコピペすることではないですよ。
パックマンの動作を見て、自分でデータ構造やアルゴリズムを考えることが「真似る」ということです。
実はそのヒントの一つにたどり着いたところで…。
► スポイラーを表示
不向きとは書きましたが、初心者向けとは?
ゲーム制作入門系のサイトには壁にぶつかったときに移動量を使って、めり込み防止の確認を行う方法が載っています。
でも、実際のゲーム制作で使うとあなた達がおっしゃるように、移動量を0にする都合上効率が悪くなってしまいます。
初心者にはありがたいめり込み判定だが、上級者にはかえって不便。だから、初心者向けなのです。
オフトピック
ゲームやプログラムではあいいう場面のために一時変数は多用されていることに(今頃)気づいた。
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

アバター
usao
記事: 1449
登録日時: 5年前

Re: パックマン風ゲームにおけるワープ通路の実装の仕方がわからない。

#22

投稿記事 by usao » 1年前

オフトピック
> では、パックマンに向いたマップデータの考えを教えてくれますか?

例えば,【絶対に壁にぶつからない】ならば,
どこかの入門サイトに書いてあるという【壁にぶつかったときに,どうのこうのする】なんて話は全く不要であると考えることができます.

このトピックの内容とは全く異なる話になってしまうのでここには書きませんけど,
そういう方法に関する話(私がパックマンを「真似る」なら,こういう感じに考えるかなぁ,という話)をあなたの日記に書いた覚えがありますよ.
役に立つかどうかは知りませんけども.


>初心者にはありがたい

うーん……
あなたは以前に,めり込みを解消する系の話でだいぶ苦労しておられたように見受けましたが…
苦労したわりには実際に使ってみると色々と良くないことが起きる とおっしゃるのであれば,むしろ全然ありがたくない話なのでは…?

アバター
keito94
記事: 264
登録日時: 1年前
連絡を取る:

Re: パックマン風ゲームにおけるワープ通路の実装の仕方がわからない。

#23

投稿記事 by keito94 » 1年前

usao さんが書きました: うーん……
あなたは以前に,めり込みを解消する系の話でだいぶ苦労しておられたように見受けましたが…
苦労したわりには実際に使ってみると色々と良くないことが起きる とおっしゃるのであれば,むしろ全然ありがたくない話なのでは…?
アクションゲームを初めて作る人にはありがたいという意味で言ったのですが…。
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

アバター
keito94
記事: 264
登録日時: 1年前
連絡を取る:

Re: パックマン風ゲームにおけるワープ通路の実装の仕方がわからない。

#24

投稿記事 by keito94 » 1年前

まあ、とにかく、一時変数の概念を学んで、パックマンの移動のアルゴリズムのヒントの一端に近づけたことですし、
(この一件が解決したら質問しますね)
今のマップチップはパックマンに向いてないということがわかったみたいですし、パックマンに向いたマップチップや壁の処理の方法のヒントを教えてくれませんか?
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

ISLe
記事: 2624
登録日時: 8年前
連絡を取る:

Re: パックマン風ゲームにおけるワープ通路の実装の仕方がわからない。

#25

投稿記事 by ISLe » 1年前

否定的なことはすべて全否定と捉えるのは、コードの中身を理解していない(しようとしない)からでしょうかね。


C++&DXライブラリのときに、移動先判定は…
『等間隔に並ぶ固定されたブロック、とプレイヤーキャラのみの当たり判定』
が前提になってるから、のちのち苦労することになりますよってなことを何回も書いたの覚えてませんか?

パックマンて
『等間隔に並ぶ固定されたブロック、とプレイヤーキャラのみの当たり判定』(※モンスター等は障害物ではない)
なんですよ。
先読みが有効な場面なんですよね。
そもそも曲がり角をショートカットって先を見ないと不可能だと思いませんか?

ところがですね、パックマンは現在座標から先読みしてるんですよ。
どうしてそんなことができるのかは、パックマンの画面をよーく観察したら分かるかもしれませんね。


ちゃんと説明しておくと、「パックマン風の当たり判定にはまったく不向き」というのは、“存在するブロックだけをコンテナに入れてコンテナに入っているブロックだけで当たり判定している”ところ。

等間隔に固定されたブロック『でないならば』コンテナで管理するのは有効だろうけれど、せっかく等間隔に固定されているのにそれを有効活用しないのはまったくの無駄。
コンテナに入ったブロックから曲がり角を判定するのは難しく、ショートカットの実装に苦労するのが容易に予測できます。


サンプルコードというのは、機能を説明するのが目的。
簡単な題材で目的を達するために、わざわざ回りくどいことをするのはよくあること。
それをまるごと取り込もうとする(そして振り回される)のが初心者なのであって、コード自体の問題ではないですよ。

アバター
keito94
記事: 264
登録日時: 1年前
連絡を取る:

Re: パックマン風ゲームにおけるワープ通路の実装の仕方がわからない。

#26

投稿記事 by keito94 » 1年前

ISLe さんが書きました:否定的なことはすべて全否定と捉えるのは、コードの中身を理解していない(しようとしない)からでしょうかね。


C++&DXライブラリのときに、移動先判定は…
『等間隔に並ぶ固定されたブロック、とプレイヤーキャラのみの当たり判定』
が前提になってるから、のちのち苦労することになりますよってなことを何回も書いたの覚えてませんか?
すいません。
あの時は聞き流していたのですが、改めてその言葉の意味を知りました…。
ごめんなさい。
そして、C++&DXライブラリのときに、
移動先に依存しない当たり判定の実装に大失敗した苦い思い出が蘇ったので、(もう一度)そのアルゴリズムをわかりやすく教えてください。

パックマンて
『等間隔に並ぶ固定されたブロック、とプレイヤーキャラのみの当たり判定』(※モンスター等は障害物ではない)
なんですよ。
先読みが有効な場面なんですよね。
そもそも曲がり角をショートカットって先を見ないと不可能だと思いませんか?

ところがですね、パックマンは現在座標から先読みしてるんですよ。
どうしてそんなことができるのかは、パックマンの画面をよーく観察したら分かるかもしれませんね。
先読み…ていうか直前のフレームの使いみちすらわからなかったのでその例を上げてくれてまで説明してくれたので分かりやすかったです!!
ちゃんと説明しておくと、「パックマン風の当たり判定にはまったく不向き」というのは、“存在するブロックだけをコンテナに入れてコンテナに入っているブロックだけで当たり判定している”ところ。

等間隔に固定されたブロック『でないならば』コンテナで管理するのは有効だろうけれど、せっかく等間隔に固定されているのにそれを有効活用しないのはまったくの無駄。
コンテナに入ったブロックから曲がり角を判定するのは難しく、ショートカットの実装に苦労するのが容易に予測できます。
あの方法も今思えば効率が悪かったと思っています…。
サンプルコードというのは、機能を説明するのが目的。
簡単な題材で目的を達するために、わざわざ回りくどいことをするのはよくあること。
それをまるごと取り込もうとする(そして振り回される)のが初心者なのであって、コード自体の問題ではないですよ。
たしかにそうでした…。
僕がプログラム初心者であることも認めておきます。(サインにも書いてますヨ。)
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

アバター
purin52002
記事: 235
登録日時: 1年前
連絡を取る:

Re: パックマン風ゲームにおけるワープ通路の実装の仕方がわからない。

#27

投稿記事 by purin52002 » 1年前

マップチップってマップを構築する小さな画像の一つだと思うんです。
マリオのレンガブロックだったり、ドラクエの地面だったり、
小さな画像を組み合わせて大きな画像を作るための方法だと思うんです。
(ってhttps://dic.pixiv.net/a/%E3%83%9E%E3%83 ... 3%E3%83%97に書いてました^p^)

なんで、パックマンに向いたマップチップ、、、というのはブロックの画像組み合わせればいいんじゃないかな、って思います。
► スポイラーを表示
usaoさんの「マップチップU」のようなマップチップがご所望だとしたら、
私なら一マスごとに
  • 壁(ブロック)
  • 通路
  • ワープ
の属性を持たせます。
パックマンは毎tick
「自分のいるマスの属性」、「進行方向のマスの属性」
を観測し、処理を行うというのはどうでしょう。
► スポイラーを表示
壁の処理の方法は
こちらのページなど参考になるのではないでしょうか?
http://dixq.net/g/26.html
[07月28日 訂正]
パックマンはブロック単位の移動を行っているわけではないみたいです。
私の知識・理解不足でした<(_ _)>

オフトピック
アクションゲームを作りたい
->衝突判定をどうにかしなければ!
というのは、まあ、わかりますが、
前回、衝突判定ができずに不完全燃焼してしまいましたよね?

今回は衝突判定を抜きにゲームを作ることができるか試してみるといいんじゃないでしょうか?
オフトピック
初心者であることを認められたようですが、
ぶっちゃけどうでもいいです^^;

質問者さんが初心者様でも達人様でも回答者さんと一緒になって問題解決ができれば
それでいいとおもいます^^

目に見える形で示すことも大事ですが、態度、行動で示す方が説得力があると思います。
目指せ!脱☆プログラミング初心者!^p^
最後に編集したユーザー purin52002 on 2017年7月28日(金) 17:21 [ 編集 1 回目 ]
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^

ISLe
記事: 2624
登録日時: 8年前
連絡を取る:

Re: パックマン風ゲームにおけるワープ通路の実装の仕方がわからない。

#28

投稿記事 by ISLe » 1年前

オフトピック
パックマンの迷路は、8x8のチップ画像で構成されています。
直線と角が数パターンあり、それらの組み合わせです。

パックマンの迷路のチップ画像は、壁がチップの中央を通るように描かれています。
パックマンは(モンスターも)迷路の壁の描かれたチップの半分といつも重なっています。
曲がり角に達するより先に、重なっているチップの種類で曲がり角かどうか容易に判定できるというわけです。

アバター
keito94
記事: 264
登録日時: 1年前
連絡を取る:

Re: パックマン風ゲームにおけるワープ通路の実装の仕方がわからない。

#29

投稿記事 by keito94 » 1年前

purin52002 さんが書きました: 壁の処理の方法は
こちらのページなど参考になるのではないでしょうか?
http://dixq.net/g/26.html
そのページを参考に、コードを書いてみました。
► スポイラーを表示
purin52002 さんが書きました: 今回は衝突判定を抜きにゲームを作ることができるか試してみるといいんじゃないでしょうか?
衝突判定は僕にはまだ早いということですね…。
この一件が一段落したらまたその件について質問しますね。
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

アバター
keito94
記事: 264
登録日時: 1年前
連絡を取る:

Re: パックマン風ゲームにおけるワープ通路の実装の仕方がわからない。

#30

投稿記事 by keito94 » 1年前

少し、No.29のコードを修正。
► スポイラーを表示
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

返信

“C言語何でも質問掲示板” へ戻る