Sign in to follow this  
Fl4sh

Am I just retarded or what?

Recommended Posts

How did you guys learn directX?

While trying to learn directX, I'm coming upon a massive wall of frustration. All the learning resources seem to be incredibly convoluted and over-explained. The code samples go on and on with error checking (I have no idea yet what returns what so that's pointless).

Seriously, why do people put error checking in code meant to teach someone the basics? The student can look through the DX docs and implement their own error checking. Who agrees?

I'm in the process of making my own documentation that simply lays out the structures needed to do certain tasks (and a brief explanation) and leaves the rest to the user. That seems like the best thing....

Share this post


Link to post
Share on other sites
Error checking is the basics. I'd argue its vital for a beginner, who will almost certainly mess something up when they try to fit the code into their own program, and if there is no error checking they'll be left scratching their head wondering why it isn't working (at best).

The other thing to be aware of is that most of these "learning sources" are written by people who were in the learning process while writing them! These tutorials are poor because at the time of writing the author's understanding is often poor.

Share this post


Link to post
Share on other sites
Error checking is in many DX examples because:

1) almost all the examples where copied from a source that had them.
2) (devil's advocate) error checking is good, so a good example should use good coding practices.
3) DX's error checking mechanism is a little odd, especially to those who aren't used to that model (an inceasing portion of programmers)

but most importantly:

4) There's a lot that can go wrong setting up a context. The error checking provides you info about where things went wrong, how they went wrong so you can fix them. Otherwise you'll usually just get a black screen with no idea why it's not doing what you think it should.

Share this post


Link to post
Share on other sites
Quote:
Original post by Fl4sh
How did you guys learn directX?
A lot of trial and error, wasted time by jumping in at the deep end, and tinkering around with examples a lot.

Quote:
Original post by Fl4sh
Seriously, why do people put error checking in code meant to teach someone the basics? The student can look through the DX docs and implement their own error checking. Who agrees?
I strongly disagree. Mainly because if you copy an example and it has no error checking in it, and it doesn't work, you'll get a crash in your code and not know why. Or, worse, if you modify the code slightly and then it crashes and you don't know why.
If you know that error checking should be there, then it's fine - but most new users don't know that a particular function needs checked for errors. "What, you mean that if CreateDevice fails and I don't notice then it crashes? I thought it'd just not render anything" and similar reasoning.

Personally, I believe it's better to have a tutorial / example with source code linked, and include stubs for the error handling in the text itself, and put the "real" error handling (cleanup and displaying the error) in the source cod. That way, someone looks at the code and sees:

hResult = m_pD3D->CreateDevice(blah, foo, etc);
if(FAILED(hResult))
{
// Error handling
}

which isn't messy at all, and highlights that there needs to be error handling there. When they download the source code, they can see the full error handling code, and they can copy & paste as much as they want, and still keep the error handling code intact.

Share this post


Link to post
Share on other sites
Look for the sample where they create a window and render a blank screen. Then work on rendering just a triangle and take it from there. Also make sure you don't use the sample that uses the crappy helper library or you won't be able to figure out what's going on.

Share this post


Link to post
Share on other sites
Quote:
Original post by Fl4sh
Seriously, why do people put error checking in code meant to teach someone the basics?


Because error checking is important.

We're talking about the basics of DirectX here. You need to know a fair amount about programming in general first. Learn "the basics" of making a program work before trying to get 3D graphics working.

Share this post


Link to post
Share on other sites
I've noticed people in this forum are quite condescending. They always assume that the person asking the questions is a dunderhead. So please can you guys stop being elitists for once, I know you guys are good at coding and stuff but that doesn't give you the rights to be ***hats. This guy mentioned a general problem and everyone just seems to be demeaning his programming skills.

@OP: I agree with you man, I am still looking for that elusive DirectX book. I actually just gave up and started reading msdn documentation on DirectX. That actually seems to be more helpful than any book I've read on DirectX. I've also extensively searched the web for DirectX tutorials and after dabbling in it by myself for quite some time I now understand the basics. After you have learn the basics, then and only then can you pick up a DirectX book.

Share this post


