0

私はC#でゲームを作るのに問題があります。それは次のようになります:私はタイマーでバウンスするピクチャーボックスを作りました。そして、それをクリックするとラベルが「ポイント:」から「ポイント:1」になります「ポイント:」から「ポイント: 162」のようになります。

間隔が原因だと思いますが、解決方法がわかりません。

-画像をクリックします -ポイントを 1 つ追加します *まだ完了していません -画像 (画像ボックス) を消す -別の画像 (画像ボックス) をランダムに追加します

ポイントカウンターが欲しいのですが、タイマーを使えばそれで終わりです。どんな助けでも感謝します。

 int dx;
    int dy;
    int x;
    int y;
    int pts = 0;

    private void Form1_Load(object sender, EventArgs e)
    {
        Random rnd = new Random();
        dx = rnd.Next(2, 5);
        dy = rnd.Next(2, 5);
        x = rnd.Next(0, this.ClientSize.Width - 1 );
        y = rnd.Next(0, this.ClientSize.Height - 1);
    }

    private void Form1_Paint(object sender, PaintEventArgs e)
    {
        pictureBox1.Location = new Point(x, y);
        pictureBox1.Click += pictureBox1_Click;
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        x += dx;
        if (x < 0)
        {
            dx = -dx;
        }
        else if (x + 50 > this.ClientSize.Width)
        {
            dx = -dx;
        }

        y += dy;
        if (y < 100)
        {
            dy = -dy;
        }
        else if (y + 50 > this.ClientSize.Height)
        {
            dy = -dy;
        }
        this.Invalidate();
    } 

    void pictureBox1_Click(object sender, EventArgs e)
    {  
       pts++;
       label1.Text = "Pontos: " + pts;

       pictureBox1.Location = new Point(x,y); 
    }



 this.components = new System.ComponentModel.Container();
        System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1));
        this.timer1 = new System.Windows.Forms.Timer(this.components);
        this.pictureBox1 = new System.Windows.Forms.PictureBox();
        this.panel1 = new System.Windows.Forms.Panel();
        this.label1 = new System.Windows.Forms.Label();
        ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
        this.panel1.SuspendLayout();
        this.SuspendLayout();
        // 
        // timer1
        // 
        this.timer1.Enabled = true;
        this.timer1.Interval = 10;
        this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
        // 
        // pictureBox1
        // 
        this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image")));
        this.pictureBox1.Location = new System.Drawing.Point(146, 243);
        this.pictureBox1.Name = "pictureBox1";
        this.pictureBox1.Size = new System.Drawing.Size(50, 50);
        this.pictureBox1.TabIndex = 0;
        this.pictureBox1.TabStop = false;
        this.pictureBox1.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint);
        // 
        // panel1
        // 
        this.panel1.BackColor = System.Drawing.Color.Teal;
        this.panel1.Controls.Add(this.label1);
        this.panel1.Cursor = System.Windows.Forms.Cursors.Arrow;
        this.panel1.Dock = System.Windows.Forms.DockStyle.Top;
        this.panel1.Location = new System.Drawing.Point(0, 0);
        this.panel1.Name = "panel1";
        this.panel1.Size = new System.Drawing.Size(534, 100);
        this.panel1.TabIndex = 1;
        // 
        // label1
        // 
        this.label1.AutoSize = true;
        this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 26.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
        this.label1.ForeColor = System.Drawing.SystemColors.ButtonFace;
        this.label1.Location = new System.Drawing.Point(26, 27);
        this.label1.Name = "label1";
        this.label1.Size = new System.Drawing.Size(144, 39);
        this.label1.TabIndex = 0;
        this.label1.Text = "Pontos: ";
        // 
        // Form1
        // 
        this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
        this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
        this.BackColor = System.Drawing.SystemColors.Control;
        this.ClientSize = new System.Drawing.Size(534, 562);
        this.Controls.Add(this.panel1);
        this.Controls.Add(this.pictureBox1);
        this.Cursor = System.Windows.Forms.Cursors.Cross;
        this.Name = "Form1";
        this.Text = "Form1";
        this.Load += new System.EventHandler(this.Form1_Load);
        this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint);
        ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
        this.panel1.ResumeLayout(false);
        this.panel1.PerformLayout();
        this.ResumeLayout(false);

ps: 私はポルトガル人です。申し訳ありませんが私の英語

4

2 に答える 2

0

コードは完全ではありません。「timer1_Tick」メソッドを呼び出すタイマーイベントをどのイベントから発火させているかを指定してください。

質問とコードを見ると、各タイマーの「クリック」がウィンドウの再描画を引き起こしていると思います。より良いアプローチは、画像をクリックしたときにのみウィンドウを再描画することです。また、各 Time_Click と同じシーケンスで、Picture_Click も呼び出しているようです (コードは投稿されたコードではありませんが、動作によると推測されます)。これにより、ポイントが増加します。したがって、これが終了すると、おそらく 162 ティックになり、162 ポイントが表示されるのはそのためです。

于 2013-11-03T13:53:37.143 に答える
0

Form1_Paintが呼び出されるたびにクリックイベントをサブスクライブしているようです

 pictureBox1.Click += pictureBox1_Click;

コンストラクターまたは初期化メソッドに移動してみてください。

于 2013-11-03T14:00:33.150 に答える