Suren97 Ответов: 1

C# как изменить цвет прыгающего мяча?


Мне нужно изменить цвет шара,когда шар сталкивается по краям формы,от каждого столкновения его цвет должен становиться случайным, и этот цвет должен сохраняться до тех пор, пока не произойдет второе столкновение.
Кто-нибудь может мне помочь, пожалуйста?

Что я уже пробовал:

public partial class Form2 : Form
    {
        Ball ball;
        Graphics g;
        public Form2()
        {
            InitializeComponent();
            g = this.CreateGraphics();
            ball = new Ball(80, 80, 30,30, g, this);

        }

        private void Form2_Paint(object sender, PaintEventArgs e)
        {
            ball.draw();
        }
    }



class Ball
    {
        public int x;
        public int y;
        public int r;
        public int s;
        public Graphics g;
        public Thread td;
        public Form2 fr;
        public SolidBrush myvariable;
        public Random rnd;
        public Ball(int x, int y, int r,int s, Graphics g, Form2 fr)
        {
            this.fr = fr;
            this.x = x;
            this.y = y;
            this.r = r;
            this.s = s;
            this.g = g;
            td = new Thread(run);
            td.Start();
        }
        public void draw()
        {
             myvariable = new SolidBrush(Color.FromArgb(rnd.Next(150), rnd.Next(205), rnd.Next(160)));
            g.FillEllipse(myvariable, x, y, r, s);
            
        }
        
        public void run()
        {
            for (;;)
            {
                this.move();
                Thread.Sleep(50);
            }
        }
        public void move()
        {
            int newball_x = x + r;
            int newball_y = y + s;
            if (newball_x < -5 || newball_x > this.fr.ClientSize.Width)
            {
                r = -r;
                
            }
            if (newball_y < 0 || newball_y > this.fr.ClientSize.Height)
            {
                s = -s;
            }
            x += r;
            y += s;
            this.fr.Invalidate();
        }
    }

F-ES Sitecore

Вы уже сохраняете координаты шаров, поэтому сохраняете их цвет таким же образом. Для генерации случайных цветов google "c# generate random colour"

Suren97

я не представляю, как я могу это сделать?

1 Ответов

Рейтинг:
2

OriginalGriff

Переместите определение SolidBrush за пределы любого метода, чтобы оно стало частью класса (вы должны сделать это в любом случае, так как все графические объекты являются дефицитными ресурсами и должны быть правильно утилизированы, когда вы закончите с ними - если вы этого не сделаете, вы получите проблемы, когда они закончатся).
Затем класс сохраняет значение для вас.
Когда вы обнаружите, что он ударился о стену, удалите существующий экземпляр и создайте новую сплошную кисть, используя случайный цвет: Как выбрать случайный цвет из системы.Рисование.Цвет?[^]


Suren97

Извините, но я ничего не понимаю

OriginalGriff

Чего ты не понимаешь? Я постараюсь объяснить это немного подробнее...

Suren97

разве я не могу написать ее без урока?

Suren97

Ну, я обновил свой код, теперь вы можете мне помочь, где я должен написать случайный цвет?

OriginalGriff

Нигде в этом месте.
Опять же, вы просто догадываетесь, не так ли? Ваша предыдущая версия была лучше...

Когда я сказал: "переместите определение SolidBrush за пределы любого метода, чтобы оно стало частью класса", я имел в виду именно это: переместите его за пределы вашего метода Paint, чтобы он стал частью класса, содержащего этот метод. Форма-это класс. Вот почему ваш код говорит:
публичный частичный класс Form2 : форма
*Все* в C# находится в классе. Здесь нет глобальных переменных или методов, все они являются частью того или иного класса.

Я знаю, что говорил вам это раньше - кажется, вчера, - но вы должны перестать просто гадать и прыгать в код. Несколько минут размышлений и планирования, разработка того, что вам нужно сделать, и разработка чего-то, что покрывает то, что вы хотите, сделают вашу жизнь намного проще. И вся работа загружается быстрее, чтобы загрузиться.

Так что отбросьте это, вернитесь к предыдущей версии и начните планировать вместо того, чтобы просто печатать и надеяться, что все уладится само собой!

Ralf Meier

@О.:
Он не определил сплошную кисть, он непосредственно назначил фиксированную кисть для "Филлипса" - поэтому он не понял, что вы имеете в виду ...

OriginalGriff

Он так и сделал в первой версии...

Ralf Meier

@Сурен:
Что означает ОГ это :
Вы написали в своем коде : g.FillEllipse(Brushes.DarkViolet, x, y, r, s);
Вместо использования фиксированного назначения вы также можете создать переменную типа Solidbrush с помощью кистей startvalue.Смешанный цвет. Эта переменная должна быть объявлена вне метода draw. Внутри метода "draw" вы используете эту переменную вместо "Brushes".Смешанный цвет'.
Итак, теперь, если вы хотите (или хотите), вы можете изменить назначение этой переменной (возможно, на 'Brushes.Синий') и в следующий раз, когда метод рисования называется эллипс рисуется в этом цвете.
Теперь вы поняли, что имеется в виду ...?

Suren97

я не знаю, как я могу объявить случайный цвет?

OriginalGriff

Перейдите по ссылке в исходном решении - там показано несколько методов...

Maciej Los

Даже с объяснениями Ральфа? Что ж... возвращайтесь к основам.

Maciej Los

Ральф, ты гений!

Suren97

Я обновил свой код, ты имеешь в виду вот так?

Ralf Meier

Нет... Я имела ввиду ОГ уже описал :
- вам не нужны разные методы рисования-вам нужен один метод рисования, который работает с переменной, а не с назначенной константой.
- если вы хотите изменить цвет, вам нужно только изменить назначение этой переменной (вместо использования 2-го метода).

Я бы не стал создавать своего рода "случайный цвет", потому что существует слишком много комбинаций, которые делают абсолютно бессмысленными цвета (что означает : цвета должны быть близко друг к другу или плохо видны на заднем плане).

Suren97

Как я могу изменить назначение этой переменной?

OriginalGriff

Ты ведь шутишь, правда?
Вы не знаете, как использовать оператор присваивания?

переменная = значение;

Suren97

А потом????????

OriginalGriff

А что потом?

Suren97

где я должен заявить об этом?

Suren97

в бальном классе?

Suren97

Я обновил свой код, вот так?

Ralf Meier

Да ... может быть, и так. Он будет менять цвет каждый раз, когда мяч снова рисуется ...

Но я бы не стал создавать случайные цвета-вы часто будете получать цвета, которые находятся рядом друг с другом или рядом с фоновым цветом ...

Suren97

Но мне нужно менять цвет шара,когда он сталкивается с краями формы, но в этом случае он постоянно меняется

Suren97

Как я могу сказать, что когда шар сталкивается по краям, то время меняет цвет

Ralf Meier

Я не проверял ваш код ...
Я полагаю, что у вас есть часть в вашем коде, которая проверяет столкновение и изменяет вектор.
В той позиции, где вы делаете этот расчет (и только там и только в этом случае), вы должны изменить цветовое назначение ... (и не в вашем методе розыгрыша).
Поскольку теперь вы используете переменную для своего цвета, а не константу, вы можете изменить ее значение везде, где вам нужно (внутри класса, где она определена).

Suren97

Я обновил свой код, вот так?

CPallini

5.