Beispiel #1
0
        public MyModel3D AddCircle(float x, float y, float radius, float angle, float density,
                                   float friction, float restetution)
        {
            MyModel3D model = new MyModel3D(models, x, -y, 0, Environment.CurrentDirectory + "\\" + PATH_CIRCLE, new System.Windows.Size(radius * 2, radius * 2));

            BodyDef bDef = new BodyDef();

            bDef.Position.Set(x, y);
            bDef.Angle = angle;

            CircleDef pDef = new CircleDef();

            pDef.Restitution = restetution;
            pDef.Friction    = friction;
            pDef.Density     = density;
            pDef.Radius      = radius;

            Body body = world.CreateBody(bDef);

            body.CreateShape(pDef);
            body.SetMassFromShapes();

            body.SetUserData(model);

            return(model);
        }
Beispiel #2
0
        public MyModel3D AddBox(float x, float y, float w, float h, float density, float friction, float restetution, string texture)
        {
            // Создается наша графическая модель
            MyModel3D model = new MyModel3D(models, x, -y, 0, Environment.CurrentDirectory + "\\" + $@"Assets\{texture}.png" /*PATH_RECT*/, new System.Windows.Size(w, h));
            // Необходим для установи позиции, поворота, различных состояний и т.д. Советую поюзать свойства этих объектов
            BodyDef bDef = new BodyDef();

            bDef.Position.Set(x + w, y + h);
            bDef.Angle = 0;
            // Наш полигон который описывает вершины
            PolygonDef pDef = new PolygonDef();

            pDef.Restitution = restetution;
            pDef.Friction    = friction;
            pDef.Density     = density;
            pDef.SetAsBox(w / 2, h / 2);
            // Создание самого тела
            Body body = world.CreateBody(bDef);

            //body.ApplyForce(force, body.GetWorldCenter());
            body.CreateShape(pDef);
            body.SetMassFromShapes();
            body.SetUserData(model);             // Это отличная функция, она на вход принемает объекты типа object, я ее использовал для того чтобы запихнуть и хранить в ней нашу графическую модель, и в методе step ее доставать и обновлять

            return(model);
        }
Beispiel #3
0
        public MainWindow()
        {
            InitializeComponent();
            Assembly assembly = Assembly.LoadFrom("Box2DX.dll");

            Trace.WriteLine(assembly.GetName().Name + " " + assembly.GetName().Version);
            MainViewModel = new MainViewModel();
            DataContext   = MainViewModel;
            LoadConfig("user.cfg");

            /*Grid.SetColumnSpan(console, 2);
             * Grid.SetRowSpan(console, 6);
             * gridok.Children.Add(console);*/
            gridok.Background = new ImageBrush(new BitmapImage(new Uri($@"{Directory.GetCurrentDirectory()}{PATH_TEX}")));

            Trace.WriteLine($"Loading texture: {PATH_TEX}");
            px = new Physics(-1000, -1000, 1000, 1000, 0, -0.005f, false);
            px.SetModelsGroup(models);
            px.AddBox(-3, 0, 1, 1, 0.5f, 0.3f, 0.2f, "wooden_box");
            p           = px.AddBox(0, 0, 1, 1, 0.5f, 0.3f, 0.2f, "rect");
            p.name      = "player";
            ground      = px.AddBox(-9, -2, 9, 0.25f, 0, 1.0f, 0.2f, "rect");
            ground.name = "ground";

            //plr_pos = player.GetPosition();
            this.LayoutUpdated += MainWindow_LayoutUpdated;
            //this.KeyDown += MainWindow_KeyDown;
            //console.Inlines.Add("Hello world!\n");
            //console.Inlines.Add($"{p.GetPosition().ToString()}\n");
            //console.Inlines.Add($"{px.world.GetBodyList().GetNext().GetPosition().Y}\n");

            //console.Inlines.Add($"{player.GetPosition().ToString()}\n");
            solver = new Solver();
            px.SetSolver(solver);
            solver.OnAdd += (model1, model2) =>
            {
                // Произошло столкновение тел model1 и model2
                if (model1.name == "player" && model2.name == "ground")
                {
                    isJump = false;
                    //console.Inlines.Add("Произошло столкновение тел model1 и model2\n");
                    //console.Inlines.Add($"{p.GetPosition().ToString()}\n");
                    //console.Inlines.Add($"{px.world.GetBodyList().GetNext().GetPosition().Y}\n");
                }
            };
        }
Beispiel #4
0
        public void Step(float dt, int iterat)
        {
            // Параметры этого метода управляют временем мира и точностью обработки коллизий тел
            world.Step(dt / 1000.0f, iterat, iterat);

            for (Body list = world.GetBodyList(); list != null; list = list.GetNext())
            {
                if (list.GetUserData() != null)
                {
                    System.Windows.Media.Media3D.Vector3D position = new System.Windows.Media.Media3D.Vector3D(
                        list.GetPosition().X, list.GetPosition().Y, 0);
                    float     angle = list.GetAngle() * 180.0f / (float)System.Math.PI;        // Выполняем конвертацию из градусов в радианы
                    MyModel3D model = (MyModel3D)list.GetUserData();
                    model.SetPosition(position);                                               // Перемещаем нашу графическую модель по x,y
                    model.Rotation(new System.Windows.Media.Media3D.Vector3D(0, 0, 1), angle); // Вращаем по координате x
                }
            }
        }