更改图形的可见性
Changing the Visibility of a Graphic
我正在制作刽子手游戏,我需要绘图的每个 body 部分都变得不可见,然后在玩家猜错字母时返回。我曾尝试使用图片框,但它们会切断掉落在框内的其他图像的一部分,所以我改用图形。这是根据角色选择的人制作角色的代码...
Graphics test = e.Graphics;
Graphics t2 = e.Graphics;
//test.DrawImage(Cowboy.head, 180f, 180f, 250f, 250f);
//test.DrawImage(Cowgirl.head, 35f, 90f, 650f, 550f);
//test.DrawImage(Criminal.head, 35f, 80f, 650f, 550f);
//test.DrawImage(Cyborg.head, 180f, 180f, 200f, 350f);
//test.DrawImage(Princess.head, 180f, 180f, 200f, 350f);
if (Variables.p1_type=="Cowboy")
{
test.DrawImage(Cowboy.head, 180f, 180f, 250f, 250f);
test.DrawImage(Cowboy.body, 180f, 180f, 250f, 250f);
test.DrawImage(Cowboy.leftArm, 180f, 180f, 250f, 250f);
test.DrawImage(Cowboy.rightArm, 180f, 180f, 250f, 250f);
test.DrawImage(Cowboy.leftLeg, 180f, 180f, 250f, 250f);
test.DrawImage(Cowboy.rightLeg, 180f, 180f, 250f, 250f);
}
if (Variables.p1_type == "Cowgirl")
{
test.DrawImage(Cowgirl.head, 35f, 90f, 650f, 550f);
test.DrawImage(Cowgirl.body, 35f, 90f, 650f, 550f);
test.DrawImage(Cowgirl.leftArm, 35f, 90f, 650f, 550f);
test.DrawImage(Cowgirl.rightArm, 35f, 90f, 650f, 550f);
test.DrawImage(Cowgirl.leftLeg, 35f, 90f, 650f, 550f);
test.DrawImage(Cowgirl.rightLeg, 35f, 90f, 650f, 550f);
}
if (Variables.p1_type == "Criminal")
{
test.DrawImage(Criminal.head, 35f, 80f, 650f, 550f);
test.DrawImage(Criminal.body, 35f, 80f, 650f, 550f);
test.DrawImage(Criminal.leftArm, 35f, 80f, 650f, 550f);
test.DrawImage(Criminal.rightArm, 35f, 80f, 650f, 550f);
test.DrawImage(Criminal.leftLeg, 35f, 80f, 650f, 550f);
test.DrawImage(Criminal.rightLeg, 35f, 80f, 650f, 550f);
}
if (Variables.p1_type == "Cyborg")
{
test.DrawImage(Cyborg.head, 180f, 180f, 200f, 350f);
test.DrawImage(Cyborg.body, 180f, 180f, 200f, 350f);
test.DrawImage(Cyborg.leftArm, 180f, 180f, 200f, 350f);
test.DrawImage(Cyborg.rightArm, 180f, 180f, 200f, 350f);
test.DrawImage(Cyborg.leftLeg, 180f, 180f, 200f, 350f);
test.DrawImage(Cyborg.rightLeg, 180f, 180f, 200f, 350f);
}
if (Variables.p1_type == "Princess")
{
test.DrawImage(Princess.head, 180f, 180f, 200f, 350f);
test.DrawImage(Princess.body, 180f, 180f, 200f, 350f);
test.DrawImage(Princess.leftArm, 180f, 180f, 200f, 350f);
test.DrawImage(Princess.rightArm, 180f, 180f, 200f, 350f);
test.DrawImage(Princess.leftLeg, 180f, 180f, 200f, 350f);
test.DrawImage(Princess.rightLeg, 180f, 180f, 200f, 350f);
}
我需要这些 body 部分中的每一个部分在开始时不可见,然后在选择了错误的字符时变得可见。我该怎么做,如果不可能,还有什么其他方法可以做到?
如果玩家猜错
if (Variables.word4player1.ToUpper().Contains(e.KeyCode.ToString())!=true)
{
p1Turn = false;
label2.Font = new Font(label1.Font, FontStyle.Underline | FontStyle.Bold);//change underlined player
label1.Font = new Font(label1.Font, FontStyle.Regular);
p1_wrong.Text = p1_wrong.Text + " " + e.KeyCode.ToString();
}
设置变量p1_type
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
Variables.p1_type= listBox_P1.SelectedItem.ToString();
label_player1Type.Text = Variables.p1_type;
}
您可以 "trick" 表格绘制图像 ONLY 而不是整个 PictureBox
.
当然,还有更多 "elegant" 方法可以做到这一点,例如覆盖 PictureBox OnPaint
事件或制作您自己的控件。
但我自己也不是这方面的高手,所以我不会回答你。
您首先要做的就是将所有 PictureBoxs'
可见性设置为 false。
然后将"false"添加到每个PictureBox的Tag
。我们将使用它作为 "Dummy Visibility" 来告诉表单是否绘制图像。
在表单的 Paint
事件中,添加:
(假设pbs
是包含所有PictureBoxs
的数组。)
Graphics g = e.Graphics;
for(int i=0;i<pbs.Count();i++)
{
if(pbs[i].Tag.ToString()=="true")
g.DrawImage(pbs[i].Image, pbs[i].Location);
}
并且在检查玩家是否输入错误单词的方法中,执行:
(假设cur
是当前PictureBox
的索引。)
pbs[cur].Tag = true;
this.Refresh();
瞧!你有一个 PictureBox
不会挡住它后面的图像!
我正在制作刽子手游戏,我需要绘图的每个 body 部分都变得不可见,然后在玩家猜错字母时返回。我曾尝试使用图片框,但它们会切断掉落在框内的其他图像的一部分,所以我改用图形。这是根据角色选择的人制作角色的代码...
Graphics test = e.Graphics;
Graphics t2 = e.Graphics;
//test.DrawImage(Cowboy.head, 180f, 180f, 250f, 250f);
//test.DrawImage(Cowgirl.head, 35f, 90f, 650f, 550f);
//test.DrawImage(Criminal.head, 35f, 80f, 650f, 550f);
//test.DrawImage(Cyborg.head, 180f, 180f, 200f, 350f);
//test.DrawImage(Princess.head, 180f, 180f, 200f, 350f);
if (Variables.p1_type=="Cowboy")
{
test.DrawImage(Cowboy.head, 180f, 180f, 250f, 250f);
test.DrawImage(Cowboy.body, 180f, 180f, 250f, 250f);
test.DrawImage(Cowboy.leftArm, 180f, 180f, 250f, 250f);
test.DrawImage(Cowboy.rightArm, 180f, 180f, 250f, 250f);
test.DrawImage(Cowboy.leftLeg, 180f, 180f, 250f, 250f);
test.DrawImage(Cowboy.rightLeg, 180f, 180f, 250f, 250f);
}
if (Variables.p1_type == "Cowgirl")
{
test.DrawImage(Cowgirl.head, 35f, 90f, 650f, 550f);
test.DrawImage(Cowgirl.body, 35f, 90f, 650f, 550f);
test.DrawImage(Cowgirl.leftArm, 35f, 90f, 650f, 550f);
test.DrawImage(Cowgirl.rightArm, 35f, 90f, 650f, 550f);
test.DrawImage(Cowgirl.leftLeg, 35f, 90f, 650f, 550f);
test.DrawImage(Cowgirl.rightLeg, 35f, 90f, 650f, 550f);
}
if (Variables.p1_type == "Criminal")
{
test.DrawImage(Criminal.head, 35f, 80f, 650f, 550f);
test.DrawImage(Criminal.body, 35f, 80f, 650f, 550f);
test.DrawImage(Criminal.leftArm, 35f, 80f, 650f, 550f);
test.DrawImage(Criminal.rightArm, 35f, 80f, 650f, 550f);
test.DrawImage(Criminal.leftLeg, 35f, 80f, 650f, 550f);
test.DrawImage(Criminal.rightLeg, 35f, 80f, 650f, 550f);
}
if (Variables.p1_type == "Cyborg")
{
test.DrawImage(Cyborg.head, 180f, 180f, 200f, 350f);
test.DrawImage(Cyborg.body, 180f, 180f, 200f, 350f);
test.DrawImage(Cyborg.leftArm, 180f, 180f, 200f, 350f);
test.DrawImage(Cyborg.rightArm, 180f, 180f, 200f, 350f);
test.DrawImage(Cyborg.leftLeg, 180f, 180f, 200f, 350f);
test.DrawImage(Cyborg.rightLeg, 180f, 180f, 200f, 350f);
}
if (Variables.p1_type == "Princess")
{
test.DrawImage(Princess.head, 180f, 180f, 200f, 350f);
test.DrawImage(Princess.body, 180f, 180f, 200f, 350f);
test.DrawImage(Princess.leftArm, 180f, 180f, 200f, 350f);
test.DrawImage(Princess.rightArm, 180f, 180f, 200f, 350f);
test.DrawImage(Princess.leftLeg, 180f, 180f, 200f, 350f);
test.DrawImage(Princess.rightLeg, 180f, 180f, 200f, 350f);
}
我需要这些 body 部分中的每一个部分在开始时不可见,然后在选择了错误的字符时变得可见。我该怎么做,如果不可能,还有什么其他方法可以做到?
如果玩家猜错
if (Variables.word4player1.ToUpper().Contains(e.KeyCode.ToString())!=true)
{
p1Turn = false;
label2.Font = new Font(label1.Font, FontStyle.Underline | FontStyle.Bold);//change underlined player
label1.Font = new Font(label1.Font, FontStyle.Regular);
p1_wrong.Text = p1_wrong.Text + " " + e.KeyCode.ToString();
}
设置变量p1_type
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
Variables.p1_type= listBox_P1.SelectedItem.ToString();
label_player1Type.Text = Variables.p1_type;
}
您可以 "trick" 表格绘制图像 ONLY 而不是整个 PictureBox
.
当然,还有更多 "elegant" 方法可以做到这一点,例如覆盖 PictureBox OnPaint
事件或制作您自己的控件。
但我自己也不是这方面的高手,所以我不会回答你。
您首先要做的就是将所有 PictureBoxs'
可见性设置为 false。
然后将"false"添加到每个PictureBox的Tag
。我们将使用它作为 "Dummy Visibility" 来告诉表单是否绘制图像。
在表单的 Paint
事件中,添加:
(假设pbs
是包含所有PictureBoxs
的数组。)
Graphics g = e.Graphics;
for(int i=0;i<pbs.Count();i++)
{
if(pbs[i].Tag.ToString()=="true")
g.DrawImage(pbs[i].Image, pbs[i].Location);
}
并且在检查玩家是否输入错误单词的方法中,执行:
(假设cur
是当前PictureBox
的索引。)
pbs[cur].Tag = true;
this.Refresh();
瞧!你有一个 PictureBox
不会挡住它后面的图像!