Link to post
Share on other sites
Quote:
Original post by falconandeagle
I've noticed people in this forum are quite condescending. They always assume that the person asking the questions is a dunderhead. So please can you guys stop being elitists for once, I know you guys are good at coding and stuff but that doesn't give you the rights to be ***hats. This guy mentioned a general problem and everyone just seems to be demeaning his programming skills.

@OP: I agree with you man, I am still looking for that elusive DirectX book. I actually just gave up and started reading msdn documentation on DirectX. That actually seems to be more helpful than any book I've read on DirectX. I've also extensively searched the web for DirectX tutorials and after dabbling in it by myself for quite some time I now understand the basics. After you have learn the basics, then and only then can you pick up a DirectX book.


What do you expect us to say? Yup, learning DirectX sucks. It's hard. I spent tons of time on the net looking for stuff. That sucked.

And the part about error checking IS important.

I don't see elitism here. I see noobism/laziness/ignorance/helplessness but that's okay I guess...

Share this post


Link to post
Share on other sites
I'm not sure whose post you consider condescending... nothing I see as particularly offensive.

Further, it's not exactly unreasonable to assume that someone doesn't have a lot of programming skills who has posted in For Beginners...

Share this post


Link to post
Share on other sites
Quote:

I've noticed people in this forum are quite condescending. They always assume that the person asking the questions is a dunderhead. So please can you guys stop being elitists for once, I know you guys are good at coding and stuff but that doesn't give you the rights to be ***hats. This guy mentioned a general problem and everyone just seems to be demeaning his programming skills.

You're free to hold that opinion, but the way I see it people here are being concise. This isn't an emotional thing, it is a way of cutting out a lot of rendundant language and leaving the core message intact. It can be read as very blunt, almost on the cusp of being offensive at times, if you aren't used to the emotionless tone. A more detailed discussion.

Read the ideas in the post, and judge it on that. Any emotional tone you get from the message could be unintended, or misinterpreted.

I don't see any cases where anyone is demeaning his programming skills - just people emphasising the importance of error checking.

Share this post


Link to post
Share on other sites
Quote:
Original post by falconandeagle
I've noticed people in this forum are quite condescending. They always assume that the person asking the questions is a dunderhead. So please can you guys stop being elitists for once, I know you guys are good at coding and stuff but that doesn't give you the rights to be ***hats. This guy mentioned a general problem and everyone just seems to be demeaning his programming skills.

@OP: I agree with you man, I am still looking for that elusive DirectX book. I actually just gave up and started reading msdn documentation on DirectX. That actually seems to be more helpful than any book I've read on DirectX. I've also extensively searched the web for DirectX tutorials and after dabbling in it by myself for quite some time I now understand the basics. After you have learn the basics, then and only then can you pick up a DirectX book.


Nah I don't have a problem with anyone here lol. I just have a problem with DIRECTX... :D

But it took me all day just to setup a 800x600 window w/ a triangle in it.

It's finally starting to sink in that you have to do EVERYTHING with DirectX.

Share this post


Link to post
Share on other sites
Quote:
Original post by falconandeagle
I've noticed people in this forum are quite condescending. They always assume that the person asking the questions is a dunderhead. So please can you guys stop being elitists for once, I know you guys are good at coding and stuff but that doesn't give you the rights to be ***hats. This guy mentioned a general problem and everyone just seems to be demeaning his programming skills.

@OP: I agree with you man, I am still looking for that elusive DirectX book. I actually just gave up and started reading msdn documentation on DirectX. That actually seems to be more helpful than any book I've read on DirectX. I've also extensively searched the web for DirectX tutorials and after dabbling in it by myself for quite some time I now understand the basics. After you have learn the basics, then and only then can you pick up a DirectX book.


Nah I don't have a problem with anyone here lol. I just have a problem with DIRECTX... :D

But it took me all day just to setup a 800x600 window w/ a triangle in it.

It's finally starting to sink in that you have to do EVERYTHING with DirectX.

And also, what about .fx shader files? What can I do if I don't know that language?

Share this post


