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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

642閲覧

【Pythonゲーム作成】衝突判定の実装についてアイディアをください

kake_0819

総合スコア4

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2022/03/18 10:42

初学者です。(簡単な本2冊程度です。Pythonのみ)
pythonで作るゲーム作成に関する本を勉強したので、自分でも作りたいと思い、簡単なゲームを作っています。

ゲームについて
世界一難しいゲームというブラウザゲームがあります。
それと同じものを作成することを目標としています。
(参考:https://www.youtube.com/watch?v=bhqkxwJWR0w)

作成できた部分
ステージと操作する黄色丸の描画と操作

困っていること
黄丸を操作した時、黒い線を越えてしまうので衝突判定を実装し、移動をステージ内のみにできるようにしたい。
勉強した本にも衝突判定について載っておらず困っています。
調べても、私の作成しているプログラムとは書き方が違ったりしていて、参考にしづらいです。
どなたかアイディアいただけませんか。

ちなみにステージを管理するstage_pyは、stageという変数の3次元リストのみです。その中で20×16のリストを作成して、0(何もなし),1(壁),2(スタート地点),3(ゴール地点)のように作っています。

イメージ説明

コード

import pygame import sys import stage_type as st #自作モジュール BLACK = (0, 0 ,0) WHITE = (255, 255, 255) YELLOW = (255, 215, 0) play_stage = 2#プレイ中のステージを管理する変数 dot_x = 0 #操作する黄丸のx座標 dot_y = 0 #操作する黄丸のy座標 def stage_paint(sc): #ステージを描画する関数 global play_stage for y in range(len(st.stage[play_stage])): for x in range(len(st.stage[play_stage][0])): if st.stage[play_stage][y][x] == 1 and st.stage[play_stage][y][x+1] == 1: pygame.draw.line(sc, BLACK,[x*50+25,y*50+25], [x*50+75,y*50+25],5) if st.stage[play_stage][y][x] == 1 and st.stage[play_stage][y+1][x] == 1: pygame.draw.line(sc, BLACK,[x*50+25,y*50+25], [x*50+25,y*50+75],5) def move_dot():#黄丸を動かす関数 global dot_x,dot_y key = pygame.key.get_pressed() if key[pygame.K_UP] == 1: dot_y = dot_y - 2.5 if key[pygame.K_DOWN] == 1: dot_y = dot_y + 2.5 if key[pygame.K_RIGHT] == 1: dot_x = dot_x + 2.5 if key[pygame.K_LEFT] == 1: dot_x = dot_x - 2.5 def set_dot():#黄丸を初期位置にセットする関数 global dot_x,dot_y for y in range(len(st.stage[play_stage])): for x in range(len(st.stage[play_stage][0])): if st.stage[play_stage][y][x] == 2: dot_x = x * 50 + 25 dot_y = y * 50 + 25 def draw_dot(sc,x,y):#黄丸を描画する関数 pygame.draw.circle(sc, BLACK,[x,y],17) pygame.draw.circle(sc, YELLOW,[x,y],13) def main(): global dot_x,dot_y pygame.init() pygame.display.set_caption("ステージ作成") screen = pygame.display.set_mode((1000,800)) clock = pygame.time.Clock() set_dot() while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() screen.fill(WHITE) stage_paint(screen) move_dot() draw_dot(screen,dot_x,dot_y) pygame.display.update() clock.tick(120) if __name__ == '__main__': main()

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

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

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

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

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

guest

回答1

0

シンプルに考えると、上下左右に引かれた半径分の直線と、外枠を構成する直線一つ一つが交わっているかどうかで判断できるかと思います。
実際には全部の枠線をチェックする必要はなくて、黄色の円の中心位置から考えて絶対に交わることがないと言い切れる線は除外したりすることになりますが。

投稿2022/03/18 12:38

KosukeYona

総合スコア4

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問