![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
かなりの初心者で困っています。
簡単なシューティングを作ろうとおもっています。
使用ソフトは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#を理解できてない上でつくったのでおかしな点が多々あると思います。
教えていただける方がいると助かります。
A 回答 (1件)
- 最新から表示
- 回答順に表示
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_05.png?5a7ff87)
No.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);
}
}
丁寧な回答をしてくださり本当にありがとうございます。
そもそもフォームデザイナからやっていくのはゲーム作成には無理がありますね・・・。
回答してくださったプログラムを参考に自分で理解して使えるようにしたいと思います。本当にありがとうございます。
まだまだわからないことなどありますがもしまた質問したときには暇なときにでもお答えいただいたらうれしいです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Visual Basic : ImageListの画像がそろったときにメッセージを表示 1 2023/07/20 13:53
- C言語・C++・C# Windows Formアプリからコンソールを呼び出して文字を出力させたい 8 2023/05/09 10:53
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- JavaScript 画像の表示位置 3 2022/12/23 08:25
- JavaScript スマフォではボタンを表示させたくない 2 2023/01/20 14:26
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
複素関数はどこはあんまりやら...
-
c言語のリダイレクトによる円...
-
プログラム言語について c言語...
-
Python、プログラミングについ...
-
プログラミングでArduinoのc++...
-
0 == False はいいけど
-
CPUが16bitでも32bitOSでコンパ...
-
C言語について。
-
だれがとけるの?
-
[C言語]fputsとfprintfの違い
-
double型が正常に認識されてい...
-
gcc13.2のバグ?
-
サブルーチンを使った再帰的な...
-
バッチファイルで以下のような...
-
インクリメント演算子のみを用...
-
ArduinoでMouse関数を使用して...
-
VisualStudioで、コードを印刷...
-
C#でゲームのチートを作ること...
-
写真のプログラムは、1からnま...
-
関数ポインタの高速化のメリット
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C#でのXDocument.Loadについて...
-
アメブロで、スクリプトエラー...
-
C# 簡単なシューティング 自機...
-
「ご処理進めて頂きますようお...
-
エクセルで、日付を入力すると...
-
CloseとDisposeの違い
-
Excelシート上のマクロを登録し...
-
エクセルVBAで、MsgBox やInput...
-
「PC Helpsoft Driver Updated...
-
VBAでループ内で使う変数名を可...
-
DoEventsがやはり分からない
-
VBA エンターキーでイベントに...
-
switch の範囲指定
-
アクセスVBAのMe!と[ ]
-
エクセルの画面にユーザーフォ...
-
メルカリのメルカードで買い物...
-
【Excel】特定の文字を含むセル...
-
VBの質問#if 0 then ってどう...
-
VBAでCOPYを繰り返すと、処理が...
-
EXCEL VBA マクロ 実行する度に...
おすすめ情報