Jump to content
Site Stability Read more... ×
  • Advertisement

JWColeman

Member
  • Content Count

    162
  • Joined

  • Last visited

Community Reputation

147 Neutral

About JWColeman

  • Rank
    Member

Personal Information

  • Role
    Amateur / Hobbyist
  • Interests
    Programming

Social

  • Github
    https://jwcoleman87.visualstudio.com/MYGAME2

Recent Profile Visitors

3897 profile views
  1. JWColeman

    Dungeon Crawler Challenge - Tile Movement!

    The thing about this code, is that I know I will eventually use it again, it just doesn't have much of a place in a tile based environment. I would have to configure my core objects to operate with or without it. Currently my game object relies on a position derived from it's physical component. So I would have to make that like, optional. Somehow :D. Refactoring sucks when there is a known deadline :).
  2. JWColeman

    Dungeon Crawler Challenge - Tile Movement!

    I'm beginning to think that I need to rework this so that I'm not using a physics class in order to accomplish this task. I took a bit of a broad stance on what physics was when i first started developing this thing. Essentially, I said to myself, if it moves, its physics. But it may be that I've overcomplicated my code following this rule, not sure. Like, currently, I'm using AABB collision in a map/tile/grid environment. and I'm not sure if that makes sense. I could just simply say, is the map tile you want to move to walkable? yes/no, do logic. But instead, I'm going through the steps to detect a collision and respond appropriately. This is what my physics class is currently doing. Also, all positions for game objects are derived from physics. If I tell a game object to move, its updating the physical component, which then in turn updates the user (the game object). This might be a level of complexity I can do without.
  3. JWColeman

    Dungeon Crawler Challenge - Tile Movement!

    Lol, I should really examine my code before i post it. So many redundant if else statements!
  4. Hello all, since the Frogger Challenge I have been hard at work doing some cleanup in my "engine" and adding a few features that were missing from the first challenge. Specifically, I was able to add add in a state machine as well as figured out how to use SFML for poller based input. I decided that I didn't have enough of one type of art to fully flesh out the graphics of a dungeon crawler, they were all a bit mismatched and I decided to forego frankensteining it together, so I went over to Oryx Design Labs and got their Ultimate Fantasy Tileset! One of my first major hurdles was that I decided I wanted to use tile based movement rather than the free movement that I used in the Frogger Challenge. I'm trying to slightly mimic the kind of motion i see in Sproggiwood and Paper Dungeons Crawler. I visited the forums for a while and ended up coming up with my own flavor of tile based movement that I believe at least is a close match to what I'm seeing in these games. I wanted diagonal movement, but I wanted everything locked to the tiles. and I think I have accomplished that at this time! See Below: 2018-12-24_00-10-03.mp4 This was more of a task than I thought it would be, but here is the code that makes it work, I'm definitely open to some suggestions here! Firstly, input! if (sf::Keyboard::isKeyPressed(sf::Keyboard::W) && sf::Keyboard::isKeyPressed(sf::Keyboard::D)) { if(gameobjects[0]->getPhysics()->inMotion == false) { gameobjects[0]->setVelocity(XMFLOAT3{ float(.025) * dt,float(.025) * dt, 0 }); gameobjects[0]->nextmapcoords.x = gameobjects[0]->mapcoords.x + 1; gameobjects[0]->nextmapcoords.y = gameobjects[0]->mapcoords.y + 1; } } else if (sf::Keyboard::isKeyPressed(sf::Keyboard::W) && sf::Keyboard::isKeyPressed(sf::Keyboard::A)) { if (gameobjects[0]->getPhysics()->inMotion == false) { gameobjects[0]->setVelocity(XMFLOAT3{ float(-.025) * dt,float(.025) * dt, 0 }); gameobjects[0]->nextmapcoords.x = gameobjects[0]->mapcoords.x - 1; gameobjects[0]->nextmapcoords.y = gameobjects[0]->mapcoords.y + 1; } } else if (sf::Keyboard::isKeyPressed(sf::Keyboard::S) && sf::Keyboard::isKeyPressed(sf::Keyboard::D)) { if (gameobjects[0]->getPhysics()->inMotion == false) { gameobjects[0]->setVelocity(XMFLOAT3{ float(.025) * dt,float(-.025) * dt, 0 }); gameobjects[0]->nextmapcoords.x = gameobjects[0]->mapcoords.x + 1; gameobjects[0]->nextmapcoords.y = gameobjects[0]->mapcoords.y - 1; } } else if (sf::Keyboard::isKeyPressed(sf::Keyboard::S) && sf::Keyboard::isKeyPressed(sf::Keyboard::A)) { if (gameobjects[0]->getPhysics()->inMotion == false) { gameobjects[0]->setVelocity(XMFLOAT3{ float(-.025) * dt,float(-.025) * dt, 0 }); gameobjects[0]->nextmapcoords.x = gameobjects[0]->mapcoords.x - 1; gameobjects[0]->nextmapcoords.y = gameobjects[0]->mapcoords.y - 1; } } else if (sf::Keyboard::isKeyPressed(sf::Keyboard::D)) { if (gameobjects[0]->getPhysics()->inMotion == false) { gameobjects[0]->getPhysics()->SetVelocityX(float(.025) * dt); gameobjects[0]->nextmapcoords.x = gameobjects[0]->mapcoords.x + 1; gameobjects[0]->nextmapcoords.y = gameobjects[0]->mapcoords.y; } } else if (sf::Keyboard::isKeyPressed(sf::Keyboard::A)) { if (gameobjects[0]->getPhysics()->inMotion == false) { gameobjects[0]->getPhysics()->SetVelocityX(float(-.025) * dt); gameobjects[0]->nextmapcoords.x = gameobjects[0]->mapcoords.x - 1; gameobjects[0]->nextmapcoords.y = gameobjects[0]->mapcoords.y; } } else if (sf::Keyboard::isKeyPressed(sf::Keyboard::W)) { if (gameobjects[0]->getPhysics()->inMotion == false) { gameobjects[0]->getPhysics()->SetVelocityY(float(.025) * dt); gameobjects[0]->nextmapcoords.x = gameobjects[0]->mapcoords.x; gameobjects[0]->nextmapcoords.y = gameobjects[0]->mapcoords.y + 1; } } else if (sf::Keyboard::isKeyPressed(sf::Keyboard::S)) { if (gameobjects[0]->getPhysics()->inMotion == false) { gameobjects[0]->getPhysics()->SetVelocityY(float(-.025) * dt); gameobjects[0]->nextmapcoords.x = gameobjects[0]->mapcoords.x; gameobjects[0]->nextmapcoords.y = gameobjects[0]->mapcoords.y - 1; } } So, I had to add some information to my gameobject class. Specifically, map coordinates, and next map coordinates. Then I had to limit my input to only when inmotion is false, which will be false whenever I have successfully locked to a tile. Now, to make all the map coordinates work correctly, I needed to be able to update the next map coordinates and current map coordinates in my game object update loop, using this code: void Game::UpdateMapPosition(GameObject * object) { XMFLOAT3A objectpos = object->getPosition(); int xcount = floor(objectpos.x / map->tileSizeX); int ycount = floor(objectpos.y / map->tileSizeY); object->mapcoords.x = xcount; object->mapcoords.y = ycount; XMFLOAT3A pos = map->At(xcount, ycount); if (object->currentDirection == Facing::UP_RIGHT || object->currentDirection == Facing::DOWN_LEFT) { if (pos.x == map->At(object->nextmapcoords.x, object->nextmapcoords.y).x) { object->getPhysics()->SetVelocityX(0); } else if (pos.y == map->At(object->nextmapcoords.x, object->nextmapcoords.y).y) { object->getPhysics()->SetVelocityY(0); } } else if (object->currentDirection == Facing::UP_LEFT || object->currentDirection == Facing::DOWN_RIGHT) { if (pos.x == map->At(object->nextmapcoords.x, object->nextmapcoords.y).x) { object->getPhysics()->SetVelocityX(0); } else if (pos.y == map->At(object->nextmapcoords.x, object->nextmapcoords.y).y) { object->getPhysics()->SetVelocityY(0); } } else if(object->currentDirection == Facing::RIGHT || object->currentDirection == Facing::LEFT) { if (pos.x == map->At(object->nextmapcoords.x, object->nextmapcoords.y).x) { object->getPhysics()->SetVelocityX(0); } else if (pos.y == map->At(object->nextmapcoords.x, object->nextmapcoords.y).y) { object->getPhysics()->SetVelocityY(0); } } else if(object->currentDirection == Facing::UP || object->currentDirection == Facing::DOWN) { if (pos.y == map->At(object->nextmapcoords.x, object->nextmapcoords.y).y) { object->getPhysics()->SetVelocityY(0); } else if (pos.y == map->At(object->nextmapcoords.x, object->nextmapcoords.y).y) { object->getPhysics()->SetVelocityY(0); } } } Again, definitely open to suggestions for cleanup here, this is what I was able to throw together given my current knowledge and understanding. The end result is definitely functional though! The next thing I think I want to do is incorporate the mouse in some kind of way, but I haven't thought up any ideas yet, lets here what you think! There are a few things I like about this setup, and of course a few that I don't like. I think the code is pretty easy to read, and I like that. However, It feels a bit bloated and large for the job its actually accomplishing, definitely some room for some tidying up and optimization. Anyways I think I've made a good start for the next challenge. What's next? Maybe make some of my objects interactable, like boxes and crates and junk. Loot is, I believe, the biggest part of the requirement, aside from beating the bad guys!
  5. So, as a hobbyist, with minimal formal training in C++ or object oriented programming, how relevant is this stuff to me? Feels like just a lot of discussion waaaaay above my head rn :).
  6. JWColeman

    Gogger

    I'd like to mention that this is my first game release EVER! I'm very excited and there will certainly be more to come.
  7. WOOOOO, last 3 days have been epic. I was able to add sound, a menu, a game over screen, and a score in 3 nights. Here it is! Enjoy! Update: Gogger.zip - Some bug fixes... already!
  8. JWColeman

    Day 2 Feature 2 of 4 - Music

    Its my own little rendition of Cripple Creek
  9. JWColeman

    Day 2 Feature 2 of 4 - Music

    I guess this makes me a musician, I can play guitar and banjo. I don't usually think of myself as a musician though. Probably why I ended up paying for sprites, drawing stuff is definitely something I don't have the patience for
  10. I was able to use SFML to bring in my recording of my banjo. Seems to suit the goblin nicely. Unfortunately, the video recording is paying the price of the addition of sound (recording framerate is choppy, not quite sure how to fix). Everything works smoothly when it plays though, and here is the result. Gogger loves the Banjo. In order to accomplish this, only a very small amount of code is needed, more work was involved in importing the libraries. sf::Music music; if (!music.openFromFile("../MyGame/Sound/Recording1.ogg")) return -1; // error music.play(); Here is a URL if the video doesn't load! https://puu.sh/C9WZ1/29e00140bf.mp4 Gogger Music!.mp4
  11. JWColeman

    3 Days, 4 features - Menu

    If you want to call it that
  12. JWColeman

    3 Days, 4 features - Menu

    I think the main reason for my crunch is that I was trying to figure out how to draw squares when i started 2 months ago
  13. I've come to realize that I will not make the deadline unless I seriously crunch, so, enter game menu, witness the monstrosity - dies a little on the inside. Everything is super basic, simple Boolean if else to determine if I'm in the menu, some conditions on the input to detect if I'm in the menu so I can handle it appropriately, and a silly png I made in gimp to represent the menu. This hardly counts as a blog entry, but join me in the exciting dash to delivery day, (2 more days). 2018-11-28_23-59-22.mp4
  14. Wow, this last couple weeks has been quite a journey. As soon as I updated my map and added a water feature obstacle, I realized I had no obvious way built into my code to make it behave like it should for a frogger-esque type game. The water had to kill me, but, not if I was standing on a platform. This led to the addition of some features in the engine that I hadn't thought of initially. Namely, a collision mask. What I decided to do was make it so if I was colliding with water, it would decrease the Z axis up until a certain point. Once that point is met on the Z axis, then call the game logic to do its thing. It looks like this: else if (collidedObjectB->getCollisionType() == CollisionResponseType::SINK) { if (collidedObjectA->getPosition().z >= -1) { collidedObjectA->getPosition().z -= .1f; } else { if (collidedObjectA->userData != nullptr && collidedObjectB->userData != nullptr) gameCollisionResponse(*collidedObjectA, *collidedObjectB); } } So, naturally, the physical object connected to water has the "SINK" collision response, which causes whatever is colliding with it to sink at a rate of -.1f per frame. If we find that we exceed the threshold for Z we call the game logic response gameCollisionResponse: // if the player runs into water else if (objectA->Type == GameObjectType::PLAYER && objectB->Type == GameObjectType::WATER) { objectA->resetPosition(); } This response is gated so that it only works on the player, after posting this code I realize my platforms could be sinking in Z perpetually, but this can't be perceived in the rendering (adds to fix list). Now, all this works great for killing the player, but now I needed a way to make it so if the player was standing on a platform, it nullified the sinking effect. So, I set up a new game object called platform and gave its physical component a "FLOAT" mask, enter logic: else if (collidedObjectA->getCollisionType() == CollisionResponseType::STOP && collidedObjectB->getCollisionType() == CollisionResponseType::FLOAT) { collidedObjectA->getPosition().z = 0; } Now, this will reset the Z of the player so that he doesn't reach the threshold we talked about earlier. I'm not certain that I need the other condition here (if objectA = type "STOP"), I'll mess with that sometime. As you can probably imagine, the changes that were required in order to get this working properly were a lot further reaching than just this obvious code, but the end result is looking great! Also, I'd like to mention that I've updated the map with new sprites! It's looking pretty good now I think. No new enemies yet, I need to figure out how to pack the separated sprites into atlases so I can animate them properly. Just a few more things to do, need to have a victory trigger, and then some kind of menu! Oh, and a score system, ugh... Definitely a bit more work to do! I'm not certain if I will make the deadline, but participation has been a blast so far! 2018-11-24_12-36-11.mp4
  15. JWColeman

    Cinematic Insanity

    Looks awesome! Much envy! Working with my own engine build, I guess will reap it's reward in time though! The camera stuff looks awesome, really polishes things up!
  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!