2012-05-17 1 views
0

Так что я работаю над прорывной игрой, и до сих пор все шло хорошо, но когда я делаю картинку с картинками на экране, я, кажется, получаю неограниченное количество ящиков сообщений.Почему я получаю безостановочные окна сообщений?

here is the code snippet

using System; 
    using System.Collections.Generic; 
    using System.ComponentModel; 
    using System.Data; 
    using System.Drawing; 
    using System.Linq; 
    using System.Text; 
    using System.Windows.Forms; 

namespace WindowsFormsApplication1 
{ 
public partial class Form1 : Form 
{ 
    List<Brick> bricks = new List<Brick>(); 
    Ball _ball; 
    Paddle _paddle; 
    DateTime startTime = DateTime.Now; 
    DateTime startTime2 = DateTime.Now; 

    float ballVelocityX = 0; 
    float ballVelocityY = -1; 
    float ballSpeed = 20; 

    public Form1() 
    { 
     InitializeComponent(); 
     timer1.Enabled = true; 
     timer2.Enabled = true; 
     startTime = DateTime.Now; 
     System.Media.SoundPlayer sndPlayer; 
     sndPlayer = new System.Media.SoundPlayer(Properties.Resources._01_Calm_1); 
     foreach (PictureBox brick in panel1.Controls) 
     { 
      if (brick.Name != "ball" && brick.Name != "paddle") 
       bricks.Add(new Brick(brick)); 
      else if (brick.Name == "ball") 
       _ball = new Ball(brick); 
      else if (brick.Name == "paddle") 
       _paddle = new Paddle(brick); 
      //sndPlayer.Play(); 

     } 
    } 

    private void gameTimer_Tick(object sender, EventArgs e) 
    { 
     checkBrickCollision(); 
     checkPaddleCollision(); 
     checkBallScreenBounds(); 

     ball.SetBounds(ball.Location.X + (int)(ballVelocityX * ballSpeed), 
      ball.Location.Y + (int)(ballVelocityY * ballSpeed), 
      ball.Size.Width, ball.Size.Height); 
     paddle.SetBounds(Cursor.Position.X - panel1.Location.X, paddle.Location.Y, 
      paddle.Size.Width, paddle.Size.Height); 
    } 

    private void checkBallScreenBounds() 
    { 
     if (_ball.BallRectangle.Location.X + 25 > panel1.Size.Width) 
      ballVelocityX *= -1; 
     else if (_ball.BallRectangle.Location.X < 0) 
      ballVelocityX *= -1; 
     else if (_ball.BallRectangle.Location.Y < 0) 
      ballVelocityY *= -1; 
     else if (_ball.BallRectangle.Location.Y > panel1.Size.Height) 
      ballOffScreen(); 
    } 

    private void ballOffScreen() 
    { 
     new_start(); 
     Startnew startnew = new Startnew(); 
     startnew.Show(); 
     this.Close(); 
    } 

    private void new_start() 
    {    
     TimeSpan elapsedTime = DateTime.Now - startTime2; 
     DialogResult result; 
     result = MessageBox.Show("Your total time is " + ":" + elapsedTime.Minutes + elapsedTime.Seconds 
      + " would you like to play aigan?", "Application1", MessageBoxButtons.YesNo); 
     if (result == DialogResult.No) 
     { 
      Form1 form1 = new Form1(); 
      form1.Show(); 
     } 
     else if (result == DialogResult.Yes) 
     { 
      this.Close(); 
     } 

     //MessageBox.Show("Total time is " + elapsedTime.Minutes + ":" + elapsedTime.Seconds); 

    } 

    private void checkPaddleCollision() 
    { 
     int tmpBallVelocityX = _paddle.CheckPaddleMovement(); 

     if (_ball.BallRectangle.IntersectsWith(_paddle.PaddleRectangle)) 
     { 
      ballVelocityX = tmpBallVelocityX; 
      ballVelocityY *= -1; 
     } 
    } 

    private void checkBrickCollision() 
    { 
     Rectangle ballRectangle = _ball.BallRectangle; 

     foreach (Brick brick in bricks) 
      if (brick.IntersectWith(ballRectangle)) 
      { 
       bricks.Remove(brick); 
       ballVelocityX *= -1; 
       ballVelocityY *= -1; 
       break; 
      } 
    } 

    private void panel1_MouseEnter(object sender, EventArgs e) 
    { 
     Cursor.Hide(); 
    } 