Link to post
Share on other sites
You'll have to learn it -- it's not terribly difficult, the syntax is superficially very C like and the concepts that underpin the language itself aren't too difficult. The SDK documentation isn't very good for learning about it, though, I've found -- it's one of the weaker areas.

Share this post


Link to post
Share on other sites
I bought several books on DX and every one of them stink. I eventually went to OpenGL and found the examples worked much better and is easier for me to understand. DX never seemed to make sense to me so I dropped it. Since I program for myself, I can do that kind of thing.

As far as error trapping, I like the style that shows the code without it first, then progress to the same code with error trapping. That way a learner can absorb the process better. Least it worked that way for me.

I think everyone feels somewhat retarded when they are learning any code from scratch. It's hard. ;-)

Share this post


Link to post
Share on other sites
Modified sample code:


//--------------------------------------------------------------------------------------
// File: Tutorial02.cpp
//
// This application displays a triangle using Direct3D 10
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//--------------------------------------------------------------------------------------
#include <windows.h>
#include <d3d10.h>
#include <d3dx10.h>
#include "resource.h"


//--------------------------------------------------------------------------------------
// Structures
//--------------------------------------------------------------------------------------
struct myVertex
{
D3DXVECTOR3 pos;
};

//--------------------------------------------------------------------------------------
// Global Variables
//--------------------------------------------------------------------------------------
HINSTANCE g_hInst = NULL;
HWND g_hWnd = NULL;
D3D10_DRIVER_TYPE g_driverType = D3D10_DRIVER_TYPE_NULL;
ID3D10Device* g_pd3dDevice = NULL;
IDXGISwapChain* g_pSwapChain = NULL;
ID3D10RenderTargetView* g_pRenderTargetView = NULL;
ID3D10Effect* g_pEffect = NULL;
ID3D10EffectTechnique* g_pTechnique = NULL;
ID3D10InputLayout* g_pVertexLayout = NULL;
ID3D10Buffer* g_pVertexBuffer = NULL;


//--------------------------------------------------------------------------------------
// Forward declarations
//--------------------------------------------------------------------------------------
HRESULT InitWindow( HINSTANCE hInstance, int nCmdShow );
HRESULT InitDevice();
void CleanupDevice();
LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM );
void Render();


//--------------------------------------------------------------------------------------
// Entry point to the program. Initializes everything and goes into a message processing
// loop. Idle time is used to render the scene.
//--------------------------------------------------------------------------------------
int WINAPI wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow )
{
UNREFERENCED_PARAMETER( hPrevInstance );
UNREFERENCED_PARAMETER( lpCmdLine );

if( FAILED( InitWindow( hInstance, nCmdShow ) ) )
return 0;

if( FAILED( InitDevice() ) )
{
CleanupDevice();
return 0;
}

// Main message loop
MSG msg = {0};
while( WM_QUIT != msg.message )
{
if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
else
{
Render();
}
}

CleanupDevice();

return ( int )msg.wParam;
}


//--------------------------------------------------------------------------------------
// Register class and create window
//--------------------------------------------------------------------------------------
HRESULT InitWindow( HINSTANCE hInstance, int nCmdShow )
{
// Register class
WNDCLASSEX wcex;
wcex.cbSize = sizeof( WNDCLASSEX );
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon( hInstance, ( LPCTSTR )IDI_TUTORIAL1 );
wcex.hCursor = LoadCursor( NULL, IDC_ARROW );
wcex.hbrBackground = ( HBRUSH )( COLOR_WINDOW + 1 );
wcex.lpszMenuName = NULL;
wcex.lpszClassName = L"TutorialWindowClass";
wcex.hIconSm = LoadIcon( wcex.hInstance, ( LPCTSTR )IDI_TUTORIAL1 );
if( !RegisterClassEx( &wcex ) )
return E_FAIL;

// Create window
g_hInst = hInstance;
RECT rc = { 0, 0, 640, 480 };
AdjustWindowRect( &rc, WS_OVERLAPPEDWINDOW, FALSE );
g_hWnd = CreateWindow( L"TutorialWindowClass", L"Direct3D 10 Tutorial 2: Rendering a Triangle",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, rc.right - rc.left, rc.bottom - rc.top, NULL, NULL, hInstance,
NULL );
if( !g_hWnd )
return E_FAIL;

ShowWindow( g_hWnd, nCmdShow );

return S_OK;
}


