Matt Shick Ответов: 2

Велоспорт картинку в элемент управления PictureBox


Я возился с c# и пытаюсь сделать игровой автомат. Я уже все выяснил, но прямо сейчас у меня есть 3 коробки с картинками, и программа выбирает, какую картинку положить в каждую из них случайным образом. Я бы очень хотел, чтобы графические коробки циклически перебирали каждый из возможных символов, как настоящий игровой автомат, но я не знаю кода для этого. Это таймер? Или что-то еще?

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

Все что я могу получить это когда вы нажимаете кнопку вращения она помещает картинку в каждый PictureBox но я не могу заставить ее вращаться

rmksiva

Не могли бы вы показать нам существующий кодовый блок ?

Ralf Meier

Я думаю, что использование PictureBox для этого - неправильный подход, но, конечно, если вам нужна доска, вы можете получить ее из кирпича ...
Я предлагаю вам создать свой собственный пользовательский элемент управления. Этот элемент управления должен быть в состоянии содержать все необходимые изображения/Изображения. В этом элементе управления вы переопределяете метод OnPaint-method, чтобы создать желаемое поведение.

________________

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

BillWoodruff

"Winform не подходит для графических презентаций. Используйте WPF."

Для того, что описано здесь, WinForms, безусловно, можно использовать.

________________

Топикастер хочет сделать игру. Игры на winforms - выглядели ужасно, и всегда отличались чистой производительностью.
Когда вы используете даже стандартные элементы управления WPF - с простым добавлением теней и закругленными углами - вы будете иметь современный вид и плавное движение. Переопределить "OnPaint" управления Winform и нарисовать что - то адекватное на экране- гораздо сложнее.

Ralf Meier

Простите, но я согласен с Биллом. До сих пор для меня я не нашел ничего, что существует в WPF и не может быть сделано также в формах.
То же самое относится и к этому вопросу - трудность заключается не в том, чтобы создать этот элемент управления - реальная трудность заключается в создании свойства, которое обрабатывает и управляет изображениями, которые должны быть прокручены ...

________________

Поверьте, у меня было такое же мнение - потому что мой опыт работы в Winform и устаревшие требования к графическому интерфейсу (нажмите кнопку - см. таблицу). Вы измените свое мнение, когда ваш уровень знаний Winform и WPF станет сопоставимым.

2 Ответов

Рейтинг:
2

________________

WPF - 20 минут работы:

код XAML:

<Window x:Class="WpfApplicationRollerImage.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <StackPanel x:Name="Roller" HorizontalAlignment="Left" Height="281" Margin="175,19,0,0" VerticalAlignment="Top" Width="125">
            <StackPanel.Background>
                <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                    <GradientStop Color="Black" Offset="0"/>
                    <GradientStop Color="White" Offset="1"/>
                </LinearGradientBrush>
            </StackPanel.Background>
        </StackPanel>
        <Button Content="Roll!" HorizontalAlignment="Left" Margin="377,278,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click"/>

    </Grid>
</Window>


С фоновым кодом:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApplicationRollerImage
{
	/// <summary>
	/// Interaction logic for MainWindow.xaml
	/// </summary>
	public partial class MainWindow : Window
	{
		public MainWindow()
		{
			InitializeComponent();
		}
		int indexToPaint = 0;
		private void Button_Click(object sender, RoutedEventArgs e)
		{
			if(Roller.Children.Count > 2)//no nore than 3 images!
			{
				Roller.Children.RemoveAt(0);
			}
			Image nextImage = new Image();

			
			switch (indexToPaint)
			{
				case 0:
				 
				nextImage.Source = new BitmapImage( new Uri(@"D:\Xlam\WpfApplicationRollerImage\NumOnePicture.bmp"));
				break;
				case 1:
				
				nextImage.Source = new BitmapImage( new Uri(@"D:\Xlam\WpfApplicationRollerImage\NumTwoPicture.bmp"));
				break;
				case 2:				 
				nextImage.Source = new BitmapImage( new Uri(@"D:\Xlam\WpfApplicationRollerImage\NumThreePicture.bmp"));
				break;
				case 3:				 
				nextImage.Source = new BitmapImage( new Uri(@"D:\Xlam\WpfApplicationRollerImage\NumOnePicture.bmp"));
				indexToPaint = 0;
				break;
			}
			indexToPaint++;
			this.Roller.Children.Add(nextImage);
			

		}
	}
}

Добавьте свои картинки, и любая логика картинок рулонится, подумайте о добавлении поведения (медленный Мутон перед исчезновением)... :-)


BillWoodruff

В этом коде нет ничего, что контролировало бы скорость, с которой показываются изображения.

Рейтинг:
1

BillWoodruff

Вот набросок, который у меня есть намеренно оставленный незавершенным, с целью дать вам некоторые идеи. Рассмотрим, что вам нужно сделать в цикле ' while в обработчике событий Timer OnClick.

private readonly Dictionary<PictureBox, List<Image>> PBToImage = new Dictionary<PictureBox, List<Image>>();

private readonly Random rand = new Random();

private List<int> outCome = new List<int>();

private const int SlotCount = 3;
private const int PicturesPerSlotCount = 5;
private const int SpinCount = 4;
private const int SpinSpeed = 400;

private int currentSpinCount = 0;

private void Form1_Load(object sender, EventArgs e)
{
    timer1.Interval = SpinSpeed;
    timer1.Tick += Timer1OnTick;
}

private void Timer1OnTick(object sender, EventArgs eventArgs)
{
    while (currentSpinCount < SpinCount)
    {
        // left for you to write
    }

    timer1.Stop();
    timer1.Enabled = false;

    SetResult();
}

private void MakeNewOutCome()
{
    outCome.Clear();

    for (int i = 0; i < SlotCount; i++)
    {
        outCome.Add(rand.Next(PicturesPerSlotCount));
    }
}



private void Spin()
{
    MakeNewOutCome();

    currentSpinCount = 0;

    timer1.Enabled = true;
    timer1.Start();
}

private void SetResult()   // set the result
{
    int ndx = 0;

    foreach (var pbtoimagelist in PBToImage)
    {
        pbtoimagelist.Key.Image = pbtoimagelist.Value[outCome[ndx++]];
    }
}