C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: 画像の繰り返し表示ができない


(過去ログ 108 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■64143 / inTopicNo.1)  画像の繰り返し表示ができない
  
□投稿者/ sekitui (1回)-(2012/11/09(Fri) 00:10:08)

分類:[C#] 

Visual C#のフォームアプリケーションでスロットマシーンゲームを作ろうと考えています。
8個の画像を用意して3箇所の表示場所に順番に表示させていくプログラムを考えました。
キーボードで止めるためスレッドを使っています。重要そうな部分だけ書いていきます。

      public int Reel;
            Picture[0] = pictureBox1;
            Picture[1] = pictureBox2;
            Picture[2] = pictureBox3;
            Picture[3] = pictureBox4;
            Picture[4] = pictureBox5;
            Picture[5] = pictureBox6;
            Picture[6] = pictureBox7;
            Picture[7] = pictureBox8;
          
      private void Start()
          {
              while (Stopper == 0)
              {   
                  Thread.Sleep(10);
                  Starting();
              }
          }

        protected delegate void StartEventHandler();
        protected void Starting()
        {

            if (InvokeRequired)
            {
                StartEventHandler reh = new StartEventHandler(Starting);
                Invoke(reh);
            }
            else
            {
        //Pictureを1.2.3.4.5.6.7.8.1.2.3...と順に表示していく
                else if (Reel == 7)
                {
                    Zugara.Run(Picture[7], Picture[0], Picture[1]);

                    Thread.Sleep(300);
                    Reel=0;
                }
                //Thread.Sleep(1);
                else if (Reel == 6)
                {
                    Zugara.Run(Picture[6], Picture[7], Picture[0]);
                    Thread.Sleep(300);
                    Reel++;
                }
                else
                {
                   Zugara.Run(Picture[Reel], Picture[(Reel + 1)], Picture[(Reel + 2)]);
                   Thread.Sleep(300);
                    Reel++;
                }
            }
        }

//Zugara.cs

        public void Run(PictureBox picturebox1, PictureBox picturebox2, PictureBox picturebox3)
        {
            this.MyPictureBox1 = picturebox1;
            this.MyPictureBox2 = picturebox2;
            this.MyPictureBox3 = picturebox3; 
            Redraw();
            this.MyPictureBox1.Refresh();
            this.MyPictureBox2.Refresh();
            this.MyPictureBox3.Refresh();

        }

        private void Redraw()
        {
            MyPictureBox1.Location = new Point(175, 80);
            MyPictureBox2.Location = new Point(175, 135);
            MyPictureBox3.Location = new Point(175, 190);
        }


これで動かすと、2週目のPicture[0]がMyPictureBox1に表示されるべき部分で前の画像が表示されたままになってしまいます。
MypictureBox1だけでなくMypictureBox2、MypictureBox3の挙動も正常のようには見えないです(同じ画像が2連続で表示されるなど)。
上書きを重ねているのでどこかおかしな所が出る可能性はありますが、原因がわかりません。解決に協力お願いします。

引用返信 編集キー/
■64144 / inTopicNo.2)  Re[1]: 画像の繰り返し表示ができない
□投稿者/ shu (90回)-(2012/11/09(Fri) 07:56:32)
No64143 (sekitui さん) に返信

> while (Stopper == 0)
> {
> Thread.Sleep(10);
> Starting();
> }
あまり見ていませんがこういう作りは他の処理を遅延させる
原因になるのでやめたほうがよいです。一定時間毎に発生するTimerイベントなど
を使用された方がよいと思います。




引用返信 編集キー/
■64186 / inTopicNo.3)  Re[1]: 画像の繰り返し表示ができない
□投稿者/ Jitta (15回)-(2012/11/12(Mon) 21:06:22)
Jitta さんの Web サイト
No64143 (sekitui さん) に返信
> 2週目のPicture[0]がMyPictureBox1に表示されるべき部分で前の画像が表示されたまま
> になってしまいます。
 消してないから。
 コントロールは、必ず親を持っています。this.MyPictureBox1 = Picture[0] で、
pictureBox1 の親が this になります。次の this.MyPictureBox1 = Picture[1] で、
pictureBox1 は以前の位置に表示されたままなのですが、その上に picturebox2 が
表示されている、という状態になっているのでしょう。

 デバッグはして下さい。こんな感じで行けます。

Picture の宣言を Image に変え、代入するものも変える。

if (Reel == 7)

else
{
Zugara.Run(Picture[Reel], Picture[(Reel + 1)], Picture[(Reel + 2)]);
Thread.Sleep(300);
Reel++;
}

Zugara.Run(Picture[Reel], Picture[(Reel + 1) % 7], Picture[(Reel + 2) % 7]);
Reel = (Reel + 1) % 7;

public void Run(PictureBox picturebox1, PictureBox picturebox2, PictureBox picturebox3)

public void Run(Image picture1, Image picture2, Image picture3)

this.MyPictureBox1 = picturebox1;
this.MyPictureBox2 = picturebox2;
this.MyPictureBox3 = picturebox3;

this.MyPictureBox1.Image = picture1;
this.MyPictureBox2.Image = picture2;
this.MyPictureBox3.Image = picture3;

引用返信 編集キー/
■64196 / inTopicNo.4)  Re[2]: 画像の繰り返し表示ができない
□投稿者/ howling (71回)-(2012/11/13(Tue) 11:46:30)
2012/11/13(Tue) 11:48:43 編集(投稿者)

Jitta さん、sekituiさん

横からすみません。
私も見てて、なんでこれうまくいかないんだろうなーと思って見てました。
見ててインデックスの計算ミスだと踏んでいたのですが、だいぶハズれていました。>Jittaさんさすがです!

以下はsekituiさんへ。
なるほど、確かにコントロールでやるとおかしくなりますね。
それに、スロットの場合は同じ絵柄で止める(リーチ状態とか)にする可能性が高いですから、
1コントロール=1絵柄としてしまうと、どうあがいてもこれはできなくなりますしね。

//MyPictureBox1.Location = new Point(175, 80); //これの中身がpicturebox1で
//MyPictureBox2.Location = new Point(175, 135); //リーチの時はこれもpicturebox1になってしまうのでおかしくなる

必ず別の絵柄しか出さないのであれば、Visibleを変えてやることでどうにかなると思いますが、
それは止めておいた方が良さそうですね。

それに、おそらくリールを回転させるでしょうから、
リールの上部分や下部分を見せたいのであれば、1リールに最大3つの絵柄を見せることになります。
ということは、リールの描画サイズ分だけBitmapか何かで指定して、
どれだけ滑っているかによって描画する位置を変える必要がありそうです。
ま、それで描画した物をPictureBoxに割り当てれば終わりかなーと。
尚更1コントロール=1絵柄では難しそう。

スロット自体は作るの簡単だと思いますが、
確率とか演出とかがめんどくさい…。
ここらへんは半分以上企画任せになると思うのですが、頑張ってください。
//ゲーム会社にいる関係上、同期にスロット作ってる人は結構多いので…
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -