Right now, I have the following code:
Game1.cs
Code: Select all
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using Microsoft.Xna.Framework.Net;
using Microsoft.Xna.Framework.Storage;
using BEPUphysics;
using BEPUphysics.Entities;
using BEPUphysics.DataStructures;
namespace Sjomsites___Worlds
{
/// <summary>
/// This is the main type for your game
/// </summary>
public class Game1 : Microsoft.Xna.Framework.Game
{
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
Matrix worldMatrix;
Matrix cameraMatrix;
Matrix projectionMatrix;
float angle = 0f;
Space space;
BasicEffect cubeEffect;
BasicShape cube = new BasicShape(new Vector3(2, 2, 2), new Vector3(0, 0, 0));
public Game1()
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
}
/// <summary>
/// Allows the game to perform any initialization it needs to before starting to run.
/// This is where it can query for any required services and load any non-graphic
/// related content. Calling base.Initialize will enumerate through any components
/// and initialize them as well.
/// </summary>
protected override void Initialize()
{
initializeWorld();
base.Initialize();
}
/// <summary>
/// LoadContent will be called once per game and is the place to load
/// all of your content.
/// </summary>
protected override void LoadContent()
{
// Create a new SpriteBatch, which can be used to draw textures.
spriteBatch = new SpriteBatch(GraphicsDevice);
//cube.shapeTexture = Content.Load<Texture2D>("Textures\\100x100 SM Icon");
// Instantiate the Space Variable
space = new Space();
// Set the gravity variable in the space variable to a more realistic standard
space.simulationSettings.motionUpdate.gravity = new Vector3(0, -9.81f, 0);
}
/// <summary>
/// UnloadContent will be called once per game and is the place to unload
/// all content.
/// </summary>
protected override void UnloadContent()
{
// TODO: Unload any non ContentManager content here
}
/// <summary>
/// Allows the game to run logic such as updating the world,
/// checking for collisions, gathering input, and playing audio.
/// </summary>
/// <param name="gameTime">Provides a snapshot of timing values.</param>
protected override void Update(GameTime gameTime)
{
// Allows the game to exit
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
angle += 0.5f;
base.Update(gameTime);
}
/// <summary>
/// This is called when the game should draw itself.
/// </summary>
/// <param name="gameTime">Provides a snapshot of timing values.</param>
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
cubeEffect.Begin();
worldMatrix = Matrix.CreateRotationY(MathHelper.ToRadians(angle)) *
Matrix.CreateRotationX(MathHelper.ToRadians(angle));
cubeEffect.World = worldMatrix;
foreach (EffectPass pass in cubeEffect.CurrentTechnique.Passes)
{
pass.Begin();
cubeEffect.Texture = cube.shapeTexture;
cube.RenderShape(GraphicsDevice);
pass.End();
}
cubeEffect.End();
base.Draw(gameTime);
}
public void initializeWorld()
{
cameraMatrix = Matrix.CreateLookAt(
new Vector3(0, 30, 20), new Vector3(0, 0, 0), new Vector3(0, 1, 0));
projectionMatrix = Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4,
Window.ClientBounds.Width / Window.ClientBounds.Height, 1.0f, 50.0f);
float tilt = MathHelper.ToRadians(22.5f);
worldMatrix = Matrix.CreateRotationX(tilt) * Matrix.CreateRotationY(tilt);
cubeEffect = new BasicEffect(graphics.GraphicsDevice, null);
cubeEffect.World = worldMatrix;
cubeEffect.View = cameraMatrix;
cubeEffect.Projection = projectionMatrix;
cubeEffect.TextureEnabled = true;
}
}
}
BasicShape.cs
Code: Select all
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using Microsoft.Xna.Framework.Net;
using Microsoft.Xna.Framework.Storage;
using BEPUphysics;
using BEPUphysics.Entities;
using BEPUphysics.DataStructures;
namespace Sjomsites___Worlds
{
class BasicShape
{
public Vector3 shapeSize;
public Vector3 shapePosition;
private StaticTriangleGroup.StaticTriangleGroupVertex[] shapeVertices;
private int shapeTriangles;
private VertexBuffer shapeBuffer;
public Texture2D shapeTexture;
public TriangleMesh shapeMesh;
public StaticTriangleGroup shapeGroup;
public BasicShape(Vector3 size, Vector3 position)
{
shapeSize = size;
shapePosition = position;
}
private void BuildShape()
{
shapeTriangles = 12;
shapeVertices = new StaticTriangleGroup.StaticTriangleGroupVertex[36];
Vector3 topLeftFront = shapePosition +
new Vector3(-1.0f, 1.0f, -1.0f) * shapeSize;
Vector3 bottomLeftFront = shapePosition +
new Vector3(-1.0f, -1.0f, -1.0f) * shapeSize;
Vector3 topRightFront = shapePosition +
new Vector3(1.0f, 1.0f, -1.0f) * shapeSize;
Vector3 bottomRightFront = shapePosition +
new Vector3(1.0f, -1.0f, -1.0f) * shapeSize;
Vector3 topLeftBack = shapePosition +
new Vector3(-1.0f, 1.0f, 1.0f) * shapeSize;
Vector3 topRightBack = shapePosition +
new Vector3(1.0f, 1.0f, 1.0f) * shapeSize;
Vector3 bottomLeftBack = shapePosition +
new Vector3(-1.0f, -1.0f, 1.0f) * shapeSize;
Vector3 bottomRightBack = shapePosition +
new Vector3(1.0f, -1.0f, 1.0f) * shapeSize;
Vector3 frontNormal = new Vector3(0.0f, 0.0f, 1.0f) * shapeSize;
Vector3 backNormal = new Vector3(0.0f, 0.0f, -1.0f) * shapeSize;
Vector3 topNormal = new Vector3(0.0f, 1.0f, 0.0f) * shapeSize;
Vector3 bottomNormal = new Vector3(0.0f, -1.0f, 0.0f) * shapeSize;
Vector3 leftNormal = new Vector3(-1.0f, 0.0f, 0.0f) * shapeSize;
Vector3 rightNormal = new Vector3(1.0f, 0.0f, 0.0f) * shapeSize;
Vector2 textureTopLeft = new Vector2(0.5f * shapeSize.X, 0.0f * shapeSize.Y);
Vector2 textureTopRight = new Vector2(0.0f * shapeSize.X, 0.0f * shapeSize.Y);
Vector2 textureBottomLeft = new Vector2(0.5f * shapeSize.X, 0.5f * shapeSize.Y);
Vector2 textureBottomRight = new Vector2(0.0f * shapeSize.X, 0.5f * shapeSize.Y);
// Front face.
shapeVertices[0] = new StaticTriangleGroup.StaticTriangleGroupVertex(
topLeftFront);
shapeVertices[1] = new StaticTriangleGroup.StaticTriangleGroupVertex(
bottomLeftFront);
shapeVertices[2] = new StaticTriangleGroup.StaticTriangleGroupVertex(
topRightFront);
shapeVertices[3] = new StaticTriangleGroup.StaticTriangleGroupVertex(
bottomLeftFront);
shapeVertices[4] = new StaticTriangleGroup.StaticTriangleGroupVertex(
bottomRightFront);
shapeVertices[5] = new StaticTriangleGroup.StaticTriangleGroupVertex(
topRightFront);
// Back face.
shapeVertices[6] = new StaticTriangleGroup.StaticTriangleGroupVertex(
topLeftBack);
shapeVertices[7] = new StaticTriangleGroup.StaticTriangleGroupVertex(
topRightBack);
shapeVertices[8] = new StaticTriangleGroup.StaticTriangleGroupVertex(
bottomLeftBack);
shapeVertices[9] = new StaticTriangleGroup.StaticTriangleGroupVertex(
bottomLeftBack);
shapeVertices[10] = new StaticTriangleGroup.StaticTriangleGroupVertex(
topRightBack);
shapeVertices[11] = new StaticTriangleGroup.StaticTriangleGroupVertex(
bottomRightBack);
// Top face.
shapeVertices[12] = new StaticTriangleGroup.StaticTriangleGroupVertex(
topLeftFront);
shapeVertices[13] = new StaticTriangleGroup.StaticTriangleGroupVertex(
topRightBack);
shapeVertices[14] = new StaticTriangleGroup.StaticTriangleGroupVertex(
topLeftBack);
shapeVertices[15] = new StaticTriangleGroup.StaticTriangleGroupVertex(
topLeftFront);
shapeVertices[16] = new StaticTriangleGroup.StaticTriangleGroupVertex(
topRightFront);
shapeVertices[17] = new StaticTriangleGroup.StaticTriangleGroupVertex(
topRightBack);
// Bottom face.
shapeVertices[18] = new StaticTriangleGroup.StaticTriangleGroupVertex(
bottomLeftFront);
shapeVertices[19] = new StaticTriangleGroup.StaticTriangleGroupVertex(
bottomLeftBack);
shapeVertices[20] = new StaticTriangleGroup.StaticTriangleGroupVertex(
bottomRightBack);
shapeVertices[21] = new StaticTriangleGroup.StaticTriangleGroupVertex(
bottomLeftFront);
shapeVertices[22] = new StaticTriangleGroup.StaticTriangleGroupVertex(
bottomRightBack);
shapeVertices[23] = new StaticTriangleGroup.StaticTriangleGroupVertex(
bottomRightFront);
// Left face.
shapeVertices[24] = new StaticTriangleGroup.StaticTriangleGroupVertex(
topLeftFront);
shapeVertices[25] = new StaticTriangleGroup.StaticTriangleGroupVertex(
bottomLeftBack);
shapeVertices[26] = new StaticTriangleGroup.StaticTriangleGroupVertex(
bottomLeftFront);
shapeVertices[27] = new StaticTriangleGroup.StaticTriangleGroupVertex(
topLeftBack);
shapeVertices[28] = new StaticTriangleGroup.StaticTriangleGroupVertex(
bottomLeftBack);
shapeVertices[29] = new StaticTriangleGroup.StaticTriangleGroupVertex(
topLeftFront);
// Right face.
shapeVertices[30] = new StaticTriangleGroup.StaticTriangleGroupVertex(
topRightFront);
shapeVertices[31] = new StaticTriangleGroup.StaticTriangleGroupVertex(
bottomRightFront);
shapeVertices[32] = new StaticTriangleGroup.StaticTriangleGroupVertex(
bottomRightBack);
shapeVertices[33] = new StaticTriangleGroup.StaticTriangleGroupVertex(
topRightBack);
shapeVertices[34] = new StaticTriangleGroup.StaticTriangleGroupVertex(
topRightFront);
shapeVertices[35] = new StaticTriangleGroup.StaticTriangleGroupVertex(
bottomRightBack);
int[] indicies = new int[6];
indicies[0] = 1;
indicies[1] = 2;
indicies[2] = 3;
indicies[3] = 4;
indicies[4] = 5;
indicies[5] = 6;
shapeMesh = new TriangleMesh(shapeVertices, indicies);
shapeGroup = new StaticTriangleGroup(shapeMesh);
}
public void RenderShape(GraphicsDevice device, Space space)
{
BuildShape();
space.add(shapeGroup);
}
}
}
What I'm trying to accomplish here is to be able to create primitives and let the Physics system do the work from there. I need the easiest method as possible to do this, and if you have to explain something, please say it like you're explaining it to a 3 year old. I'm trying to make a game with building blocks essentially, where the game loads an XML file with all the properties, and then builds the map accordingly. So primitives are going to be a big necessity in this situation.
Any help would be great.