c# - 图片不会显示它到达屏幕底部
问题描述
我正在尝试制作游戏,物体从屏幕顶部掉落,当它到达屏幕底部时,图像会改变。一切对我来说似乎都很好,图像没有显示可能是 bsc 背景吗?我觉得我很奇怪,因为播放器会改变图像然后到达底部,但实际图像不会。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Projekt_Havlík
{
public partial class Form1 : Form
{
bool vpravo, vlevo; //boolean bude použit ke kontrole aby se hráč mohl pohybovat do prava/leva
int rychlost = 8; //toto je výchozí rychlost pro padání penízků
int myscore = 0; // toto je výchozí hodnota skóre
int minul = 0; // toto je výchozí hodnota pro minuti penízku
Random rndX = new Random(); //rndx bude použit ke generování náhodného umístění X
Random rndY = new Random(); //rndy bude použit ke generování náhodného umístění Y
PictureBox minulcoin = new PictureBox(); //vytvořit nový rámeček úvodního obrázku, tento bude přidán dynamicky
public Form1()
{
InitializeComponent();
RestartHry(); // toto je požito pro restart hry
}
private void MainGameTimerEvent(object sender, EventArgs e)
{
//naprogramovaní textboxů
txtscore.Text = "Score: " + myscore;
txtminul.Text = "Minul: " + minul;
//změnění postavy při jízdě do leva/prava
if (vlevo == true && player.Left > 0)
{
// když se Skrblík posune o 12 pixelů doleva
player.Left -= 12;
// Skrblíkův obrázek se změní na ten který se pohybuje vlevo
player.Image = Properties.Resources.main_left;
}
if (vpravo == true && player.Left + player.Width <this.ClientSize.Width)
{
// když se Skrblík posune o 12 pixelů doprava
player.Left += 12;
// Skrblíkův obrázek se změní na ten který se pohybuje vpravo
player.Image = Properties.Resources.main_right;
}
// díky loopu bude pude padat penízky
// pro každý Control voláme X v form
foreach (Control x in this.Controls)
{
// pokud X je typ pictureboxu a ma tag coins
if (x is PictureBox && (string)x.Tag == "coins")
{
//potom posuneme x smerem dolu
x.Top += rychlost;
//pokud coin (x) narazi na konec obrazovky
if (x.Top + x.Height > this.ClientSize.Height)
{
//here it doesnt work
minulcoin.Image = Properties.Resources.coinm;
minulcoin.Location = x.Location;
minulcoin.Height = 60;
minulcoin.Width = 60;
minulcoin.BackColor = Color.Transparent;
this.Controls.Add(minulcoin);
//this one works
x.Top = rndY.Next(80, 300) * -1;
x.Left = rndX.Next(5, this.ClientSize.Width - x.Width);
minul += 1;
player.Image = Properties.Resources.main_hurt;
}
//střetnutí pictureboxů
if (player.Bounds.IntersectsWith(x.Bounds))
{
x.Top = rndY.Next(80,300)*-1;
x.Left = rndX.Next(5, this.ClientSize.Width - x.Width);
myscore += 1;
}
}
}
//zvyšování rychlosti
if (myscore > 10)
{
rychlost = 10;
}
if (myscore > 20)
{
rychlost = 15;
}
if (myscore > 30)
{
rychlost = 20;
}
if (myscore > 40)
{
rychlost = 30;
}
if (myscore > 50)
{
rychlost = 40;
}
if (minul > 15)
{
CasovacHry.Stop();
MessageBox.Show("Game Over!" + "\r\n" + "Klikni OK pro restart");
RestartHry();
}
}
private void KeyIsUp(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Left)
{
// pokud je levá klávesa s šipkou netisknuta, chozeni vlevo se zmeni na false
vlevo = false;
}
if (e.KeyCode == Keys.Right)
{
// pokud je pravá klavesa s šipkou nestisknuta, chozeni vpravo se zmeni na false
vpravo = false;
}
}
private void KeyIsDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Left)
{
// když je levá klavesa s šipkou
vlevo = true;
}
if (e.KeyCode == Keys.Right)
{
vpravo = true;
}
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void RestartHry()
{
foreach(Control x in this.Controls)
{
if (x is PictureBox &&(string)x.Tag == "coins")
{
x.Top = rndY.Next(80, 300) * -1;
x.Left = rndX.Next(5, this.ClientSize.Width - x.Width);
}
}
player.Left = this.ClientSize.Width / 2;
player.Image = Properties.Resources.main_right;
myscore = 0;
minul = 0;
rychlost = 8;
vpravo = false;
vlevo = false;
CasovacHry.Start();
}
}
}
解决方案
据我了解,是 PictureBox minulcoin 没有出现,对吧?如果是这样,那是因为您创建了它,PictureBox minulcoin = new PictureBox();
但从未将其添加到表单/背景控件中。
在这种情况下将是一个快速修复。在“InitializeComponent();”之后 写下这一行:
this.Controls.Add(minulcoin); //You need to change "this" for the background control.
您现在可以像这样更改它的 z 位置
this.Controls.SetChildIndex(minulcoin, 0); //this would set it ontop of everything. increase the index (0) to "lower" it's z-position - if that makes sense.
我希望这就是你要找的。
推荐阅读
- python - 在不使用 CV2 的情况下,如何显示仅显示孤立绿色的图像
- jquery - Jquery + Datatables:启用/禁用所有复选框
- javascript - 页面上有多个计时器
- css - CSS 变量继承自同名
- php - 覆盖供应商包类中的 2 个函数
- office-ui-fabric - 无法在 Jest/Enzyme 测试中使用 Office UI Fabric Dropdown 触发“onChanged”委托
- sql - SQL 代码划分不起作用
- macos - sed OSX 命令在 Ubuntu 中不起作用
- javascript - while 循环中的 Javascript。这是可接受的做法吗?
- html - 宽度不会从 Div 中删除