Uncategorized

Level Generation Tool

So I have been progressing with the new game idea for the last few months. I have only been able to work on it late nights, and that’s if I really feel up to it after working during the day. Anyways, enough with the complaining. More Game Development. So an update… an update… yes…….. WELL! Those that have seen on my google+ account, I have posted little pictures of my development progress…. There I talked a little about properly implementing my version of procedural level design. As there are, I am sure, many paths I could take in developing my “random” level generation. I have chosen a simple yet I feel elegant way about generating the “first bit” of the level. This being probably the first 2 minutes into the game. Then I will probably start generation again after a short period of that time has expired. Anyways, a picture would help with my explanation.

 

As this picture below is me prototyping, this isn’t exactly how the game will look in the end.

Random

This “screen picture” was taken after I had perfected “so far” the algorithm. I was needless to say happy about it. “But doug this is just one platform where are the other three??” Well my good friend, like I said, this was just prototyping. So I have now moved on to actually making all the chunks in the game that will populate my arrays! So I started doing this only to find that this was extremely slow. Like VERY slow. I would go into blender modeling tool. And… model away…. Yeah… after about a few hours of that I was like… This will take my forever! So me being lazy decided to make a tool that would allow me to model within my game engine. After a bit of research, and some frustration I have a working modeling tool, I made, that I am happy with. This way I can quickly break and spawn my special blocks in with just a simple click… Those familiar with minecraft will know what I am talking about. This method will speed up my workflow and make things more optimized! Which is a plus 😉 RIGHT?!

So I did make a video of this but am somewhat reluctant to post since I sound, well, tired and, groggy. Funny… it being 1 am or so when I did it. Okay okay, I’ll post it. Just below here. So anyways, now that I have this modeling tool going, the next step is making all of my platforms and then coding them to show up in a random fashion that makes the game fun and interesting! Then onto Hit detection and Raycasting of characters and such. I won’t give too much away. Enjoy.

Anyways, Questions? Ask them below. I’d be happy to answer them.

Advertisements

New Game Concept

So this is, again, the second time I am typing this. I think I might start typing stuff out in an external program, as I have lost two big posts to wordpresses web interface. Funny, I am still typing this in that interface. Maybe I am too lazy to even open such a program, as I would take me no time. Anyways, I am going to try and summarize this a bit more. Basically I had a strange idea come to mind right before I was to fall asleep about two weeks ago. I recorded this in my phone and then fell asleep. This idea was then later translated with the help of me drawing it into Photoshop the following day. This is basically the idea that I drew out.

It was to be a 3d third person runner… But not in the sense that most are used to. It would not be just on one plane. It would consist of platforms, as you can see in the picture. The character would avoid blocks and gaps by either moving on the platform jumping over them, or the funner part, is moving to another platform. This would be a fast paced game requiring some good reflexes. Anyways, I took this picture, and started working on a 3d engine and textured blocks to start the actual development of the game. I first created and textured one single block. Once that had taken place, I quickly decided, if I was to make an engine, to build levels in, I would need to make every combination of 3 section block capable. Once that was done, I decided to see how my simple start to my engine looked on a rendered out screen shot. This is what I have to date right now… Although I might need to do some optimization of the engine in some spots, other then that, I am quite happy with how this turned out so far. (refer to the picture below.)

Again as this is still quite early in development, this will most likely change considerably.
Anyways I hope to have more posts on this game as I continue development. Let me know what anyone thinks of the idea for this game. I don’t want to spoil much of the gameplay extras that I will be adding. So you’ll just have to stay tuned to find out more.

Doug.


Matrix Transformation

Well it’s been sometime since I posted. But I thought for those that are interested, I will post a random topic I have been working with. That would be as the title suggests transformation of object via matrix and vector math. So in general there are 3 basic transformations those include: translation, Rotation, and scaling. These are the three that move object through out 3D space. In addition to those, projection transformation is used to go from view space to projection space. The D3DX library contains APIs that can conveniently construct a matrix for many purposes such as translation, rotation, scaling, world-to-view transformation, view-to-projection transformation, etc. An application can then use these matrices to transform vertices in its scene. Conveniently for some an understanding of the math isn’t really required to do some basic stuff. The transformations I am doing will be as such.

So!

Translation

Translation refers to moving or displacing for a certain distance in space. In 3D, the matrix used for translation has the form

    1  0  0  0
    0  1  0  0
    0  0  1  0
    a  b  c  1

Rotation

Rotation refers to rotating vertices about an axis going through the origin. Three such axes are the X, Y, and Z axes in the space. An example in 2D would be rotating the vector [1 0] 90 degrees counter-clockwise. The result from the rotation is the vector [0 1]. The matrix used for rotating ΐ degrees clockwise about the Y axis looks like this:

    cosΐ  0  -sinΐ   0
     0    1     0    0
    sinΐ  0   cosΐ  0
     0    0     0    1

Scaling