    private void panel1_MouseLeave(object sender, EventArgs e) 
    { 
     Cursor.Show(); 
    } 
    public void Form_closse(object sender, FormClosedEventArgs e) 
    { 
     //ProgramInfo.ProgramState = State.Splash_Screen; 
    } 

    private void panel1_Paint(object sender, PaintEventArgs e) 
    { 

    } 
    private void timer1_tick(object sender, EventArgs e) 
    { 
     LabelTime.Text = "It is " + DateTime.Now; 
    } 
    private void timer2_tick(object sender, EventArgs e) 
    { 
     TimeSpan elapsedTime = DateTime.Now - startTime; 
     labelElapsedTime.Text = "Time Elapsed " + elapsedTime.Minutes + ":" + elapsedTime.Seconds; 
     } 
    } 
    } 
    ` #**EDIT**#` 
    `**because things were getting a bit confusing i posted all my code.**` 

ив сделали это с помощью кнопки и она отлично работает и все, но мне нужно выскакивать только один раз. есть ли способ только один раз вызвать его?

+0

Я думаю, что ваш шар продолжает двигаться после того, как он пошел закадровый, и что каждый раз, когда он перемещает его вызывает ballOffScreen() будет вызван. У вас есть какой-либо код, чтобы остановить перемещение мяча после того, как он исчезнет на экране? – Peter

+0

Да, сэр, это как раз то, что происходит, печальная часть - это то, что я, похоже, не знаю, как написать этот код, не позволяя ему думать, что это на бесконечном цикле. –

ответ

1

если new_start() является частью Form1,

Следующая строка выглядит как виновника, но больше кода необходим для более близкого взгляда.

if (result == DialogResult.No) 
    { 
     Form1 form1 = new Form1(); 
     form1.Show(); //This line is creating endless messagebox on selecting NO 
    } 

UPDATE на основе информации, содержащейся в комментариях,

вы можете контролировать функцию new_start с флагом

private bool checkNewGame = false; 
private void new_start() 
{   
    if(checkNewGame) return; 
    checkNewGame = true;  
    TimeSpan elapsedTime = DateTime.Now - startTime2; 
    DialogResult result; 
    result = MessageBox.Show("Your total time is " + ":" + elapsedTime.Minutes + elapsedTime.Seconds 
     + " would you like to play aigan?", "Application1", MessageBoxButtons.YesNo); 
    if (result == DialogResult.No) 
    { 
     Form1 form1 = new Form1(); 
     form1.Show(); 
    } 
    else if (result == DialogResult.Yes) 
    { 
     checkNewGame = true; 
     this.Close(); 

    } 

UPDATE 2

Вместо

if (result == DialogResult.No) 
{ 
    Form1 form1 = new Form1(); 
    form1.Show(); //This line is creating endless messagebox on selecting NO 
} 

сделать что-то вроде

if (result == DialogResult.No) 
{ 
    this.Clear(); // Create new function Clear, and clear all the Form state. 
} 

void clear() 
{ 
    ... //RESET all form state 
} 
+0

Я могу дать вам больше кода, но даже без формы. Покажите, что он сделал бы то же самое, im просто использовал это, чтобы, когда мяч ушел с экрана, и они нажали «да» на диалог, он сбросил бы себя. @Tilak –

+0

Вы используете любой таймер. также, сколько раз вызывается new_start() или ballOffScreen? и каково ваше ожидаемое поведение – Tilak

+0

Да, я использую 3 таймера для игры и 2 для времени. Я только заставлял его называть один раз, но, похоже, он не собирается так планомерно. мое ожидание поведения заключается в том, что, как только мяч выйдет из блока управления, нужно вызвать этот поле сообщения messagedialog, и в зависимости от ответа он либо закрывается, либо возвращается к перезагрузке игры и начинает новый раунд. –

0

Скорее всего кода, который должен перезапустить игру, не ясно «мяч-Off-Screen» Состояние и ваша игра сразу же идет к концу игры.

Примечание: Отладка следует немедленно показать причину поведения ...

+0

Нет, я побежал, это режим депиляции, он ничего не показывает. Я думаю, я мог бы знать, почему он это делает, возможно, это связано с границами. мяч, вероятно, продолжает думать, что он выходит за границы и бесконечно много раз, вы все равно могли бы создать какой-то способ остановить его? –

+0

Нет кода, который регулирует положение мяча для новой игры. Пожалуйста, убедитесь, что когда новая игра начинается, мяч находится внутри границ. –

Смежные вопросы