//--------------------------------------------------------------------------------------
// Create Direct3D device and swap chain
//--------------------------------------------------------------------------------------
HRESULT InitDevice()
{
HRESULT hr = S_OK;

RECT rc;
GetClientRect( g_hWnd, &rc );
UINT width = rc.right - rc.left;
UINT height = rc.bottom - rc.top;

UINT createDeviceFlags = 0;
#ifdef _DEBUG
createDeviceFlags |= D3D10_CREATE_DEVICE_DEBUG;
#endif

D3D10_DRIVER_TYPE driverTypes[] =
{
D3D10_DRIVER_TYPE_HARDWARE,
D3D10_DRIVER_TYPE_REFERENCE,
};
UINT numDriverTypes = sizeof( driverTypes ) / sizeof( driverTypes[0] );

DXGI_SWAP_CHAIN_DESC sd;
ZeroMemory( &sd, sizeof( sd ) );
sd.BufferCount = 1;
sd.BufferDesc.Width = width;
sd.BufferDesc.Height = height;
sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
sd.BufferDesc.RefreshRate.Numerator = 60;
sd.BufferDesc.RefreshRate.Denominator = 1;
sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
sd.OutputWindow = g_hWnd;
sd.SampleDesc.Count = 1;
sd.SampleDesc.Quality = 0;
sd.Windowed = TRUE;

for( UINT driverTypeIndex = 0; driverTypeIndex < numDriverTypes; driverTypeIndex++ )
{
g_driverType = driverTypes[driverTypeIndex];
hr = D3D10CreateDeviceAndSwapChain( NULL, g_driverType, NULL, createDeviceFlags,
D3D10_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice );
if( SUCCEEDED( hr ) )
break;
}
if( FAILED( hr ) )
return hr;

// Create a render target view
ID3D10Texture2D* pBuffer;
hr = g_pSwapChain->GetBuffer( 0, __uuidof( ID3D10Texture2D ), ( LPVOID* )&pBuffer );
if( FAILED( hr ) )
return hr;

hr = g_pd3dDevice->CreateRenderTargetView( pBuffer, NULL, &g_pRenderTargetView );
pBuffer->Release();
if( FAILED( hr ) )
return hr;

g_pd3dDevice->OMSetRenderTargets( 1, &g_pRenderTargetView, NULL );

// Setup the viewport
D3D10_VIEWPORT vp;
vp.Width = width;
vp.Height = height;
vp.MinDepth = 0.0f;
vp.MaxDepth = 1.0f;
vp.TopLeftX = 0;
vp.TopLeftY = 0;
g_pd3dDevice->RSSetViewports( 1, &vp );

// Create the effect
DWORD dwShaderFlags = D3D10_SHADER_ENABLE_STRICTNESS;
#if defined( DEBUG ) || defined( _DEBUG )
// Set the D3D10_SHADER_DEBUG flag to embed debug information in the shaders.
// Setting this flag improves the shader debugging experience, but still allows
// the shaders to be optimized and to run exactly the way they will run in
// the release configuration of this program.
dwShaderFlags |= D3D10_SHADER_DEBUG;
#endif
hr = D3DX10CreateEffectFromFile( L"Tutorial02.fx", NULL, NULL, "fx_4_0", dwShaderFlags, 0,
g_pd3dDevice, NULL, NULL, &g_pEffect, NULL, NULL );
if( FAILED( hr ) )
{
MessageBox( NULL,
L"The FX file cannot be located. Please run this executable from the directory that contains the FX file.", L"Error", MB_OK );
return hr;
}

// Obtain the technique
g_pTechnique = g_pEffect->GetTechniqueByName( "Render" );

// Define the input layout

D3D10_INPUT_ELEMENT_DESC myLayout[] =
{"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0,0, D3D10_INPUT_PER_VERTEX_DATA, 0,};

UINT numElements = sizeof( myLayout ) / sizeof( myLayout[0] );

// Create the input layout
D3D10_PASS_DESC myDesc;
g_pTechnique->GetPassByIndex(0)->GetDesc(&myDesc);
if ( FAILED(g_pd3dDevice->CreateInputLayout(myLayout, numElements, myDesc.pIAInputSignature, myDesc.IAInputSignatureSize, &g_pVertexLayout) ) )
return false;

// Set the input layout
g_pd3dDevice->IASetInputLayout( g_pVertexLayout );

// Create vertex buffer
myVertex vertices[] =
{
D3DXVECTOR3(0.0f, 0.0f, 1.0f),
D3DXVECTOR3(0.0f, 1.0f, 1.0f),
D3DXVECTOR3(1.0f, 1.0f, 1.0f),
D3DXVECTOR3(1.0f, 0.0f, 1.0f),
};

D3D10_BUFFER_DESC myBuffer;
myBuffer.ByteWidth = sizeof(myVertex) * 4;
myBuffer.Usage = D3D10_USAGE_DEFAULT;
myBuffer.BindFlags = D3D10_BIND_VERTEX_BUFFER;
myBuffer.CPUAccessFlags = 0;
myBuffer.MiscFlags = 0;

D3D10_SUBRESOURCE_DATA dat;
dat.pSysMem = vertices;

// Set vertex buffer
UINT stride = sizeof( myVertex );
UINT offset = 0;
g_pd3dDevice->IASetVertexBuffers( 0, 1, &g_pVertexBuffer, &stride, &offset );

// Set primitive topology
g_pd3dDevice->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST );

return S_OK;
}


