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

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

新規登録して質問してみよう
ただいま回答率
85.46%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

Q&A

4回答

2458閲覧

windows forms コントロール大量設置の対策

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

0グッド

1クリップ

投稿2021/07/13 11:40

編集2021/07/19 10:07

※まだ、ゲームは作っておらず、どのように作ればいいかという試行段階です。
簡単なすぐ終わる単調なゲームは作ったことがあるのですが、その場合でもフォームデザイナー内のコントロールが増えていってしまい、質問本文の状態になってしまっているので、ストーリー物のゲームを作る場合はどうすればよいかわからない状態です。

≪質問本文≫
Windows formsでストーリー物のゲームを作る場合、進めていくにつれ、フォームデザイナー内のコントロールが増えていってしまい、それぞれのコントロールの設定などをしにくくなったり、フォームデザイナーの中身が何が何だか分からなくなってしまうと思います。
その場合、コントロールをソースコードで宣言して、プロパティもコードで書くなど、対策はあるのでしょうか?

イメージ説明

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

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

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

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

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

YAmaGNZ

2021/07/13 22:18

聞きたい内容が「コントロールが増えてしまった時の対策」ではなく「見栄えが悪くなってしまう」なのであれば、見栄えがいいようにデザインするだけでしょう。 前者であれば 「このように(具体的にコードを提示する等)使っていてコントロールが増えてしまいます。どうすれば数を減らせますか?」 とかいった質問であれば具体的な対策が回答として得られるかもしれません。
退会済みユーザー

退会済みユーザー

2021/07/15 11:49

申し訳ございません。 いろいろな意見が聞けると思い、大まかに言ってしまいました。 質問を編集します。
YAmaGNZ

2021/07/15 12:08

ご自身の管理しやすい方法で作ればよろしいかと思います。
Zuishin

2021/07/15 12:10

全部一画面に納めず、ユーザーコントロールを作って必要に応じて切り替えればいいのでは?
退会済みユーザー

退会済みユーザー

2021/07/15 13:47

まず、ゲーム系向きのフレームワークやエンジンは色々あると思うので、 WindowsFormsを本当に採用すべきかどうかから考えた方がいい気がします。
fana

2021/07/16 01:14

> コントロールが増えていってしまい の意味がわからない. (コントロールの個数が何かに困るほどに増えていくという話が想像できない) どんなときにどのくらい増えることになる(増やす必要がある)という話なのかを例示できませんか? 「現在のフォームにAとBが存在するとして,○○をするためにはさらにCとDとか増やすことになるじゃん?」みたいな.
退会済みユーザー

退会済みユーザー

2021/07/16 06:25 編集

そもそもコントロールを何に使ってるのか、本当にコントロールである必要があるのか、すら質問からは読み取れないので適切な回答は出来ないですね。 絵だけ出ればいいだけなら、コントロールなど使わずBitmapに表示させるオブジェクトをゴリゴリ描いてダブルバッファリングで入れ替えるだけでもいい気はするので。
mike

2021/07/16 08:55

フォーム上にシーンごとの画像をGraphicコントロールでべたべた貼ってそう。
退会済みユーザー

退会済みユーザー

2021/07/19 10:00

シーンを作るごとによって、pictureboxやボタンなどのコントロールが増えてしまうことはないですか?
退会済みユーザー

退会済みユーザー

2021/07/19 10:01

今、諸事情によりwindows formsしか使えないので、unityなどは使えません。すみません。
退会済みユーザー

退会済みユーザー

2021/07/19 10:08

>コントロールが増えていってしまいというのは の意味がわからない 質問を編集し、画像を挿入いたしました。 このような状態です。
Zuishin

2021/07/19 10:13

なんだこの画像。 こんな無秩序に張り付けることになる意味が分かりません。 整理整頓して置けばいいだけでは?
退会済みユーザー

退会済みユーザー

2021/07/19 10:37

これらのボタンを何に使ってるんです?
退会済みユーザー

退会済みユーザー

2021/07/19 11:00

かまってちゃんの釣りかな?
退会済みユーザー

退会済みユーザー

2021/07/19 11:05

とりあえず、こういうサイトの内容一通りやってみたらどうでしょ。 http://www.wisdomsoft.jp/479.html
退会済みユーザー

退会済みユーザー

2021/07/21 13:59

これらのコントロールを何に使っているとかはないです、例なので。 いつもゲームを作るときにこういう風になってしまうのです。
退会済みユーザー

退会済みユーザー

2021/07/21 14:00

承知しました。勉強してみます。 ありがとうございます。
Zuishin

2021/07/21 14:05

