ryan mccabe

  • Content count

  • Joined

  • Last visited

Community Reputation

161 Neutral

About ryan mccabe

  • Rank
  1. Unity space game engine advice

    I'm looking to make a mission based rts. It'll revolve around taking down an established regional power starting with a coup on board a main carrier. Fidelity wise Im aiming for star conflict / eve online levels. In terms of gameplay and scope there will be a fairly standard world map with total war style base development, there will also be battle maps for real time combat. the battle maps will involve a fairly standard rts setup, very homeworld-esque with a stretch goal of allowing the player to pilot 'elite' ships. Units will have special powers (a magic system essentially). Describing the scale is difficult but if you've played star conflict, then thats about the scale. Mind you I'm not looking to finish, only have the visuals and basic logic done, a tech demo.    Unity feels perfect when developing since there doesn't seem to be any preset game in mind within the engine. Aside from the render limitation when using free what really got me poking around was the particle engine. I spent a week or so building a  prefab/script that spawns particles and allows me to dynamically adjust settings to make various kinds of weapons fire. Works well, could use some optimization but it allows for huge variety in the kinds of effects weapons effects quickly and easily. Then I duplicated it a few times and watched the framerate plummet. I can work around it by using a single emitter or maybe baking out the different effects (somehow). Other, better, solutions (gl class or line drawing) required full access, so I started looking around again.    Ignoring cost for engines (although that was a good analysis, kburkhart84) I can use unity and be limited in graphics which is my focus, or hack at UDK and take an extended development period. Anyway I'll probably ramble if I continue. Thanks again for any discussion or advice. 
  2. Hi, I'm hoping one of you has some experience to share. Im trying to get a demo going for a space game. I started writing an engine on my own, which was slow and painful but worth the experience. Moving past that I got into unity only to find that to get good performance and visuals you'll need to buy the pro version, which is where I'm leaning. cryEngine 3 peaked my interest but the indie licensing comes with some serious horror stories up to having an admin delete a small studios account. Also CE3 and UDK are both fps focused and thus need some serious hacking to get to work with a space game. My focus is the visuals, its where Ill spend most of my time, making me wonder if the pain of UDK for a space game might be worth it over unity. Also I'm not at all impressed with unity's visual capabilities vs performance and complexity.    I know there are a lot of engines to pick from but given what I've stated does anyone have recommendations, maybe something I've overlooked?    
  3. some questions on getting input

    I think your right. Ive seen GetMessage / PeekMessage in a while loop is that what I should do? Ive tried assigning peek to a boolean and running until false but doing that blocked everything and I ended up with a black screen [code] void SystemClass::Run() { MSG msg; bool done, result; // Initialize the message structure. ZeroMemory(&msg, sizeof(MSG)); // Loop until there is a quit message from the window or the user. done = false; while(!done) { // Handle the windows messages. if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } // If windows signals to end the application then exit out. if(msg.message == WM_QUIT) { done = true; } else { result = Frame(); if(!result) { done = true; } } } return; } [/code] frame starts the frame processing and rendering.
  4. some questions on getting input

    I had my input system written but it was a strange mix of windows messages and polling with getasync() ect. The real problem though was that when trying to use the mouse and the keyboard the entire engine stuttered. I'm no too sure what I did there but it pushed me to try to wrap raw input and depend only on that. Its resolved the stuttering but now I'm getting mouse lag like Ive never seen. Everything keeps moving fine but a second of mouse movement is turning into a minute of movement and being locked out of further input. So if i move the mouse and hit esc to quit I have to wait for the extremely slowed input lag to finish. The whole thing is rather frustrating I'm almost ready to say die and hook in directinput, but then again that may be more hours of debugging. What I really want to do is sidestep the message queue and go with nothing but getasync() for movement controls, will that cause problems down the line? Raw Input is recommended but its the most complicated, for movement controls is it really the best choice? Anyone have a link / name for some demo code and / or wrappers for raw input (c++)? Lastly, if anyone has a minute could you take a look at the input code's latest incarnation and let me know if a message queue lagging issue pops? Any comments on the code are more than welcome too. [code] switch(umsg) { case WM_CREATE: { RAWINPUTDEVICE Rid[2]; Rid[0].usUsagePage = 0x01; Rid[0].usUsage = 0x02; Rid[0].dwFlags = 0; // adds HID mouse Rid[0].hwndTarget = 0; Rid[1].usUsagePage = 0x01; Rid[1].usUsage = 0x06; Rid[1].dwFlags = 0; // adds HID keyboard Rid[1].hwndTarget = 0; if (RegisterRawInputDevices(Rid, 2, sizeof(Rid[0])) == FALSE) { strPrinter("input registration failed"); } } case WM_INPUT: { UINT dwSize; // Determine how big the buffer should be GetRawInputData((HRAWINPUT)lParam, RID_INPUT, NULL, &dwSize, sizeof(RAWINPUTHEADER)); BYTE* lpb; lpb = new BYTE[dwSize]; if (lpb == NULL) { strPrinter("lpb not initialized"); return 0; } if (GetRawInputData((HRAWINPUT)lParam, RID_INPUT, lpb, &dwSize, sizeof(RAWINPUTHEADER)) != dwSize ) strPrinter("GetRawInputData does not return correct size !"); GetRawInputData((HRAWINPUT)lParam, RID_INPUT,(LPVOID)lpb, &dwSize, sizeof(RAWINPUTHEADER)); RAWINPUT* raw = (RAWINPUT*)lpb; switch (raw->header.dwType) { case RIM_TYPEMOUSE: { // read the mouse data long mx = raw->data.mouse.lLastX; long my = raw->data.mouse.lLastY; m_Input->mouseMove(mx, my); delete[] lpb; return 0; } case RIM_TYPEKEYBOARD: { // read the keyboard data m_Input->KeyUp(raw->data.keyboard.VKey); delete[] lpb; return 0; } } delete[] lpb; return 0; } [/code] Thanks guys n gals.
  5. simple problem with assigning a value

    My bad, there was a check to not print 0 in printFloat... sorry for the bother.
  6. I have some really simple code that does not do what it should. The function gets an x and a y value, updates if there is a change, or sets a value to 0 if no change has occurred. The problem is that the value isn't being set to 0. [code] bool CameraClass::Update(float x, float y) { // right mouse button for camera rotation if(GetAsyncKeyState(0x02)) { if(m_rotationX != x) m_rotationX = x; else { //here is the problem. m_rotation is not being changed. The same happens with the y value. m_rotationX = 0.0f; printFloat(m_rotationX); printFloat(x); } if(m_rotationY != y) m_rotationY = y; else m_rotationY = 0.0f; } if(!GetAsyncKeyState(0x02)) { m_rotationX = 0; m_rotationY = 0; } return true; } [/code] printFloat is only called if m_rotationX is set to 0 first, but in the print out the values always print the matching pair. So if m_rotationX is 100 and x is 100 i get (100, 100) printed. What should happen is I get (0, 100) since the pair matched and m_rotationX was set to 0. Its boggling my mind a bit. I don't see how setting a value in such a straight forward way could fail. Any advice? Edit: camera behavior also confirms the print.
  7. object creation from script

    Ive been mulling this over for a while. Im at a point where the number of objects in my demo engine is growing painful manage. Rather than write out object something = new classT for each and every new object, is it possible to write a file parser / script interface that will generate objects and delete them? for example: if level1 run (level1script) run(script) //get create the objects build(entities) initialize(entities) build(entities) //get pointers to objects for all entities "name from file" = new entity initialize(entities) //initialize entities from file for all entities setAttributes(entity) setAttributes(entity) //read and return the attributes to initialize with entity(findInFile(entity)) What I cant figure out is how to write code so that it will make objects based on whats written in a file. Can i just copy strings from a file and use some clever sprintf useage to get it to be a name, or do i set a vector to hold all the created objects of a given type and have the script manage whats where? Sorry if this is all very confusing, Im just confused about it myself, but i cant imagine that every simgle object must be hard coded into c++. If its standard to do so please tell me though ryan
  8. online storage.

    Started with box.net yesterday too soon to tell how its going. Skydrive sounds like it may be a better alternative. Ive tried dropbox, but i didn't like the way the actual file upload from the synced folder works, seemed like there was no accounting for how long it was going to be between dropping on one device an getting it on the other. Anyway thanks for the feedback
  9. online storage.

    Between using a pc, tablet, and smartphone, Ive realized online storage makes a lot of sense. But the options are really confusing. Game models, source code, books, and research articles are something i use on 2 of 3 devices each, at least. So Im wondering what you guys use?
  10. Hey guys. Im hoping someone can shed some light on making the code more manageable. Its for a direct3d framework. The framework itself functions well enough, but it needs some serious tweaking. Right now each model is loaded in the main graphics class that does rendering calls. Functions inside the class are specific to each model. load: [code] // Create the model object. m_Model = new ModelClass; if(!m_Model) { return false; } // Initialize the model object. result = m_Model->Initialize(m_D3D->GetDevice(), "../Engine/Assets/SphereMesh.txt", L"../Engine/Assets/earthlights.dds"); if(!result) { MessageBox(hwnd, L"Could not initialize the model object.", L"Error", MB_OK); return false; } [/code] function method: [code] m_BeaconModel->Render(m_D3D->GetDeviceContext()); m_testTexture->Render(m_D3D->GetDeviceContext(), m_BeaconModel->GetIndexCount(), worldMatrix, viewMatrix, projectionMatrix, m_BeaconModel->GetTexture(), m_Light->GetDirection(), color); ...... if(m_Frustum->CheckSphere(x,y,z, 2.0f)) { D3DXMatrixTranslation(&transMatrix, x, y, z); worldMatrix = transMatrix; m_BeaconModel->Render(m_D3D->GetDeviceContext()); m_testTexture->Render(m_D3D->GetDeviceContext(), m_BeaconModel->GetIndexCount(), worldMatrix, viewMatrix, projectionMatrix, m_BeaconModel->GetTexture(), m_Light->GetDirection(), color); } [/code] As you can see its very hard coded. If I want to use another model with the function above I have to alter the function and not the call. I know this isn't right. Do I use something like this->render( ... ) inside functions to make them work upon whatever i call them with as opposed to what Ive hard-coded? Also right now the model loading bothers me. Hard coding in all the models and textures seems wrong if not impossible for anything with a significant number of meshes and textures. Is it possible to write a function or a manager class that will load and unload as needed given a lookup table or some such? I dont necessarily need exact methods, but Im a little aimless in how to write my code in a more manageable way so any direction is very helpful right now. Thanks all.
  11. it could, or you could use the method you posted as the bounding box esq check, then move to the finer grain pixel check.
  12. You could do a bounding box check first to see which sprites may have collided, then check only those sprites.
  13. Direct X Water Tutorial?

    directx 10 [url="http://www.rastertek.com/dx10tut29.html"]water tutorial[/url]
  14. Help with camera bugging out.

    Thank you for the code, unfortunately the problem was much more subtle. I switched from WM_MOUSEMOVE in the message loop to GetCursorPos() inside the mouse update call and the random movements are gone. On the bright side WM only checks for esc in the code now and all other key presses checked directly when they are needed, and after screwing with camera code for over a week I bet I could now write one in my sleep lol.
  15. Hey again. Wondering if someone can help find the bug in this code. Its just a camera class that takes input and transforms the view matrix. The camera follows the mouse and moves with key presses. Everything works great until I move the camera while rotating, then the camera just starts doing its own thing, slipping into an accelerated turns and ignoring input. The longer I keep rotating and moving the worse the effect gets until it just ludicrously spins out of control, even for a time after all input is stopped. [code] void CameraClass::Render() { D3DXVECTOR3 vRotAxis, vDirection; float yaw, pitch, roll; int rotationFactor = 8; D3DXMATRIX pitchMatrix, yawMatrix, rotationMatrix, movementMatrix; //==================== // Rotational movement //==================== // Set the yaw (Y axis), pitch (X axis), and roll (Z axis) rotations in radians. yaw = m_rotationX * 0.0174532925f; pitch = m_rotationY * 0.0174532925f; roll = m_rotationZ * 0.0174532925f; // Create direction (forward) D3DXVec3Normalize(&vDirection, &(m_vLookAtPt - m_vEyePt)); //strafe vector D3DXVec3Cross(&vRotAxis,&vDirection,&m_vUp); D3DXVec3Normalize(&vRotAxis, &vRotAxis); //create rotation matrices D3DXMatrixRotationAxis(&pitchMatrix, &vRotAxis, -(pitch / rotationFactor)); //rotate around x D3DXMatrixRotationAxis(&yawMatrix, &m_vUp, (yaw / rotationFactor)); //rotate around y //rotate direction D3DXVec3TransformCoord(&vDirection, &vDirection, &(pitchMatrix * yawMatrix)); //rotate up vector D3DXVec3TransformCoord(&m_vUp, &m_vUp, &(pitchMatrix * yawMatrix)); // Translate the rotated camera position to the location of the viewer. m_vLookAtPt = vDirection + m_vEyePt; //===================== // Directional movement //===================== if (moveForward) { m_vEyePt += vDirection * m_fSpeed; m_vLookAtPt += vDirection * m_fSpeed; } if (moveBackward) { m_vEyePt -= vDirection * m_fSpeed; m_vLookAtPt -= vDirection * m_fSpeed; } if (moveLeft) { D3DXVec3Cross(&vDirection,&vDirection,&m_vUp); //create strafe vector D3DXVec3Normalize(&vDirection,&vDirection); m_vEyePt += vDirection * m_fSpeed; m_vLookAtPt += vDirection * m_fSpeed; } if (moveRight) { D3DXVec3Cross(&vDirection,&vDirection,&m_vUp); //create strafe vector D3DXVec3Normalize(&vDirection,&vDirection); m_vEyePt -= vDirection * m_fSpeed; m_vLookAtPt -= vDirection * m_fSpeed; } // Get the movement matrix D3DXMatrixLookAtLH(&m_viewMatrix, &m_vEyePt, &m_vLookAtPt, &m_vUp); return; } [/code] Rotating is ok on its own and so is moving. Even short bursts of both work ok too. I figure since its a standard camera class it'll either check out or not. P.s. sorry for the inconsistent naming conventions, I hacked in a lot of different camera models before getting here. . . probably should clean it up a bit.