我是一名业余程序员,我正在XNA游戏工作室从事一个简单的Noughts和十字架游戏。现在我要做一个左键点击触发一个动作,它正在工作。 但是当我使用partial class命令将代码转换为两个文件时,我意外地更改了代码,现在右上角的方块不起作用。 这是“更新”代码,用于检查:
private void MouseProcess()
{
MouseState mstate = Mouse.GetState();
Mouse_pos = new Vector2(mstate.X, mstate.Y);
float xpos = mstate.X;
float ypos = mstate.Y;
if (mstate.LeftButton.Equals(ButtonState.Pressed))
{
if (xpos >= Gamevar[0].Position.X && xpos <= Gamevar[0].Position.X + 72)
{
C = 1;
}
if (xpos >= Gamevar[1].Position.X && xpos <= Gamevar[1].Position.X + 72)
{
C = 2;
}
if (xpos >= Gamevar[2].Position.X && xpos <= Gamevar[2].Position.X + 72)
{
C = 3;
}
if (ypos >= Gamevar[0].Position.Y && xpos <= Gamevar[0].Position.Y + 75)
{
R = 1;
}
if (ypos >= Gamevar[3].Position.Y && xpos <= Gamevar[3].Position.Y + 75)
{
R = 2;
}
if (ypos >= Gamevar[6].Position.Y && xpos <= Gamevar[6].Position.Y + 75)
{
R = 3;
}
}
}
private void Turncode()
{
switch (turn)
{
case true:
switch (C)
{
case 1:
switch (R)
{
case 1:
Gamevar[0].owner = 1;
turn = false;
C = 0;
R = 0;
break;
case 2:
Gamevar[3].owner = 1;
turn = false;
C = 0;
R = 0;
break;
case 3:
Gamevar[6].owner = 1;
turn = false;
C = 0;
R = 0;
break;
}
break;
case 2:
switch (R)
{
case 1:
Gamevar[1].owner = 1;
turn = false;
C = 0;
R = 0;
break;
case 2:
Gamevar[4].owner = 1;
turn = false;
C = 0;
R = 0;
break;
case 3:
Gamevar[7].owner = 1;
turn = false;
C = 0;
R = 0;
break;
}
break;
case 3:
switch (R)
{
case 1:
Gamevar[2].owner = 1;
turn = false;
C = 0;
R = 0;
break;
case 2:
Gamevar[5].owner = 1;
turn = false;
C = 0;
R = 0;
break;
case 3:
Gamevar[8].owner = 1;
turn = false;
C = 0;
R = 0;
break;
}
break;
}
break;
case false:
switch (C)
{
case 1:
switch (R)
{
case 1:
Gamevar[0].owner = 2;
turn = true;
C = 0;
R = 0;
break;
case 2:
Gamevar[3].owner = 2;
turn = true;
C = 0;
R = 0;
break;
case 3:
Gamevar[6].owner = 2;
turn = true;
C = 0;
R = 0;
break;
}
break;
case 2:
switch (R)
{
case 1:
Gamevar[1].owner = 2;
turn = true;
C = 0;
R = 0;
break;
case 2:
Gamevar[4].owner = 2;
turn = true;
C = 0;
R = 0;
break;
case 3:
Gamevar[7].owner = 2;
turn = true;
C = 0;
R = 0;
break;
}
break;
case 3:
switch (R)
{
case 1:
Gamevar[2].owner = 2;
turn = true;
C = 0;
R = 0;
break;
case 2:
Gamevar[5].owner = 2;
turn = true;
C = 0;
R = 0;
break;
case 3:
Gamevar[8].owner = 2;
turn = true;
C = 0;
R = 0;
break;
}
break;
}
break;
}
}
它并不复杂,但Gamevar [1],[2]和[5]不起作用。
答案 0 :(得分:0)
在ProcessMouse
内,检查if
的{{1}}语句实际上是在ypos
的第二个操作数中查看xpos
:
e.g。
&&
应该是:
if (ypos >= Gamevar[0].Position.Y && xpos <= Gamevar[0].Position.Y + 75)
{
R = 1;
}
以下两个if (ypos >= Gamevar[0].Position.Y && ypos <= Gamevar[0].Position.Y + 75)
{
R = 1;
}
语句。
除此之外,您可能会受益于重构代码以获得计算所单击的方形索引的方法,而不是将列和行存储在单独的变量中并使用嵌套的switch语句。
答案 1 :(得分:0)
您可以使用for循环迭代正方形以获取光标的位置。
(请注意,C
和R
的值将比原始代码中的值少一个。)
然后,您可以使用等式(R*3)+C
获取一维数组中单元格的索引。
private void MouseProcess()
{
MouseState mstate = Mouse.GetState();
Mouse_pos = new Vector2(mstate.X, mstate.Y);
float xpos = mstate.X;
float ypos = mstate.Y;
if (mstate.LeftButton.Equals(ButtonState.Pressed))
{
for (int i=0; i<3; i++)
{
if (xpos >= Gamevar[i].Position.X && xpos <= Gamevar[i].Position.X + 72)
{
C = i;
}
if (ypos >= Gamevar[i*3].Position.Y && ypos <= Gamevar[i*3].Position.Y + 75)
{
R = i;
}
}
}
}
private void Turncode()
{
if (turn==true)
{
Gamevar[(R*3)+C].owner=1;
}
else
{
Gamevar[(R*3)+C].owner=2;
}
turn=!turn; //toggle to the other person's turn
C=0;
R=0;
}
如果您的代码重复,请尝试使用循环或找到一个方程来为您完成工作。