- ベストアンサー
C#で壁の当たり判定と自キャラの移動で困っています
- C#のコンソールアプリケーションでゲーム作りをしているC#初心者が、壁の当たり判定と自キャラの移動に困っています。
- 自キャラを丸で描画して動かすと、壁の当たり判定が分からず、壁をすり抜けてしまいます。壁の当たり判定を教えてほしいです。
- また、Graphicsを使って自キャラの移動をしているのですが、数秒後にフォームが停止してしまい、キャラが動かなくなります。プログラムの記述方法も教えてほしいです。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
その他の回答 (3)
- sankaku197
- ベストアンサー率47% (29/61)
- sankaku197
- ベストアンサー率47% (29/61)
- sygh
- ベストアンサー率76% (42/55)
関連するQ&A
- 処理の速い当たり判定について[WINSOWS][C]
いつもお世話になっております。 WINDOWSプログラミングを勉強しています。 現在当たり判定について勉強しているのですが、調べてみたところいろいろなやり方があるようです。 私が今作ろうとしているのはアクションゲームなのですが、接地、ダメージ等々の当たり判定があり、毎フレームでこのような判定を繰り返すと重くなってしまうのでは、と危惧しています。 ここで質問なのですが、WINDOWSまたはCプログラムでなるべく速く処理ができる当たり判定を教えていただけないでしょうか? また、初心者向けなものをお願いします。 我儘を言って申し訳ありませんが、ご指導よろしくお願いします。
- ベストアンサー
- C・C++・C#
- マップチップの当たり判定の出し方
キャラの座標をposx、posyとして宣言し、キー入力でその値をプラスやマイナスをして動かせるようにし、またマップをint map[16][16]として宣言し、for文でmap[x][y]として回して絵画しているのですが、キャラの移動変数と連動して当たり判定を作ろうとすると、「キャラの移動変数が配列になっていない」というエラーが出ます。 しかし、キャラ座標を配列にする訳にもいかないのでどうすればいいのか困っています。
- ベストアンサー
- C・C++・C#
- 当たり判定のデータを残したい
前回、簡単な当たり判定作りたいの追加希望です。 振り返りますと現状 sassakunさん回答ANo.3参考のフロー出来上がりました。 今回質問1です。 前回フロー(4)の判定結果を履歴と残し表示させたいのです。 つまり、フロー途中で・・・ ↓ (4)プログラム判定結果、画面上スベリで当たりor外れ表示 ↓ (4.1) 履歴 当たり○回 外れ○回 を適当に付近へ表示 ↓ としたいです。もちろん繰り返しフローですので 外れ及び当たりの履歴は増えていきます。(できたら履歴を0にする リセット機能もあれば便利です) 質問2 タイムラインでなくダイナミックテキストのみでスクロールさせて いますがフロー(2)~(4)の最中サウンドは可能なのでしょうか、 つまりボタン“オン”で音楽スタート→(2)・・(4)の判定後表示と同時にサウンド停止。 以上ここまでの(追加部分)フローをまとめます (1)ボタン“オン” ↓ (2)音楽スタート(今回追加) 画面上当たり、ハズレ、当たり、はずれ・・とループ横スクロール ↓ (3)ボタン“オン” 音楽再生中・・ ↓ (4)プログラム判定結果、画面上スベリで当たりor外れ表示同時に再生 中の音楽ストップ 同時に当たり○回 外れ○回 を適当に付近へ表示(今回追加) ↓ (5)ボタン“オン” ↓ (2)へ 質問3 フロー(4)“スベリ”部分速度って調節可能ですか? 質問4 当たりのときにタイムフレームへ移動、画面上演出したいのでが複雑になりかけているので今後の希望にします。 何度もお手数かけています。
- ベストアンサー
- Flash
- 3Dでの、壁との衝突判定
Visual Studio .NET 2003(C++)、DirextX9.0(April2005)を使って、 3Dで車を走らせるゲームを、DirextXの本を読みながら作っています。 (一応本は、「3Dゲーム開発 ISBN:4777511111」「DirectX逆引き大全 ISBN:4798013161」を読んでいます) 1つの大きいXファイルを読み込み、その中の道を走らせたいのです。 道の脇には必ず障害物や壁があるので、衝突判定をして道から出ないようにしたいのですが、 衝突判定をどうすればいいのかよく解りません。 何でもいいので、是非教えてください。 よろしくお願い致します。
- 締切済み
- C・C++・C#
- ゲーム制作での質問です。
Javaでゲームを作ってるんだけど、キャラクターと壁との当たり判定がよく分からない状態です。 自機と弾の当たり判定なら分からないんですが、自機と壁との当たり判定で配列を用いずに、当たり判定をするコツが分かる方がいらっしゃたら少しでもいいので教えて下さい。
- 締切済み
- Java
- 敵との当たり判定
現在VisualC++2008でゲームを製作してるんですが 自分と敵との当たり判定がわかりません。 どのようにすればいいか教えてもらえないでしょうかm(_ _)m #define SCREEN_WIDTH (640) // 画面の横幅 #define SCREEN_HEIGHT (480) // 画面の縦幅 #define CHIP_SIZE (32) // 一つのチップのサイズ #define MAP_WIDTH (SCREEN_WIDTH / CHIP_SIZE) // マップの横幅 #define MAP_HEIGHT (SCREEN_HEIGHT / CHIP_SIZE) // マップの縦幅 #define CHAR_SIZE (30) // プレイヤーのサイズ float PlX, PlY ; // プレイヤーの座標(中心座標) int ActMain( void ) { // プレイヤーの座標を初期化 PlX = 100.0F ; PlY = 1.0F ; // マップ { int i, j ; for( i = 0 ; i < MAP_HEIGHT ; i ++ ) { for( j = 0 ; j < MAP_WIDTH ; j ++ ) { // 1のところだけ描画 if( MapData[i][j] == 1 ) { DrawBox( j * CHIP_SIZE, i * CHIP_SIZE, j * CHIP_SIZE + CHIP_SIZE, i * CHIP_SIZE + CHIP_SIZE, GetColor( 0, 0, 0 ), TRUE ) ; } } } } //プレイヤーの描写 DrawBox( ( int )( PlX - CHAR_SIZE * 0.5F ), ( int )( PlY - CHAR_SIZE * 0.5F ), ( int )( PlX + CHAR_SIZE * 0.5F ) + 1, ( int )( PlY + CHAR_SIZE * 0.5F ) + 1, GetColor( 255, 0, 0 ), TRUE ) ; Cr = GetColor( 255 , 255, 255 ) ; //敵の描写 DrawGraph(teki[0].x,teki[0].y,teki[0].img,TRUE); //初期化 void SYOKIKA(void){ teki[0].x=500; teki[0].y=200; teki[0].img=LoadGraph("red_player.bmp"); //当たり判定をつくったつもりですが反応せず・・・。一応あたったらPlXを0に移動させようとしています。 if(PlX==teki[0].x) PlX=0; if(PlX==teki[0].y) PlX=0; if(PlY==teki[0].x) PlX=0; if(PlY==teki[0].y) PlX=0; がソースです(文字数が足りないのであたり判定に関係ありそうな(敵と自分の座標関連)ところだけ抜きました)今のところ敵、自分、マップ表示や自分の移動などはできているのですが、敵に触れても反応せず、ときおり敵のいないまったく関係のない場所でPlXが0に移動したりしてしまいます ソースみづらくて申し訳ありません。
- ベストアンサー
- C・C++・C#
- ゲーム中に自キャラがワープする
実に、タイトルのとおりでございますww 「ファンタジーアース ゼロ」と言うゲームで、50人対50人の魔法や非現実的な生き物を使って、お互いの城(またはキープ)を落としあう「戦争」中に、自キャラがワープしているよとよく言われるのです・・・。 人数が多いせいではないと思うのですが・・・。(他の多人数型オンラインRPGでは全くワープはなかった) 原因と思われることを教えていただければ幸いです。 ファンタジーアース ゼロ 推薦スペック OS・・・Windows2000/XP/Vista CPU・・・Pentium4 3GHz以上 RAM・・・1GB以上 GPU・・・GeForce6600/RadeonX600以上 自キャラ登録サーバー・・・Atziluth(アツィルト)通称A鯖 2006年11月(?)稼動開始、ファンタジーアース ゼロ一番最初のサーバー 当方PCスペック OS・・・WindowsXP HomeEdition SP3 CPU・・・Core2Duo E8400 RAM・・・DDR2-667 2GB(1GBX2) GPU・・・Aopen GeForce9600GT M/B・・・GIGABYTE GA-EP35-DS3R Rev2.1 電源・・・AQTIS ATX 450W電源 Ver2.2 エアフロー状態・・・良(ケース前ファン+ケース後ファン) 先週OSに不具合が起こってしまって、OSをリカバリしたので、OS、DirectX関連の問題ではないはずです・・・。
- ベストアンサー
- デスクトップPC
- シューティングゲームの当たり判定
現在directxを用いた(DXライブラリは使わない)インベーダーゲームを作っているのですが、当たり判定の部分がなぜかうまくいきません。自機と敵の弾の当たり判定部分のコードを載せるのでどなたかご享受ください。 //============敵の攻撃======================== if(enemy[rand_atk].tamaflag == 0 && shot_save % 100 == 0 ){ __enemy[rand_atk].tamaflag = 1; __enemy_atk[rand_atk].x = enemy[rand_atk].x+17; __enemy_atk[rand_atk].y = enemy[rand_atk].y+17; } for(i = 0; i < 11; i++){ __if(enemy[i].tamaflag == 1){ ____enemy_atk[i].y+=1; ____if(enemy_atk[i].y >= 480){ ______enemy[i].tamaflag = 0; ______enemy_atk[i].y = -20; //画面外へ ____} ____if( ( move.x - 7 < enemy_atk[i].x && move.x + 32 > enemy_atk[i].x ) && ________( move.y - 13 < enemy_atk[i].y && move.y + 24 > enemy_atk[i].y ) ){ ______move.zanki--; ______enemy[i].tamaflag = 0; ______enemy_atk[i].y = -20; //画面外へ ____} __} } move.x,move.yは自機のx,y座標で横32縦24 敵の弾の大きさは横7縦13 rand_atkはrand_atk = timeGetTime() % 11;でランダムに攻撃させようとしています。
- ベストアンサー
- C・C++・C#
- direct3dで当たり判定
現在direct3dでフライトゲームを作っており、当たり判定部分を考えているのですがうまくいきません。メタセコイアでxファイルを作成し、ビルボードで表示している(敵も自弾も)のですが、そもそも基準点はどこに来るのか、プログラム上で指定する縦横高さがわからないなど当たり判定以前の問題のような気もするのですが・・・。とりあえず、該当部分のコードを載せるのでご享受お願いします。 ↓ゲームメインの攻撃部分↓ if(GetKeyboardTrigger(DIK_Z)){ _for(int i = 0; i < ATTACKNUM; i++){ __if( man_bullet[i].flag.bullet == 0){ ___man_bullet[i].flag.bullet = 1; ___//自機の座標セット ___mat_world[15+i]._41 = mat_world[0]._41; ___mat_world[15+i]._42 = mat_world[0]._42+2; ___mat_world[15+i]._43 = mat_world[0]._43; ___break; __} _} } for(int i = 0; i < ATTACKNUM; i++){ _if(man_bullet[i].flag.bullet == 1){ __mat_world[15+i]._43 ++; __man_bullet[i].cnt.bullet++; __if(man_bullet[i].cnt.bullet >= 100){ ___man_bullet[i].flag.bullet = 0; ___man_bullet[i].cnt.bullet = 0; ___mat_world[15+i]._42 = -100; __} __for(int j = 0; j < ENEMYNUM; j++){ ___man_bullet[i].flag.atk_result = ___Hit_Judging(&mat_world[5+j]._41, &mat_world[5+j]._42, &mat_world[5+j]._43, ________enemy[j].x, enemy[j].y, enemy[j].z, ________&mat_world[15+i]._41 , &mat_world[15+i]._42, &mat_world[15+i]._43, ________man_bullet[i].x, man_bullet[i].y, man_bullet[i].z ); ___if(man_bullet[i].flag.atk_result == 1){ ____man_bullet[i].flag.atk_result = 0; ____man_bullet[i].flag.bullet = 0; ____man_bullet[i].cnt.bullet = 0; ____mat_world[5+j]._43 = 150; ____mat_world[15+i]._42 = -100; ____break; ___} __} _} } ↓当たり判定部分↓ int Hit_Judging( float *xpos1 , float *ypos1 , float *zpos1 , ________float x1, float y1, float z1, ________float *xpos2 , float *ypos2 , float *zpos2 , ________float x2, float y2, float z2 ) { _for(int i = 0; i < ATTACKNUM; i++){ __if(man_bullet[i].flag.bullet == 1){ ___for(int j = 0; j < ENEMYNUM; j++){ ____if( ((xpos1[j] - (x1/2) ) < (xpos2[i] + (x2/2) ) && ______(xpos1[j] + (x1/2) ) > (xpos2[i] - (x2/2) )) && ______((ypos1[j] + y1 ) < ypos2[i] && ypos1[j] > (ypos2[i] + y2 )) && _______(zpos1[j] == zpos2[i]) ){ _____return 1; ____}else _____return 0; ___} __} _} }
- 締切済み
- C・C++・C#
補足
回答ありがとうございました。 プログラムの添付を忘れていました。すみません。 壁は画面の範囲と範囲内の四角形(障害物)を壁として壁がないところを進んでいく迷路、あるいはイライラ棒みたいにした感じです。実際には迷路の中に敵を出現させますが。 おおまかなプログラムはこんな感じです。無駄が多いですが(汗 namespace question { class GraphicsEx : Form { int size = 40; //キャラのサイズ static void Main(string[] args) { Console.WriteLine("マップを表示"); Application.Run(new GraphicsEx()); } public GraphicsEx() { int max, may; max = 900; may = 600; Text = "GraphicsEx"; BackColor = Color.SkyBlue; ClientSize = new Size(max, may); } protected override void OnPaint(PaintEventArgs pea) { Graphics g = pea.Graphics; Pen pen = new Pen(Color.White, 2); Pen extent = new Pen(Color.Black, 5); //外側の壁 SolidBrush brush = new SolidBrush(Color.DeepPink); SolidBrush backbrush3 = new SolidBrush(Color.SkyBlue); //描画を消す背景色です int space, x1, y1,oldx,oldy; //x1とy1が自キャラの座標ですが変える分には問題ありません space = 40; x1 = space ; //自キャラの座標をスタート位置にもって行きます y1 = space ; oldx = oldy = 0; //描画の軌跡を消す変数です //画面の範囲 g.DrawRectangle(extent, space, space, 720, 520); //マップ作成 g.FillRectangle(brush, 81, 81, 38, 78); //1 壁 g.FillRectangle(brush, 80, 200, 80, 80); //2 壁 g.FillRectangle(brush, 40, 320, 40, 80); //3 壁 g.FillRectangle(brush, 80, 440, 40, 80); //4 壁 g.FillRectangle(brush, 160, 40, 40, 80); // 壁 //5 g.FillRectangle(brush, 120, 320, 40, 80); // 壁 //6 次に続きを書きます。