いや例になってないから言ってるので。 「部屋が散らかるんですがどうしたら」に「片付けろ」で済む問題にしか。 片づけた上でどこにどういう問題があるのかがわからないと適切な方針が立てられないでしょ。 いくら多くても必要なものなら表示しないといけないし、場面場面で必要なものが違うなら必要ないものを消せばいい。 どうやって消すかを自分で考えられるなら追加の情報は出さなくていいけど、そこも意見が欲しいなら伝わるように説明しないとだめなんじゃ?
guest

回答4

0

うーん,多分,

  1. コントロールを使いまわす

シーン(?)をまたいで,フォーム上に存在するようなもの.
例えば「必ずここに絵を表示する」というエリアがあるなら,絵を表示するコントロールはそこに1個だけあればよくて,表示を変えるにはそこに貼る絵を変えてやればいい.
2. 動的に作って,要らなくなったら捨てる
上記1.のような性質でないもの.
最初からフォーム上に居続ける必要もなく,長期にわたって存在する必要もないような物.

みたいなことをすべきなんじゃないかな.

投稿2021/07/19 10:48

fana

総合スコア11708

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

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

退会済みユーザー

退会済みユーザー

2021/07/22 11:15

それはソースコード内で、picturebox1.Image などを使って変更するということでしょうか?
退会済みユーザー

退会済みユーザー

2021/07/23 01:28

(この回答のどこにpicturebox1が出てきたんだ…?)
guest

0

この質問文から得られる情報が少なすぎてエスパー回答しかできないけども、ユーザーコントロールでも作ってまとめればいいんじゃないの。

投稿2021/07/13 15:00

gentaro

総合スコア8949

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

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

0

まずコントロールを使わず描画する方法を考えた方が良いのではないでしょうか。
下記のサンプルは、Dock=Fillに設定したPictureBox一つしかコントロールを置いていませんが、30個のボールを描画しています。

C#

1using System; 2using System.Windows.Forms; 3using System.Drawing; 4using System.Threading; 5using System.Collections.Generic; 6using System.Drawing.Imaging; 7 8namespace WindowsFormsApp1 9{ 10 public partial class Form1 : Form 11 { 12 private class Ball 13 { 14 public int X { get; set; } 15 public int Y { get; set; } 16 } 17 18 private Bitmap _BmpFront; 19 20 private Bitmap _BmpBack; 21 22 private List<Ball> _Balls = new List<Ball>(); 23 24 public Form1() 25 { 26 InitializeComponent(); 27 } 28 29 protected override void OnLoad(EventArgs e) 30 { 31 int width = this.ClientSize.Width; 32 int height = this.ClientSize.Height; 33 34 //ボールの初期位置を乱数で初期化 35 var rand = new Random(); 36 for (int i = 0; i < 30; i++) 37 { 38 _Balls.Add(new Ball() { X = rand.Next(width), Y = rand.Next(height) }); 39 } 40 41 //画像作成(表示用、バックバッファ用) 42 _BmpFront = new Bitmap(width, height, PixelFormat.Format32bppArgb); 43 _BmpBack = (Bitmap)_BmpFront.Clone(); 44 45 //Idleイベントハンドラ設定 46 Application.Idle += OnIdle; 47 } 48 49 protected override void OnFormClosed(FormClosedEventArgs e) 50 { 51 //Idleイベントハンドラ解除 52 Application.Idle -= OnIdle; 53 54 //画像解放 55 pictureBox1.Image = null; 56 _BmpFront.Dispose(); 57 _BmpBack.Dispose(); 58 59 base.OnFormClosed(e); 60 61 } 62 63 private void OnIdle(object sender, EventArgs e) 64 { 65 //とりあえずボールを描く 66 using (Graphics g = Graphics.FromImage(_BmpBack)) 67 { 68 g.FillRectangle(Brushes.Black, 0, 0, _BmpBack.Width, _BmpBack.Height); 69 foreach (var ball in _Balls) 70 { 71 g.FillEllipse(Brushes.LightBlue, ball.X, ball.Y, 20, 20); 72 } 73 } 74 75 //ボールを動かしてみる 76 int width = this.ClientSize.Width; 77 foreach( var ball in _Balls ) 78 { 79 ball.X+=2; 80 if (ball.X >= width) 81 { 82 ball.X = -20; 83 } 84 } 85 86 //バックバッファと表示用Bitmapを入れ替える 87 _BmpBack = Interlocked.Exchange(ref _BmpFront, _BmpBack); 88 pictureBox1.Image = _BmpFront; 89 90 Thread.Sleep(20); 91 } 92 } 93}

実行結果
GIFの動きは荒いですが、実際は割と滑らかに動きます。

投稿2021/07/19 11:46

編集2021/07/19 11:54
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ユーザーコントロールを作るのがいいかと、
種類・レベルでの違いとかは、1つのユーザーコントロールを作って、種類やレベルで画像や強さなどのパラメータを違えればいいと思います。

投稿2021/07/15 13:38

KIYOSHI

総合スコア268

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問