對於有關此遊戲的常見問題,我很抱歉,但我不知道在哪裏以及如何在我的遊戲中實現gameloop。我想gameloop這樣的工作:在Windows窗體中實現gameloop
Settings();
if (startClicked == true)
{
Spawn();
}
while (enemyKilled == true)
{
Spawn();
}
這裏是我的代碼:
public partial class Form1 : Form
{
public int score1 = 0;
public PictureBox enemy = new PictureBox();
public PictureBox missile = new PictureBox();
public int enemyX;
public int enemyY;
public int missileX;
public int missileY;
public bool enemyKilled;
public bool startClicked;
public Form1()
{
InitializeComponent();
logo.Visible = false;
startbutton.Visible = false;
spaceship.Visible = false;
score.Visible = false;
labelEnemyX.Visible = false;
labelEnemyY.Visible = false;
labelMissileX.Visible = false;
labelMissileY.Visible = false;
}
private void Settings()
{
logo.Visible = true;
startbutton.Visible = true;
score.Text = Convert.ToString(score1);
}
private void Spawn()
{
enemy.Visible = true;
missile.Visible = true;
System.Timers.Timer enemyMove = new System.Timers.Timer();
enemyMove.Interval = 100;
Random enemyPosition = new Random();
int enemyX = enemyPosition.Next(30, 400);
int enemyY = enemy.Location.Y;
enemy.Location = new Point(enemyX, 0);
enemy.Image = WindowsFormsApplication16.Properties.Resources.Enemy2;
enemy.Width = 36;
enemy.Height = 29;
this.Controls.Add(enemy);
enemyMove.Elapsed += (sender, args) =>
{
enemy.Location = new Point(enemyX, enemy.Location.Y + 2);
enemyX = enemy.Location.X;
enemyY = enemy.Location.Y;
labelEnemyX.Text = Convert.ToString(enemyX);
labelEnemyY.Text = Convert.ToString(enemyY);
if (enemyY <= -10)
{
enemyKilled = false;
}
}; enemyMove.Start();
}
private void AddScore()
{
if (enemyKilled == true)
{
score1++;
score.Text = Convert.ToString(score1);
}
}
private void MissileMove()
{
System.Timers.Timer missileMove = new System.Timers.Timer();
missileMove.Interval = 30;
missileMove.Elapsed += (sender, args) =>
{
if (missile.Location.Y >= -30)
{
missile.Location = new Point(missile.Location.X, missile.Location.Y - 15);
missileX = missile.Location.X;
missileY = missile.Location.Y;
labelMissileX.Text = Convert.ToString(missileX);
labelMissileY.Text = Convert.ToString(missileY);
int enemyToMissileLocationX = Convert.ToInt32(labelEnemyX.Text);
int enemyToMissileLocationY = Convert.ToInt32(labelEnemyY.Text);
if ((missileX - enemyToMissileLocationX <= 20 && missileY - enemyToMissileLocationY <= 20 && missileX - enemyToMissileLocationX >= 0 && missileY - enemyToMissileLocationY >= 0) || (enemyToMissileLocationX - missileX <= 20 && enemyToMissileLocationY - missileY <= 20 && enemyToMissileLocationX - missileX >= 0 && enemyToMissileLocationY - missileY >= 0))
{
missile.Visible = false;
enemy.Visible = false;
enemyKilled = true;
}
}
}; missileMove.Start();
}
void Form1_Load(object sender, EventArgs e)
{
Settings();
if (startClicked == true)
{
Spawn();
}
while (enemyKilled == true)
{
Spawn();
}
}
private void startbutton_Click(object sender, EventArgs e)
{
this.startClicked = true;
logo.Visible = false;
startbutton.Visible = false;
spaceship.Visible = true;
score.Visible = true;
startbutton.Enabled = false;
}
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Right)
{
if (spaceship.Location.X <= 370)
{
spaceship.Location = new Point(spaceship.Location.X + 10, spaceship.Location.Y);
}
}
if (e.KeyCode == Keys.Left)
{
if (spaceship.Location.X >= 0)
{
spaceship.Location = new Point(spaceship.Location.X - 10, spaceship.Location.Y);
}
}
if (e.KeyCode == Keys.Space)
{
missile.Image = WindowsFormsApplication16.Properties.Resources.Missile;
missile.Height = 42;
missile.Width = 12;
missile.Location = new Point(spaceship.Location.X + 28, spaceship.Location.Y + 15);
this.Controls.Add(missile);
MissileMove();
}
}
}
更新:
private void MissileMove()
{
System.Timers.Timer missileMove = new System.Timers.Timer();
missileMove.Interval = 30;
missileMove.Elapsed += (sender, args) =>
{
if (missile.Location.Y >= -30)
{
missile.Location = new Point(missile.Location.X, missile.Location.Y - 15);
missileX = missile.Location.X;
missileY = missile.Location.Y;
labelMissileX.Text = Convert.ToString(missileX);
labelMissileY.Text = Convert.ToString(missileY);
int enemyToMissileLocationX = Convert.ToInt32(labelEnemyX.Text);
int enemyToMissileLocationY = Convert.ToInt32(labelEnemyY.Text);
if ((missileX - enemyToMissileLocationX <= 20 && missileY - enemyToMissileLocationY <= 20 && missileX - enemyToMissileLocationX >= 0 && missileY - enemyToMissileLocationY >= 0) || (enemyToMissileLocationX - missileX <= 20 && enemyToMissileLocationY - missileY <= 20 && enemyToMissileLocationX - missileX >= 0 && enemyToMissileLocationY - missileY >= 0))
{
missile.Visible = false;
enemy.Visible = false;
enemyKilled = true;
System.Threading.Thread.Sleep(100);
Application.DoEvents();
Spawn();
}
}
}; missileMove.Start();
試圖與類要做到這一點,是的,它釀出的敵人再一次,但動畫是竊聽,我可以看到敵人從一個位置跳到另一個位置。 謝謝你的幫助。
請添加您的questin更多詳細信息 – Krekkon
我希望每次殺死敵人時都能產生敵人。 –
這是一個巨大的長碼,沒有人會認爲它是一個想法。 請更新您的問題,以獲得更多答案。清理unneccery代碼或方法體 – Krekkon