c#においてのループ内でのキーの読み取り

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
SINA

c#においてのループ内でのキーの読み取り

#1

投稿記事 by SINA » 11年前

タイトルの通りc#でのキー読み取りについての質問です。
具体的にはwhileループ内でキーを読み取り画面上の四角形(bar)のX座標を
変更したいと思っています。色々調べてみたのですが動いてくれませんので質問させていただきました。
どうかよろしくお願いいたします。

コード:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Diagnostics; 
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;
public struct Bar
{
    public int X;
    public int Y;
    public int WIDTH;
    public int HEIGHT;
}
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        Bitmap bmp;
        Graphics Ball;//ボール
        Graphics Bar;//バー
        Stopwatch sw = new Stopwatch();
        Bar bar = new Bar();
        int Ballx=100, Bally=100;
        public Form1()
        {
            InitializeComponent();
        }
        public void ini()
        {
            bar.X = 200;
            bar.Y = 200;
            bar.WIDTH = 100;
            bar.HEIGHT= 50;
        }
        private void Form1_Load(object sender, EventArgs e)
        {   
            bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
            pictureBox1.Image = bmp;
            Ball = Graphics.FromImage(bmp);
            Bar = Graphics.FromImage(bmp);
            ini();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            main();
        }
        public void main()//メイン処理
        {
            sw.Start();
            while (true)
            {
                Ball.Clear(Color.White);
                Ball.FillEllipse(Brushes.Red,Ballx,Bally, 5, 5);
                Bar.FillRectangle(Brushes.Aqua, bar.X, bar.Y, bar.WIDTH, bar.HEIGHT);
                if (sw.ElapsedMilliseconds % 5 == 0)
                {
                    Ballx++;
                    Bally++;
                }
                pictureBox1.Refresh();
            }
        }
        public void keyPressed(ConsoleKeyInfo e)
        {
        }
        private void pictureBox1_Click(object sender, EventArgs e)
        {

        }
        public void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyData == Keys.Left)
                bar.X--;
            if (e.KeyData == Keys.Right)
                bar.X++;
        }
    }
}


アバター
ookami
記事: 214
登録日時: 14年前
住所: 東京都

Re: c#においてのループ内でのキーの読み取り

#2

投稿記事 by ookami » 11年前

SINAさん、
以下の点が気になりました。
1. while (true) の中でウェイトを入れていない
2. Form1_KeyDownでキー入力を拾えるかどうかは、フォームの KeyPreview プロパティに依存する
3. (推奨)「Graphics型のBall変数」と、「Ball型のball変数」が混在しているので、あとで本人も混乱する可能性高いので、命名の再考をお勧めします。【追記:間違えました、Ballとballではなく、Barとbarです】

2 については、Form1_KeyDown関数の中にブレークポイントを設定してデバッグするとよいと思います。
最後に編集したユーザー ookami on 2014年6月27日(金) 15:08 [ 編集 1 回目 ]

YuO
記事: 947
登録日時: 14年前
住所: 東京都世田谷区

Re: c#においてのループ内でのキーの読み取り

#3

投稿記事 by YuO » 11年前

SINA さんが書きました:具体的にはwhileループ内でキーを読み取り画面上の四角形(bar)のX座標を
変更したいと思っています。色々調べてみたのですが動いてくれませんので質問させていただきました。
コードを見ましたが,「根本的に書き直しが必要」です。

まず,ループで描画を繰り返す,という発想を捨ててください。
Windowsの通常のアプリケーションにおいて,この方法は最悪の手段です。
オフトピック
ループ中にApplication.DoEventsを入れるのが,下策もいいところではあるものの回避策ではあります。
下策というのは,もっとまともな方法がいくらでもあるので下策です。Timer, Task, BackgroundWorker, Delegate.BeginInvoke, Threadなど。
WinFormsアプリケーションに限って書くなら,
  • 描画は原則としてControlのPaintイベントで行う
  • 再描画を必要とする場合は,ControlのRefrershメソッドを呼び出してPaintイベントを要求することで行う
  • 一定時間毎に繰り返し行う処理はタイマーを使う
を守ってください。

SINA

Re: c#においてのループ内でのキーの読み取り

#4

投稿記事 by SINA » 11年前

お二人ともご教授有難うございましたc#でゲームを作るのは何分初めてでしたので至らない点も多々あったかと思います
失礼いたしました。YuOさんの挙げておられる解決法を調べて書き直したいと思います。有難うございました。

閉鎖

“C言語何でも質問掲示板” へ戻る