//--------------------------------------------------------------------------------------
// Clean up the objects we've created
//--------------------------------------------------------------------------------------
void CleanupDevice()
{
if( g_pd3dDevice ) g_pd3dDevice->ClearState();

if( g_pVertexBuffer ) g_pVertexBuffer->Release();
if( g_pVertexLayout ) g_pVertexLayout->Release();
if( g_pEffect ) g_pEffect->Release();
if( g_pRenderTargetView ) g_pRenderTargetView->Release();
if( g_pSwapChain ) g_pSwapChain->Release();
if( g_pd3dDevice ) g_pd3dDevice->Release();
}


//--------------------------------------------------------------------------------------
// Called every time the application receives a message
//--------------------------------------------------------------------------------------
LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
{
PAINTSTRUCT ps;
HDC hdc;

switch( message )
{
case WM_PAINT:
hdc = BeginPaint( hWnd, &ps );
EndPaint( hWnd, &ps );
break;

case WM_DESTROY:
PostQuitMessage( 0 );
break;

default:
return DefWindowProc( hWnd, message, wParam, lParam );
}

return 0;
}


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

// Render a triangle
D3D10_TECHNIQUE_DESC techDesc;
g_pTechnique->GetDesc( &techDesc );
for( UINT p = 0; p < techDesc.Passes; ++p )
{
g_pTechnique->GetPassByIndex( p )->Apply( 0 );
g_pd3dDevice->Draw( 4, 0 );
}

// Present the information rendered to the back buffer to the front buffer (the screen)
g_pSwapChain->Present( 0, 0 );
}





.fx file:

//--------------------------------------------------------------------------------------
// File: Tutorial02.fx
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//--------------------------------------------------------------------------------------

//--------------------------------------------------------------------------------------
// Vertex Shader
//--------------------------------------------------------------------------------------
float4 VS( float4 Pos : POSITION ) : SV_POSITION
{
return Pos;
}


//--------------------------------------------------------------------------------------
// Pixel Shader
//--------------------------------------------------------------------------------------
float4 PS( float4 Pos : SV_POSITION ) : SV_Target
{
return float4( 1.0f, 1.0f, 0.0f, 1.0f ); // Yellow, with Alpha = 1
}


//--------------------------------------------------------------------------------------
technique10 Render
{
pass P0
{
SetVertexShader( CompileShader( vs_4_0, VS() ) );
SetGeometryShader( NULL );
SetPixelShader( CompileShader( ps_4_0, PS() ) );
}
}





