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); }
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); }
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"); } }; }
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 } } }