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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

1回答

1191閲覧

[VC#]簡易シューティングゲームで弾が発射されない

bono8102

総合スコア1

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2020/07/22 14:06

前提・実現したいこと

はじめまして。現在、Vsual Studio2019のC#を用いて簡易なシューティングゲームを制作しています。プロジェクトはwindows Formアプリケーションです

画面(pBaseと定義)をダブルクリックして機体(gg.DrawImage(haze.Image, new Rectangle(gx, gy, 140, 19))
から弾(gg.DrawImage(gakumei.Image, new Rectangle(gx, gy, 140, 19))を発射したいと考えているのですが、弾が右方向に移動せず、機体に張り付いた状態になってしまいます。
この場合、どのようにすれば弾が機体から離れて発射されるようになるでしょうか。
また、「弾と敵 gg.DrawImage(ami.Image, new Rectangle(enX[i], enY[i], aw[i] + (rand.Next(0, 10)), ah[i] + (rand.Next(0, 10)))が接触すると敵と弾が消えて、弾が再び打てるようになる」といったプログラムの実装も考えています。そちらの方もやり方を教えて頂けると幸いです。
プログラム歴が3週間ですので、意味不明な箇所も多々あると思いますが、どうぞよろしくお願いします。

発生している問題・エラーメッセージ

弾(gg.DrawImage(gakumei.Image, new Rectangle(gx, gy, 140, 19))が、機体(gg.DrawImage(haze.Image, new Rectangle(gx, gy, 140, 19))から発射されない

該当のソースコード

static Bitmap canvas = new Bitmap(704, 391);
Graphics gg = Graphics.FromImage(canvas);
int hw, hh;
int[] aw = new int[13];
int[] ah = new int[13];
Point Cpos;
int[] enX = new int[13];
int[] enY = new int[13];
int gx,gy,hx,hy;
Random rand = new Random();
Boolean hitFlg;
long msgcnt;
Boolean titleFlg;
long score;
Font myFont = new Font("Arial", 16);
Boolean utu;
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e) { haze.Hide(); bakuhatu.Hide(); hyousi.Hide(); gameover.Hide(); gakumei.Hide(); numa.Hide(); ami.Hide(); ritorai.Hide(); initGame(); } private void initGame())//初期設定 { hw = 140; hh = 39; Text = "HAZE"; utu = false; for (int i=0;i<13; i++) { enX[i] = rand.Next(720, 1600); enY[i] = rand.Next(1, 371); aw[i] = rand.Next(90, 120); ah[i] = rand.Next(55, 95); } hitFlg = false; msgcnt = 0; utu = false; titleFlg = true; score = 0; }

private void hazeExplosion()//ゲームオーバー
{
msgcnt++;
if (msgcnt > 5)
{
gg.DrawImage(gameover.Image, new Rectangle(0, 0, 704, 391));
if (msgcnt % 40 > 20)
{
gg.DrawImage(ritorai.Image, new Rectangle(120, 300, 500, 76));
}
}
Font myFont = new Font("Arial", 30);
gg.DrawString("SCORE:" + score.ToString(),
myFont, Brushes.White, 230, 90);
pBase.Image = canvas;
}

private void pBase_Click(object sender, EventArgs e)//タイトル { if(titleFlg) { if (msgcnt > 5) { msgcnt = 0; titleFlg = false; } return; } if(msgcnt>10) { initGame(); Text = "HAZE"; utu = false; } }

private void timer2_Tick(object sender, EventArgs e)
{
Cpos = PointToClient(Cursor.Position);
hx = Cpos.X;
hy = Cpos.Y;
gx = hx + hw + 5;
gy = hy + hh / 2;
gx += 5;
gg.DrawImage(haze.Image, new Rectangle(gx, gy, 140, 19));
pBase.Image = canvas;
}
private void dispTitle()
{
msgcnt++;
gg.DrawImage(hyousi.Image, new Rectangle(0, 0, 704, 391));
pBase.Image = canvas;
}
private void timer1_Tick(object sender, EventArgs e)//自機、敵、弾の動き
{
Cpos = PointToClient(Cursor.Position);
hx = Cpos.X;
hy = Cpos.Y;
gx = hx + hw + 5;
gy = hy + hh / 2;
if (titleFlg)
{
dispTitle();
return;
}
if(hitFlg)
{
hazeExplosion();
return;
}
Text = "";
gg.DrawImage(numa.Image, new Rectangle(0, 0, 704, 391));
for (int i = 0; i < 13; i++)
{
enX[i] -= 5;
gg.DrawImage(ami.Image,
new Rectangle(enX[i], enY[i], aw[i] + (rand.Next(0, 10)), ah[i] + (rand.Next(0, 10))));
if (enX[i] < -30)
{
enX[i] = rand.Next(720, 1500);
enY[i] = rand.Next(1, 371);
}
}
if (hx < 0)
{
hx = 0;
}
if (hx > Height - hh)
{
hx = Height - hh;
}
if (hy < 0)
{
hy = 0;
}
if (hy > 330)
{
hy = 330;
}

gg.DrawImage(haze.Image, new Rectangle(hx, hy, hw, hh)); if (utu) { gx += 5; gg.DrawImage(gakumei.Image, new Rectangle(gx, gy, 140, 19)); pBase.Image = canvas; } score++; gg.DrawString("SCORE:" + score.ToString(), myFont, Brushes.White, 10, 10); pBase.Image = canvas; hitCheck(); } private void pBase_DoubleClick(object sender, EventArgs e) { utu = true; } private void hitCheck()//あたり判定 { int pcx = hx + hw; int pcy = hy+(hh/2); int ecx, ecy, dis; for(int i=0;i<10; i++) { ecx = enX[i] +(aw[i]/2); ecy = enY[i] + (ah[i]/2); dis = (ecx - pcx) * (ecx - pcx) + (ecy - pcy) * (ecy - pcy); if(dis<(aw[i])*(ah[i]/2)) { hitFlg = true; Text = "HAZE"; utu = false; break; } } } }

}

VC#

試したこと

補足情報(FW/ツールのバージョンなど)

プロジェクトはwindows Formアプリケーションです

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

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

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

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

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

bono8102

2020/07/23 03:41

ご指摘ありがとうございます。
guest

回答1

0

ベストアンサー

長いのでしっかりと読んではいませんが、問題のありそうな箇所を。

pBase.Image = canvas;

をあちこちでやっていますが、設定するのは初期化時の一回でいいです。
あくまでこれは、PictureBoxにBitmapオブジェクトが紐づけられただけです。
その後にBitmapの内容を変更したら、PictureBoxをInvalidate等で再描画すれば、おそらく変更が反映されると思います。

参考になりそうなページ見つけたので置いときます。
【Visual C#でゲームを作る】ブロック崩し編 その1
こちらはPictureBoxではなく直にFormに描きこんでいますが、要領は大体同じだと思います。

投稿2020/07/23 02:05

編集2020/07/23 02:13
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

bono8102

2020/07/23 03:43

ご丁寧な返答、ありがとうございます。 早速試してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問