Эллипс C # WPF, подпрыгивающий на прямоугольнике

#c# #wpf

#c# #wpf

Вопрос:

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

 <Window x:Class="PongSolo.Game"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:PongSolo"
        mc:Ignorable="d"
        Title="Game" Height="450" Width="650" Closing="Game_Closing" WindowStartupLocation="CenterScreen" Loaded="Window_Loaded">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition></ColumnDefinition>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition></RowDefinition>
            <RowDefinition Height="5*"></RowDefinition>
        </Grid.RowDefinitions>
        <Border Name="superBorder" BorderBrush="Black" BorderThickness="10" Grid.Row="1">
            <Canvas Name="superCanvas">
                <Rectangle x:Name="superRect" Fill="Blue" Width="100" Height="15" Canvas.Bottom="0" Canvas.Left="0"/>
                <Ellipse x:Name="superElly" Fill="Purple" Width="20" Height="20" Grid.Row="1" Canvas.Top="0" Canvas.Left="0"/>
            </Canvas>
        </Border>
        <Label Content="Punteggio:" FontWeight="Bold" FontSize="20" Grid.Row="0"/>
        <Label Content="0" Name="scoreLabel" FontWeight="Bold" FontSize="20" Grid.Row="0" Margin="119,0,-119,0"/>
       
    </Grid>
</Window>
 
 using System;
using System.Collections.Generic;
using System.Linq;
using System.Media;
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.Shapes;
using System.Windows.Threading;

namespace PongSolo
{
    /// <summary>
    /// Logica di interazione per Game.xaml
    /// </summary>
    public partial class Game : Window
    {
        SoundPlayer sound = new System.Media.SoundPlayer(Environment.CurrentDirectory "/Resources/bgm_new.wav");
        DispatcherTimer playerDispatcher = new DispatcherTimer();
        DispatcherTimer ballDispatcher = new DispatcherTimer();

        int score = 0;

        double startxspeed = 4;
        double startyspeed = 4;
        public Game()
        {
            InitializeComponent();
            playerDispatcher.Interval = TimeSpan.FromMilliseconds(10);
            ballDispatcher.Interval = TimeSpan.FromMilliseconds(10);
            ballDispatcher.Tick  = ballMovement;
            playerDispatcher.Tick  = playerMovement;
            playerDispatcher.Start();
            ballDispatcher.Start();
        }

        private void ballMovement(object sender, EventArgs e)
        {
            double xspeed = Canvas.GetLeft(superElly)   startxspeed;
            double yspeed = Canvas.GetTop(superElly)   startyspeed;
        
               //Ball collision with rectangle
                if(/*bouncing statement*/)
                {
                    score  ;
                    scoreLabel.Content = score.ToString();
                    startyspeed *= -1;
                }


            //up collision
            if (yspeed < (superCanvas.ActualHeight - (superElly.ActualHeight / 2)) amp;amp; yspeed > 0)
                Canvas.SetTop(superElly, yspeed);
            else
            {
                startyspeed *= -1;
            }
                

            //down collision
            if(yspeed >= (superCanvas.ActualHeight - (superElly.ActualHeight/2)) amp;amp; yspeed >0)
            {
                playerDispatcher.Stop();
                ballDispatcher.Stop();
            }

            //lateral collision
            if (xspeed < (superCanvas.ActualWidth - (superElly.ActualWidth / 2   10)) amp;amp; xspeed > 0)
                Canvas.SetLeft(superElly, xspeed);
            else
            {
                startxspeed *= -1;
            }
               
        }

        private void playerMovement(object sender, EventArgs e)
        {
            double xvalue = Canvas.GetLeft(superRect)   3;

            if (Keyboard.IsKeyDown(Key.Left))
            {
                if (!outOfBoundaries("left"))
                    MovePlayerLeft();
            }              
            if (Keyboard.IsKeyDown(Key.Right))
            {
                if (!outOfBoundaries("right"))
                    MovePlayerRight();
            }                   
        }

        public bool outOfBoundaries(string s)
        {
            bool is_out_of_boundaries = false;
            switch (s)
            {
                case "left":
                    {
                        if (Canvas.GetLeft(superRect) <= 0)
                            is_out_of_boundaries = true;
                        break;
                    }                 
                case "right":
                    {
                        if (Canvas.GetLeft(superRect) >= superCanvas.ActualWidth-superRect.Width)
                            is_out_of_boundaries = true;
                        break;
                    }
                    
                default:
                    break;
            }
            return is_out_of_boundaries;
        }

        private void MovePlayerRight()
        {
            Canvas.SetLeft(superRect, Canvas.GetLeft(superRect)   5);
        }

        private void MovePlayerLeft()
        {
            Canvas.SetLeft(superRect, Canvas.GetLeft(superRect) - 5);
        }

        private void Game_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            App.Current.Shutdown();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            this.MinHeight = 300;
            this.MinWidth = 300;
            PlayMusic();
        }

        private void PlayMusic()
        {   
            sound.PlayLooping();
        }
    }
}

 

Комментарии:

1. Я думаю, вам нужно разбить эту проблему на части. Сначала вам понадобится расположение и скорость задействованных объектов. Тогда вам понадобится некоторое обнаружение столкновений. После этого вы сможете применить физику для изменения скорости задействованных объектов. Кстати; Я считаю, что Unity3D имеет множество этих функций из коробки.

2. У меня есть только возможность использовать Visual Studio, я не могу использовать Unity

3. Хорошо, тогда, тем не менее: я считаю, что вам следует начать с разбиения проблемы на части и спросить о первой проблеме, с которой вы столкнулись. На данный момент довольно сложно ответить — возможно, но нелегко.

4. на самом деле это моя единственная проблема, потому что я не знаю, что делать

5. Как я уже сказал; начните с движения: сначала вам понадобится задействованное позиционирование объектов и скорость. Тогда вам понадобится некоторое обнаружение столкновений. После этого вы сможете применить физику для изменения скорости задействованных объектов.