首页 > 解决方案 > 图片不会显示它到达屏幕底部

问题描述

我正在尝试制作游戏,物体从屏幕顶部掉落,当它到达屏幕底部时,图像会改变。一切对我来说似乎都很好,图像没有显示可能是 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();

        }
    }
}

标签: c#winforms

解决方案


据我了解,是 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.

我希望这就是你要找的。


推荐阅读