みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

C# 簡単なシューティング 自機移動について

かなりの初心者で困っています。
簡単なシューティングを作ろうとおもっています。
使用ソフトはVisualC#2005です。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication1
{

public partial class Form1 : Form
{
public Form1()
{

InitializeComponent();
}
//自機(右移動)
private void button3_Click(object sender, EventArgs e)
{
if (timer1.Enabled == false)
{
timer2.Enabled = false;
timer1.Enabled = true;
}
else
{
timer1.Enabled = false;
timer3.Enabled = false;
timer4.Enabled = false;
}
}
private void timer1_Tick(object sender, EventArgs e)
{
pictureBox1.Left = pictureBox1.Left + 2;
}
//自機(左)
private void button4_Click(object sender, EventArgs e)
{
if (timer2.Enabled == false)
{
timer1.Enabled = false;
timer2.Enabled = true;
}
else
{
timer2.Enabled = false;
timer3.Enabled = false;
timer4.Enabled = false;
}
}
private void timer2_Tick(object sender, EventArgs e)
{
pictureBox1.Left = pictureBox1.Left - 2;
}
//自機(上)
private void button1_Click(object sender, EventArgs e)
{
if (timer3.Enabled == false)
{
timer4.Enabled = false;
timer3.Enabled = true;
}
else
{
timer1.Enabled = false;
timer2.Enabled = false;
timer3.Enabled = false;
}
}

private void timer3_Tick(object sender, EventArgs e)
{
pictureBox1.Top = pictureBox1.Top - 2;
}
//自機(下)
private void button2_Click(object sender, EventArgs e)
{
if (timer4.Enabled == false)
{
timer3.Enabled = false;
timer4.Enabled = true;
}
else
{
timer1.Enabled = false;
timer2.Enabled = false;
timer4.Enabled = false;
}

}
private void timer4_Tick(object sender, EventArgs e)
{
pictureBox1.Top = pictureBox1.Top + 2;
}
}
}

自機は画像(PictureBox)でボタンによって上下左右に移動します。
FormのSizeは800,630です。

自機の移動がボタンなのでキー入力によって操作できるようにしたいのですが、
それと、自機の移動範囲を画面からでないようにしたいです。
あまりC#を理解できてない上でつくったのでおかしな点が多々あると思います。
教えていただける方がいると助かります。

投稿日時 - 2008-05-26 00:23:32

QNo.4050787

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(1)

ANo.1

VisualStudio のフォームデザイナを使って PictureBox や Timer を追加していらっしゃるようですが、
フォームデザイナによって生成されたコードは複雑になりがちで手作業では編集しにくいので、
ゲームのキャラクターを配置するようなことをフォームデザイナでやるのは避けたほうがいいです。
質問者のかたが機能追加に戸惑っているのは、フォームデザイナが生成したコードが煩雑であるのも一因です。
設定用のダイアログ等でなければ、フォームデザイナに頼らず書くことをお勧めします。

また、移動方向それぞれにタイマーを作成しているようですが、タイマーはひとつで十分です。
大量のタイマーを管理するのは大変なので、なるべくシンプルにしましょう。

示して頂いたコードが完全ではなくこれ以上は具体的にアドバイスしにくいので、
その要求を満たす簡単なコードを書いてみました。参考にしてみてください。
行頭に整形用の全角スペースがありますので、
これを半角スペースかタブ文字に置き換えるとコンパイルできます。
"airplane.png"の部分の画像はご自分でご用意して、実行ファイルと同じフォルダに配置してください。

using System;
using System.Windows.Forms;
using System.Drawing;
using System.Collections;

class Shooting{
  Form form = new Form();
  PictureBox airPlane = new PictureBox();
  ArrayList keys = new ArrayList();

  Shooting(){
    form.Size = new Size(800, 630);
    form.KeyDown += new KeyEventHandler(onKeyDown);
    form.KeyUp += new KeyEventHandler(onKeyUp);
    
    airPlane.Image = new Bitmap("airplane.png");
    airPlane.Size = new Size(32, 32);
    airPlane.SizeMode = PictureBoxSizeMode.StretchImage;
    form.Controls.Add(airPlane);

    Timer timer = new Timer();
    timer.Enabled = true;
    timer.Interval = 16;
    timer.Tick += new EventHandler(onTick);
  }

  void onKeyDown(object s, KeyEventArgs e){
    if( ! keys.Contains(e.KeyCode)) keys.Add(e.KeyCode);
  }

  void onKeyUp(object s, KeyEventArgs e){
    keys.Remove(e.KeyCode);
  }

  void onTick(object sender, EventArgs e){
    airPlane.Left = move(airPlane.Left, form.ClientSize.Width , airPlane.Width, Keys.Left, Keys.Right);
    airPlane.Top = move(airPlane.Top , form.ClientSize.Height, airPlane.Height, Keys.Up , Keys.Down);
  }

  int move(int current, int max, int size, Keys dm, Keys dp){
    return Math.Max(0, Math.Min(max - size, current + 10 * ((keys.Contains(dm) ? -1 : 0) + (keys.Contains(dp) ? 1 : 0))));
  }

  public static void Main(){
    Application.Run(new Shooting().form);
  }
}

投稿日時 - 2008-05-27 19:15:09

お礼

丁寧な回答をしてくださり本当にありがとうございます。
そもそもフォームデザイナからやっていくのはゲーム作成には無理がありますね・・・。
回答してくださったプログラムを参考に自分で理解して使えるようにしたいと思います。本当にありがとうございます。
まだまだわからないことなどありますがもしまた質問したときには暇なときにでもお答えいただいたらうれしいです。

投稿日時 - 2008-05-27 21:06:38

あなたにオススメの質問