Scaling refers to enlarging or shrinking the size of vector components along axis directions. For example, a vector can be scaled up along all directions or scaled down along the X axis only. To scale, we usually apply the scaling matrix below:

    p  0  0  0
    0  q  0  0
    0  0  r  0
    0  0  0  1

where p, q, and r are the scaling factor along the X, Y, and Z direction, respectively. The figure below shows the effect of scaling by 2 along the X axis and scaling by 0.5 along the Y axis.

These three I stated above can be multiplied with each other to combine their effect. This is where you can start to get certain effects and movements  that can get the idea you are trying to get across. I created three cubes in the directx sample I will show. The sample you’ll see will include 1 cube in the middle as a type of planet. and two smaller “moon” cubes orbiting in differing axis and speeds. I will show the main transformation source code below.

void Render()
{
// Update our time
static float t = 0.0f;
if( g_driverType == D3D10_DRIVER_TYPE_REFERENCE )
{
t += ( float )D3DX_PI * 0.0125f;
}
else
{
static DWORD dwTimeStart = 0;
DWORD dwTimeCur = GetTickCount();
if( dwTimeStart == 0 )
dwTimeStart = dwTimeCur;
t = ( dwTimeCur – dwTimeStart ) / 1000.0f;
}

// 1st Cube: Rotate around the origin
D3DXMatrixRotationY( &g_World1, t );

// 2nd Cube: Rotate around origin
D3DXMATRIX mTranslate;
D3DXMATRIX mXTranslate;
D3DXMATRIX mYOrbit;
D3DXMATRIX mXOrbit;
D3DXMATRIX mSpin;
D3DXMATRIX mScale;
D3DXMATRIX m3Scale;
D3DXMatrixRotationZ( &mSpin, -t );
D3DXMatrixRotationY( &mYOrbit, -t * 2 );
D3DXMatrixRotationX( &mXOrbit, -t * 4 );
D3DXMatrixTranslation( &mTranslate, -4.0f, 0.0f, 0.0f );
D3DXMatrixTranslation( &mXTranslate, 0.0f, 3.0f, 0.0f );
D3DXMatrixScaling( &mScale, 0.3f, 0.3f, 0.3f );
D3DXMatrixScaling( &m3Scale, 0.2f, 0.2f, 0.2f );

D3DXMatrixMultiply( &g_World2, &mScale, &mSpin );
D3DXMatrixMultiply( &g_World2, &g_World2, &mTranslate );
D3DXMatrixMultiply( &g_World2, &g_World2, &mYOrbit );

//3rd cube
D3DXMatrixMultiply( &g_World3, &mSpin, &m3Scale );
D3DXMatrixMultiply( &g_World3, &g_World3, &mXTranslate );
D3DXMatrixMultiply( &g_World3, &g_World3, &mXOrbit );
// D3DXMatrixMultiply( &g_World3, &g_World3, &mYOrbit );

//
// Clear the back buffer
//
float ClearColor[4] = { 0.0f, 0.0f, 0.0f, 1.0f }; //red, green, blue, alpha
g_pd3dDevice->ClearRenderTargetView( g_pRenderTargetView, ClearColor );

//
// Clear the depth buffer to 1.0 (max depth)
//
g_pd3dDevice->ClearDepthStencilView( g_pDepthStencilView, D3D10_CLEAR_DEPTH, 1.0f, 0 );

//
// Update variables for the first cube
//
g_pWorldVariable->SetMatrix( ( float* )&g_World1 );
g_pViewVariable->SetMatrix( ( float* )&g_View );
g_pProjectionVariable->SetMatrix( ( float* )&g_Projection );

//
// Render the first cube
//
D3D10_TECHNIQUE_DESC techDesc;
g_pTechnique->GetDesc( &techDesc );
for( UINT p = 0; p < techDesc.Passes; ++p )
{
g_pTechnique->GetPassByIndex( p )->Apply( 0 );
g_pd3dDevice->DrawIndexed( 36, 0, 0 );
}

//
// Update variables for the second cube
//
g_pWorldVariable->SetMatrix( ( float* )&g_World2 );
g_pViewVariable->SetMatrix( ( float* )&g_View );
g_pProjectionVariable->SetMatrix( ( float* )&g_Projection );

//
// Render the second cube
//
for( UINT p = 0; p < techDesc.Passes; ++p )
{
g_pTechnique->GetPassByIndex( p )->Apply( 0 );
g_pd3dDevice->DrawIndexed( 36, 0, 0 );
}

//
// Update variables for the third cube
//
g_pWorldVariable->SetMatrix( ( float* )&g_World3 );
g_pViewVariable->SetMatrix( ( float* )&g_View );
g_pProjectionVariable->SetMatrix( ( float* )&g_Projection );

//
// Render the third cube
//
for( UINT p = 0; p < techDesc.Passes; ++p )
{
g_pTechnique->GetPassByIndex( p )->Apply( 0 );
g_pd3dDevice->DrawIndexed( 36, 0, 0 );
}

//
// Present our back buffer to our front buffer
//
g_pSwapChain->Present( 0, 0 );
}

Any comments would be appreciated.

Thanks for reading.

Doug.