Hey I have this code from the DX samples. When I try to draw a square instead of a triangle, nothing comes up...lol. I'm trying to figure out why...is it because of this shader file? If so, what's that language called so I can get some more info on it?

If not, what could be the problem. D:

Share this post


Link to post
Share on other sites
woot I made a square. :D


v[0] = vertex( D3DXVECTOR3(-2, 2,0), D3DXVECTOR4(1,0,0,1) );
v[1] = vertex( D3DXVECTOR3(2,2,0), D3DXVECTOR4(0,1,0,1) );
v[2] = vertex( D3DXVECTOR3(-2,-2,0), D3DXVECTOR4(0,0,1,1) );
v[3] = vertex( D3DXVECTOR3(2,-2,0), D3DXVECTOR4(0,1,0,1) );

pVertexBuffer->Unmap();

// Set primitive topology
pD3DDevice->IASetPrimitiveTopology( D3D10_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP );


Share this post


Link to post
Share on other sites
Here is how I learnt DirectX:
- Learned Win32
- Learnt GDI
- Wrote all major rendering algorithms, lines, ellipse, circles, ...
- Used DirectDraw (old) to rewrite all the above.
- Wrote a software renderer (the full 3d pipeline and a custom triangle rasterizer)
- After all the above, I started learning Direct9, how to initialize, load meshes,... start with the easiest Tiger Sample.

- Then started with animated (multianimation sample I think).
- Wrote a scenegraph engine, that loads and optimized the rendering.
- Moved to shaders and implemented several shaders into the engine.

Share this post


Link to post
Share on other sites
Quote:
Original post by Fl4sh
But it took me all day just to setup a 800x600 window w/ a triangle in it.


There's something called the Black Triangle effect or something. Can't google it because I'm overwhelmed by UFO stuff, but it's basically about a bunch of programmers going nuts and leaping around the room because they have a black triangle on the screen.

Non-technical producer type walks in and is confused by why a black triangle would cause such excitement.

Point is, it's a significant milestone - going from having nothing on the screen to having a triangle on the screen is a fundamental step forward.

Quote:
Original post by Fl4sh
woot I made a square. :D


See? Now put a texture on it. Then make a moving camera.

Only way to stay sane with this stuff is to take it all one tiny step at a time.

Share this post


Link to post
Share on other sites
I had an API class and learned a good deal from:

http://www.amazon.com/Beginning-Game-Programming-Jonathan-Harbour/dp/1435454278/ref=sr_1_5?s=books&ie=UTF8&qid=1292109528&sr=1-5

It covers the basic Sprite, Surface, DXFont objects, and gives some insight into getting them into a running program. It's not the best book in the world, there is some erroneous code, but the written portion describes most processes well.

Share this post


Link to post
Share on other sites
Quote:
Original post by Aardvajk
Quote:
Original post by Fl4sh
But it took me all day just to setup a 800x600 window w/ a triangle in it.

There's something called the Black Triangle effect or something. Can't google it because I'm overwhelmed by UFO stuff, but it's basically about a bunch of programmers going nuts and leaping around the room because they have a black triangle on the screen.

Here it is: The Black Triangle

(And excellent example in this case)

Share this post


Link to post
Share on other sites
Quote:
Original post by Servant of the Lord
Quote:
Original post by Aardvajk
Quote:
Original post by Fl4sh
But it took me all day just to setup a 800x600 window w/ a triangle in it.

There's something called the Black Triangle effect or something. Can't google it because I'm overwhelmed by UFO stuff, but it's basically about a bunch of programmers going nuts and leaping around the room because they have a black triangle on the screen.

Here it is: The Black Triangle

(And excellent example in this case)


Yay. Well done. All I could find was people claiming to have been abducted by aliens.

(Not disputing it BTW)

Share this post


Link to post
Share on other sites
Quote:
Original post by Fl4sh

But it took me all day just to setup a 800x600 window w/ a triangle in it.


Thats normal. It doesn't matter because its something you do once. Once you have it you can port that bit over to other projects. Then you start to think "Hmmm I could create a function or two called Start (or something) that does all that."

It may seem hard work, but its just the progression of programming. But once that first stone is layed.....you can take it with you for next time.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this