
前回、OpenTKで迷路をつくりました。
OpenTKで迷路をつくる
壁がある場合、それ以上前に進めないのが普通なのですが、前回のプログラムでは壁を通り抜けて移動することができました。今回は移動しようとしている方向に壁がある場合は移動できないようにします。移動できないことを知らせるために音も鳴らします。
移動するときに本当に移動できるか確認して、移動できる場合だけ移動します。自作メソッド IsInsideOfWalls(double x, double z)は移動先が壁または壁に極めて近い位置であるかどうかを調べるためのメソッドです。壁の内部、または周囲0.1であればtrueを返します。
縦向き、横向きの壁の位置をすべて取得して、それと移動先の座標を比較して結果を返しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
public partial class Form1 : Form { bool IsInsideOfWalls(double x, double z) { List<WallPosition> wallPositionsToEast = GetWallPositionsToEast(); List<WallPosition> wallPositionsToSouth = GetWallPositionsToSouth(); foreach(WallPosition pos in wallPositionsToEast) { if(x > pos.X - 0.1 && x < pos.X + 1.1 && z > pos.Z - 0.15 && z < pos.Z + 0.15) return true; } foreach(WallPosition pos in wallPositionsToSouth) { if(x > pos.X - 0.15 && x < pos.X + 0.15 && z > pos.Z - 0.1 && z < pos.Z + 1.1) return true; } return false; } } |
あとは移動するときにIsInsideOfWallsメソッドを呼び出し、これがfalseを返すときだけ移動の処理を行ないます。移動できないときは音を鳴らします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
|
public partial class Form1 : Form { void OnGo() { // 移動先の座標を調べる double newX = EyeX + 0.1f * CosFromInt((int)EyeAngle); double newZ = EyeZ - 0.1f * SinFromInt((int)EyeAngle); if(!IsInsideOfWalls(newX, newZ)) { EyeX = (float)newX; EyeZ = (float)newZ; ShowLabel(); glControl.Refresh(); } else { // 移動できないときは音を鳴らす Console.Beep(500, 200); } } void OnBack() { // 移動先の座標を調べる double newX = EyeX - 0.1f * CosFromInt((int)EyeAngle); double newZ = EyeZ + 0.1f * SinFromInt((int)EyeAngle); if(!IsInsideOfWalls(newX, newZ)) { EyeX = (float)newX; EyeZ = (float)newZ; ShowLabel(); glControl.Refresh(); } else { // 移動できないときは音を鳴らす Console.Beep(500, 200); } } } |
鳩でも分かるC#管理人からのお願い
できる仕事であれば請け負います。鳩でもわかるC#管理人はクラウドワークスに在宅ワーカーとして登録しています。お仕事の依頼もお待ちしております。
⇒ 仕事を依頼する
コメントについて
コメントで英語などの外国語でコメントをされる方がいますが、管理人は日本語以外はわからないので基本的に内容が理解できず、承認することもありません。それからへんな薬を売っているサイトやリンク先のサイトが存在しないというスパムコメントも多々あります。
Some people make comments in foreign languages such as English, but since the manager does not understand anything other than Japanese, he basically cannot understand the content and does not approve it. Please use Japanese when making comments.
そんななか日本語のコメントもいただけるようになりました。「○○という変数はどこで宣言されているのか?」「××というメソッドはどこにあるのか」「例外が発生する」「いっそのことソース丸ごとくれ」という質問ですが、管理人としては嬉しく思います。「自分が書いた記事は読まれているんだな」と。疑問点には可能な限り答えます。記事に問題があれば修正いたします。
そのうえでお願いがあります。「匿名」という味も素っ気もない名前ではなく、捨てハンでいいのでなにかハンドルネームをつくってほしいと思います。
管理人のモチベーションアップのために
よろしければご支援お願いします。
⇒ 管理人の物乞いリスト