Jump to content
  • Advertisement
The search index is currently processing. Activity stream results may not be complete.

All Activity

This stream auto-updates     

  1. Today
  2. Hi guys, i am trying to implement a simple font renderer using bitmap font texture with a dynamic vertex buffer, i am able to successfully display text with correct glyph from bitmap texture. right now i am trying to draw a dynamic string that changes at user input, i.e user able change the displayded text by typing the new one. The issue is that length of string is exactly same as what it was initialized with even when updating string at every render frame. string gets updated every fram but is capped at length equal to what is was initialized with. i am suspecting that vertexBufferDesc.ByteWidth is not getting updated even when i update vertexbuffer by map and unmap it. initialize bool GlyphClass::Initialize(ID3D11Device* device, HWND hwnd, int screenWidth, int screenHeight, WCHAR* path) { bool result; m_GlyphWidthData.open("Font/AgencyFBFont_64x64_width.txt"); while (1) { if (m_GlyphWidthData.eof()) { break; } int tmp = 0; m_GlyphWidthData >> tmp; if (tmp != 0) { m_GlyphWidth.push_back(tmp); } } m_GlyphWidthData.close(); m_GlyphCharacter = 'A'; m_StringToDraw = "TEXTTEST@xyz";//userInputString != "" ? userInputString : "VIVEK599 xyz"; m_fontTextureShader = new TextureShaderClass; if (!m_fontTextureShader) { return false; } result = m_fontTextureShader->Initialize(device, hwnd); if (!result) { MessageBox(hwnd, L"Could not initialize font texture shader object!", L"Error", MB_OK); return false; } m_ScreenWidth = screenWidth; m_ScreenHeight = screenHeight; result = InitializeBuffers(device); if (!result) { return false; } result = LoadTexture(device, path); if (!result) { return false; } return true; } updatebuffer bool GlyphClass::UpdateBuffers(ID3D11DeviceContext* context, int posX, int posY) { m_StringToDraw = userInputString != "" ? userInputString : "STRING 555@xyz0123456789"; VertexType* vertices; D3D11_MAPPED_SUBRESOURCE mappedResource; VertexType* vertexPtr; HRESULT hr; vertices = new VertexType[m_VertexCount * m_StringToDraw.length()]; if (!vertices) { return false; } // Initialize vertex array to zeros at first. memset(vertices, 0, sizeof(VertexType) * m_VertexCount * m_StringToDraw.length() ); float posXOffset = (float)posX; float posYOffset = (float)posY; for ( int i = 0; i < m_StringToDraw.length(); i++ ) { int cx = m_StringToDraw[i] % 16; int cy = m_StringToDraw[i] / 16; float tex_left = (float)cx * (1.f / 16.f); float tex_top = (float)cy * (1.f / 16.f); float tex_right = tex_left + (1.f / 16.f) * ((float)m_GlyphWidth[m_StringToDraw[i]] / 64.f); float tex_bottom = tex_top + (1.f / 16.f); int totalCharWidth = 64; float left = (float)((float)(m_ScreenWidth / 2.f) * -1) + posXOffset; float right = left + (float)m_GlyphWidth[m_StringToDraw[i]]; float top = (float)(m_ScreenHeight / 2.f) - posYOffset; float bottom = top - (float)totalCharWidth; //triangle 1 - clockwise vertices[0 + m_VertexCount * i].position = Vector3(left, top, 0.f); vertices[0 + m_VertexCount * i].texture = Vector2(tex_left, tex_top); vertices[1 + m_VertexCount * i].position = Vector3(right, bottom, 0.f); vertices[1 + m_VertexCount * i].texture = Vector2(tex_right, tex_bottom); vertices[2 + m_VertexCount * i].position = Vector3(left, bottom, 0.f); vertices[2 + m_VertexCount * i].texture = Vector2(tex_left, tex_bottom); //triangle + i 2 vertices[3 + m_VertexCount * i].position = Vector3(left, top, 0.f); vertices[3 + m_VertexCount * i].texture = Vector2(tex_left, tex_top); vertices[4 + m_VertexCount * i].position = Vector3(right, top, 0.f); vertices[4 + m_VertexCount * i].texture = Vector2(tex_right, tex_top); vertices[5 + m_VertexCount * i].position = Vector3(right, bottom, 0.f); vertices[5 + m_VertexCount * i].texture = Vector2(tex_right, tex_bottom); posXOffset += m_GlyphWidth[m_StringToDraw[i]]; } hr = context->Map(m_VertexBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); if (FAILED(hr)) { return false; } vertexPtr = (VertexType*)mappedResource.pData; int bufferSize = sizeof(VertexType) * m_VertexCount * m_StringToDraw.length(); memcpy(vertexPtr, (void*)vertices, bufferSize); D3D11_BUFFER_DESC tmpDesc; m_VertexBuffer->GetDesc(&tmpDesc); context->Unmap(m_VertexBuffer, 0); delete[] vertices; vertices = 0; return true; }
  3. Hi guys, i am trying to implement a simple font renderer using bitmap font texture with a dynamic vertex buffer, i am able to successfully display text with correct glyph from bitmap texture. right now i am trying to draw a dynamic string that changes at user input, i.e user able change the displayded text by typing the new one. The issue is that length of string is exactly same as what it was initialized with even when updating string at every render frame. string gets updated every fram but is capped at length equal to what is was initialized with. i am suspecting that vertexBufferDesc.ByteWidth is not getting updated even when i update vertexbuffer by map and unmap it. initialize bool GlyphClass::Initialize(ID3D11Device* device, HWND hwnd, int screenWidth, int screenHeight, WCHAR* path) { bool result; m_GlyphWidthData.open("Font/AgencyFBFont_64x64_width.txt"); while (1) { if (m_GlyphWidthData.eof()) { break; } int tmp = 0; m_GlyphWidthData >> tmp; if (tmp != 0) { m_GlyphWidth.push_back(tmp); } } m_GlyphWidthData.close(); m_GlyphCharacter = 'A'; m_StringToDraw = "TEXTTEST@xyz";//userInputString != "" ? userInputString : "VIVEK599 xyz"; m_fontTextureShader = new TextureShaderClass; if (!m_fontTextureShader) { return false; } result = m_fontTextureShader->Initialize(device, hwnd); if (!result) { MessageBox(hwnd, L"Could not initialize font texture shader object!", L"Error", MB_OK); return false; } m_ScreenWidth = screenWidth; m_ScreenHeight = screenHeight; result = InitializeBuffers(device); if (!result) { return false; } result = LoadTexture(device, path); if (!result) { return false; } return true; } updatebuffer bool GlyphClass::UpdateBuffers(ID3D11DeviceContext* context, int posX, int posY) { m_StringToDraw = userInputString != "" ? userInputString : "STRING 555@xyz0123456789"; VertexType* vertices; D3D11_MAPPED_SUBRESOURCE mappedResource; VertexType* vertexPtr; HRESULT hr; vertices = new VertexType[m_VertexCount * m_StringToDraw.length()]; if (!vertices) { return false; } // Initialize vertex array to zeros at first. memset(vertices, 0, sizeof(VertexType) * m_VertexCount * m_StringToDraw.length() ); float posXOffset = (float)posX; float posYOffset = (float)posY; for ( int i = 0; i < m_StringToDraw.length(); i++ ) { int cx = m_StringToDraw[i] % 16; int cy = m_StringToDraw[i] / 16; float tex_left = (float)cx * (1.f / 16.f); float tex_top = (float)cy * (1.f / 16.f); float tex_right = tex_left + (1.f / 16.f) * ((float)m_GlyphWidth[m_StringToDraw[i]] / 64.f); float tex_bottom = tex_top + (1.f / 16.f); int totalCharWidth = 64; float left = (float)((float)(m_ScreenWidth / 2.f) * -1) + posXOffset; float right = left + (float)m_GlyphWidth[m_StringToDraw[i]]; float top = (float)(m_ScreenHeight / 2.f) - posYOffset; float bottom = top - (float)totalCharWidth; //triangle 1 - clockwise vertices[0 + m_VertexCount * i].position = Vector3(left, top, 0.f); vertices[0 + m_VertexCount * i].texture = Vector2(tex_left, tex_top); vertices[1 + m_VertexCount * i].position = Vector3(right, bottom, 0.f); vertices[1 + m_VertexCount * i].texture = Vector2(tex_right, tex_bottom); vertices[2 + m_VertexCount * i].position = Vector3(left, bottom, 0.f); vertices[2 + m_VertexCount * i].texture = Vector2(tex_left, tex_bottom); //triangle + i 2 vertices[3 + m_VertexCount * i].position = Vector3(left, top, 0.f); vertices[3 + m_VertexCount * i].texture = Vector2(tex_left, tex_top); vertices[4 + m_VertexCount * i].position = Vector3(right, top, 0.f); vertices[4 + m_VertexCount * i].texture = Vector2(tex_right, tex_top); vertices[5 + m_VertexCount * i].position = Vector3(right, bottom, 0.f); vertices[5 + m_VertexCount * i].texture = Vector2(tex_right, tex_bottom); posXOffset += m_GlyphWidth[m_StringToDraw[i]]; } hr = context->Map(m_VertexBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); if (FAILED(hr)) { return false; } vertexPtr = (VertexType*)mappedResource.pData; int bufferSize = sizeof(VertexType) * m_VertexCount * m_StringToDraw.length(); memcpy(vertexPtr, (void*)vertices, bufferSize); D3D11_BUFFER_DESC tmpDesc; m_VertexBuffer->GetDesc(&tmpDesc); context->Unmap(m_VertexBuffer, 0); delete[] vertices; vertices = 0; return true; }
  4. Well, well, well ... look who's here! It's you again! Welcome to your favourite Weekly Updates blog! This week was a very proactive one. I managed to add several new challenges. In all, there are 5 new and unique challenges. So, without further ado, let's get started! New Challenges First of all, as most novelties are platform challenges, I will introduce them one by one. I will just introduce them and briefly describe how they work. I've also recorded videos for most of the challenges. All of these challenges are of the generic type. This means that any of these can be chosen for any level. That's why they all have a heavy vaporwave/shopping mall theme. But keep in mind that I haven't had the time to incorporate them into the game yet. Thus, no loot for now... Challenge #1 The first challenge consists of several vertically moving platforms and three distinct elevations. The idea is to use the moving platforms to climb the central obstacle to reach the final elevations. The most observant of you have probably noticed that the middle elevation has a cracked wall. This is a useful shortcut to avoid wasting time on moving platforms. Here's a small video showing it off: Challenge #2 This second challenge consists mainly of two symmetrical forked paths with several mobile platforms. At the end of each branch, a switch can be found. The idea is to activate both of those. Once they're both on, a super-secret room opens up at the beginning to reveal the loot. If you make a mistake, use the nearest ladder and start again from there. After all, you can't rush these: you'll have to take your time ... Challenge #3 This challenge is not so much a "platform" as a "puzzle" ... It does not have a mobile platform, but ladders and stairs. This challenge consists of a series of toggle switches. Here, whenever a switch is toggled, its immediate neighbours get toggled too. The trick here is to toggle the right sequence of toggle switches to turn them all on at once... Some would say that this kind of puzzle is a "classic". While they're somehow right, the thing is that here we can't see all switches at once. Thus you have to memorize it. Once all toggle switches are on, the loot will appear at the back of the room. Challenge #4 For this next challenge, there's a balanced mix of puzzling and platforming. It's split into three sub-challenges: a toggle switch puzzle, a moving platform challenge and lastly a pressure plate puzzle. The first one is a 3x3 version of the switch puzzle seen in challenge #2. However, unlike the latter, it's much more open and less convoluted. The second one is a platforming course. Any mistakes will result in you restarting the whole course. Finally, the last one is a pressure plate puzzle. The idea is to use pushable blocks to activate pressure plates. Except it's not as easy as it seems... All of these must be completed in order. After clearing everything, the last part opens up, revealing the loot. Unfortunately, this challenge isn't complete yet. There are essential things not yet implemented, like pushable blocks... So no video for now... 😢 Challenge #5 Finally, here's the last challenge. A pure platforming challenge, it's quite vertical and very spacious. The goal is quite simple: climb the tower. There are moving platforms to help you. But be warned: these platforms are small, narrow and quick. Proceed with caution! However, make one mistake and it's back to square one. So take your time and don't rush! Minor Updates Added Screen Space Reflexions Next Week For the next week, I plan to add more challenges while trying to integrate these first in the game. There are several ways to do it, but to stay in the theme of the vaporwave I think I'll replace the steps by an elevator (small elevator music included). I just need to model it and to add it to the maps' generation process. Otherwise, I still have pieces of equipment to add. After that, it's your usual suspects. So yeah, that's about it!
  5. Vilem Otte

    DOOM

    GROOM GROOM is my entry into DOOM challenge here on GameDev.net, GROOM is a simple first person shooter, which has many similarities with original DOOM game, and is somehow supposed to re-create DOOM experience (which was different for every single one of us). The game itself is very simple and small - I've inspired by simple map from DOOM 2 (Dead Simple), and made a very basic art for it, including skeletal animated enemy. TECHNOLOGY Most of us remember DOOM as one of the first 3D games, which has used ray casting for rendering. To recreate similar experience, GROOM is using a custom path tracing renderer (actual rendering happens on GPU, but some preparation - like acceleration structures happen on CPU). Due to this the game may seem noisy and tends to be quite heavy on the hardware (although it can run on non-RTX GPUs, as the whole renderer is written in OpenCL). The scene acceleration structure (multi level one) gets rebuilt each single frame, including some of the bottom level trees which contain characters with skeletal animation. The art is quite programmerish-style, and was put within last 48 hours before release. If you are able to run the project, I'd be glad to hear any feedback about the renderer itself - and hopefully it runs for you and you enjoyed it! SCREENSHOTS Fig. 01 - Real time path traced game level Fig. 02 - Real time path traced enemies! Fig. 03 - Main menu DOWNLOAD GRDOOM.zip (Alternative Link) https://www.otte.cz/GRDOOM.zip CREDITS MUSIC: Royalty free music from https://www.fesliyanstudios.com SOUND: This game uses many sounds from freesound (InspectorJ, thecheeseman)
  6. dimi309

    Gloom

    This is a doom-style game, for the fall 2019 gamedev challenge. It runs on Windows, MacOS and Linux. It is nothing spectacular and not well optimised, since it was put together over the course of a couple of weeks. Part of what makes it interesting is that it was built using the small3d framework which, admittedly, was initially developed for far more modest purposes. To build the game, the Vulkan edition of the small3d framework is required. Precompiled binaries are provided for Windows and MacOS though. On MacOS, execute the gloom.sh script from the command line, from within the binary directory, otherwise it might not work. Gloom has been developed in C++. The 3D models have been created using Blender. There is a note in the sounds directory giving credit to the creator of the sound file.
  7. RoKabium Games

    ScreenShotSaturday

    Keeping up with the twitter hashtag of screen shots on Saturday!
  8. Textured Rectangle in pure WebGL 1.0 and TypeScript. I use glMatrix for Linear Algebra. Playground: Plunker: https://next.plnkr.co/edit/4pnm93F1eWQuvpYg?preview CodeSandbox: https://codesandbox.io/s/textured-rectangle-with-transforms-typescript-s7gfb
  9. ToeBeans The Brave

    Attempt 2 (New Idle Animation)

    This took me a little bit longer than I care to admit, but I have upgraded my previous Idle animation! The first one that I made is at the top and the upgraded one is at the bottom. Anyone who can provide constructive criticism would be greatly appreciated!
  10. ToeBeans The Brave

    Looking For Constructive Criticism(My First Sprites)

    Thanks for the feedback!
  11. fleabay

    plane game collision

    What is the question? Don't keep us in suspense.
  12. phil67rpg

    plane game collision

    I have an interesting question about collisions. well when I fire a bullet from east to west at a plane it does the collision sprite however when I fire a bullet from west to east it does not draw the collision sprite. here is my collision code. this is a peculiar problem. void coll_plane_one() { //draw bullet float x = 5.0f+horizontal_one; float y = 0.0f+vertical_one; float oWidth = 0.125f; float oHeight = 0.125f; //draw plane float xTwo = -5.0f+horizontal+up_two; float yTwo = 0.0f+vertical; float oTwoWidth = 1.0f; float oTwoHeight = 1.0f; if (checkCollide(x, y, oWidth, oHeight, xTwo, yTwo, oTwoWidth, oTwoHeight) == 1) { drawcollision_one(); } } void coll_plane_two() { //draw bullet float x = -5.0f + horizontal; float y = 0.0f + vertical; float oWidth = 1.0f; float oHeight = 1.0f; //draw plane float xTwo = 5.0f + horizontal_one + up; float yTwo = 0.0f + vertical_one; float oTwoWidth = 0.125f; float oTwoHeight = 0.125f; if (checkCollide(x, y, oWidth, oHeight, xTwo, yTwo, oTwoWidth, oTwoHeight) == 1) { drawcollision_two(); } }
  13. DavinCreed

    Doomish

    6 Doomish - Done 5 Doomish - Almost Done... Except Fer Them Levels 4 Doomish - About 70% Done 3 Doomish: About Halfway Done 2 Doom: More Art Assets 1 Doomed Beginnings This a doom clone for the game dev challenge. I'm adding in a few things, a dodge and a GameDev.net power up. Other than that, I'm going to try to get a game that is Doom. Controls: A, D - Turn W, S - Walk Q, E - Strafe Right Ctrl - Hop/Dodge Space - Use/Open Enter - Shoot Escape, P - Pause Menu 1-6 - Switch Weapon
  14. Vilem Otte

    DOOM: Post Mortem

    For past 2 months there was a challenge running here on GameDev.net - this time I finally decided to participate. INTRODUCTION I, as many others, remember DOOM as one of the first (if not first) 3D games that we have played. GROOM is inspired by DOOM, built upon custom in-house ray tracing library, it allows you to experience a small map rendered with path tracer. The single level design is inspired by level from DOOM 2 - Dead Simple. This is not the only similarity with DOOM, having half-robot and half-demon spider-like enemy is another, and AI and behavior is also similar (enemies need to be 'activated' by shooting, otherwise they are not aggressive). WHAT WENT RIGHT? The whole idea of mine was bringing a real time path traced game (as DOOM was essentially a game using ray-casting). This whole had to begin with building a ray-tracer. Or to be precise a ray-tracer library that is fast enough to render complex environments at interactive frame rates. For this I was putting together something I will refer to as "OpenTracer" (subject name to change) - which ended up in OpenCL based library for ray-tracing. If something went right, it is indeed this ray-tracing library. It actually ended up having quite interesting features like: Support for BVH ray tracing (built using SAH, HLBVH, MULTI-LEVEL) MULTI-LEVEL BVH being the most useful, allowing not just for dynamic scenes, but also instancing BVHs (even bottom level) can be dynamically rebuilt (for characters with skeletal animation) Semi-programmable pipeline (would need a bit of work, but still - possible) Support for textures (building big texture atlas, which is then used during rendering) Somewhat useful library interface (building 'data buffers', requesting BVH built for those, etc.) Due to library design, it is technically re-usable Etc. I just went a bit ahead and wanted to try rendering some nice pictures, let me show an example here (of Crytek's sponza), the following image was rendered in under 1 second on AMD Radeon Rx 590 (interesting fact - it can run on Intel HD 620): Fig. 01 - Sponza path traced (note, I have placed enemy from DOOM into it) Other than that, what went right is actually finishing the project. With longer competitions (like 2-months ones) the original interest goes away after short time, and you need to keep working on the project to actually finish it. WHAT WENT WRONG? If I can state which parts I'm not satisfied in the project - the list would be quite long. But first and foremost it is the scale of the level and having a lot more programmer's art than what I wanted. The actual art for the game was made within last 72 hours before final deadline, not sooner. Luckily the first thing I did was blocking out the design for the level: Fig. 02 - Block out design of the level Of course, having a good art requires time - so I had to make as much as fast as possible - most of the models ended up being blocky. Additionally to that I was probably saving way too much geometry to end up with high performance (the actual performance hit by having more triangles isn't really a problem ... as there is BVH acceleration structure - theoretically doubling the geometry adds just single additional level to it). In the end I was actually able to build up most of the map, and an enemy (which has a hand made skeletal animation). Although not nearly at the quality I wanted. SOMETHING I LEARNED I have hit the typical problem for most challenges or jams and that is - time management is critical (I have literally planned what to have finished by when - to actually be able to finish the game). Some deadlines were done long before, some few days after. But mostly I have kept to written features/dates and that helped me finish the project. Unlike Ludum Dares (in which I participate regularly) time management for longer project is different (additionally you also have to fit in work/business and family into it ... and yes, even recent Ludum Dare was put into the plans). Apart from that, I've found out that handling dynamic scenes with ray-tracer is far harder compared to standard renderers like Direct3D (or even software rasterizeration ones). While I was working with ray-tracing a lot during my studies, I have actually never worked with fully dynamic scenes or dynamic deformable objects in it. CONCLUSION The challenge was actually quite interesting, I enjoyed it a lot (especially due to fact that I could work with ray-tracing). If you want to try it - go ahead and try playing the game.
  15. Hodgman

    Bare bones AAA team

    It's an actual thing -- the category of indie games that cost $1M, approaching AAA style content, but with indie teams (as opposed to the indie teams that are closer to hobbyists). https://medium.com/@morganjaffit/indipocalypse-or-the-birth-of-triple-i-eba64292cd7a https://www.gamesindustry.biz/articles/2018-05-02-an-era-of-triple-i-development-is-almost-here 2 people for 10 years / 10 people for 2 years / 20 man-years is more likely a triple-I game, not a AAA game.
  16. _Silence_

    OpenGL ViewPort Matrix

    Sorry. Could you explain more clearly what you exactly want to do ?
  17. Hi everyone, I hope it is not too late for a submission: Project: Thank you!
  18. Yesterday
  19. Hello there! This blog post serves as a post-morten of sorts for my latest game: PulseHazard! PulseHazard is a DOOM clone, built to replicate as close as possible the DOOM style of gameplay and atmosphere as and entrant to the GameDev.net August Challenge. This was my first time using Godot, and that brought it pros and cons: Pros: Godot is REALLY easy to get started with, the editor is a mix of Unity/Game Maker and has a node tree organization system that makes communication between nodes very simple. Godot supports several languages, but I stuck with GDScript, it is the more documented (more on that below) and has an easy to understand syntax. Its API has several ready to use functions for common tasks such as game pause Cons: Using Godot for anything 3D (even as simple as this game has) is a chore sometimes. Importing models from Blender can take some serious work (tip : always use the gltf exporter, over the Collada or Godot solutions) and be prepared to reassign all the textures if you plan to do so. The editor is somewhat unstable and some weird bugs can occur, such as your nodes moving out of place without your consent. Also, the documentation is seriously lacking. To the point that some examples are really old and don't work anymore. On the bright side, the docs are, along with the engine itself, open source. So, if you are up to the task, you can make changes and fix some issues with the editor, renderer etc. Replicating the DOOM experience was really ease, thank to the extensive documentation about the original game, easily found on the internet. From enemy behaviors to graphic related parameters, anything can be found quite easily! In order to make this project, I barely played the original game, to be honest. However, I'm fully aware that some aspects of my game will not replicate 1:1 to the original DOOM because of that. The hardest part to get right was definitely the 8-sided sprites. Godot offers dot product calculations to help with that. However, 3D math was never my "forte", ao I still thing this is one of several aspects that still need work. I also had problems with the Shotgun spread shot, but I didn't have time to finish it before the Challenge Deadline. So that's it! I plan to keep working on this project and, who knows, maybe turn it into a commercial game someday! Please, check PulseHazard and have fun! Any feedback is appreciated Have a nice day! Bye!
  20. emanubit

    PulseHazard

  21. Euthyphro

    Duel (card game)

    Here is some padding-trickery to maintain a fixed-aspect ratio in CSS only. If you would like some help with the UI, I have some experience in flex box and CSS magic. https://stackoverflow.com/questions/1495407/maintain-the-aspect-ratio-of-a-div-with-css
  22. gametable

    Dots and Boxes

    Tabletop Dots and Boxes is gametable's third game. Dots and Boxes is a fun and simple classic pen-and-paper game for 2 or more players. The game starts with an empty grid of dots. The grid can be any size and Gametable's Dots and Boxes has a handful of board sizes to choose from. Players take turns connecting 2 unjoined horizontally or vertically adjacent dots. A player who completes the fourth side of a 1x1 box earns one point and must take another turn. The game ends when all lines are drawn and boxes are claimed. The player with the most points wins. If more than one player has the same high score, the game is a tie. Features: Up to 4 players 4 computer difficulties to challenge Different board sizes to choose from A number of fun game board themes Automatic game saves so you can come back anytime Neato Programming Notes Creating a challenging AI for this game was... hard. It turns out that a simple Minimax or Negamax based solver doesn't work well as an AI for more than 2 players. We had to do quite a bit of research to find an AI approach that would work well. We stumbled upon a little known algorithm, Hypermax, that did the trick. Additionally, the game state tree for even a fairly small dots and boxes board is absolutely massive and pretty much unapproachable for real time AI. We spent the majority of coding time on this project figuring out how to reduce the search space with intelligent move generation, ordering, and culling. The AI turned out pretty great and is extremely challenging even in two player mode. We're extremely proud of this technical achievement.
  23. Hey GD.net community! We're excited to have joined and be whipping up a first blog post to announce release of our Dots and Boxes game. A little background about us, gametable.org. We're a non-revenue side project game site created by a few friends honing their game development skills. We don't show any ads and don't have any intention to in the near future. Most of our games will likely be parallels of classic real world games or modernizations of simple old school computer games. Now on to Tabletop Dots and Boxes- This is one of our favorite childhood games. When we learned that we'd all played it on pen and paper as kids, we figured it would be fun to take it digital. We kept the UI and SFX relatively simple, stealing the overall look-and-feel from our previous two games. Where we stretched our legs with this game is artificial intelligence. We poked around on the web and found a number of existing dots and boxes games, the best of which offered play for up to four players. We thought this was a nice touch and decided to tackle it ourselves. 4 player pass and play was easy, but creating an intelligent AI that wasn't overly paranoid and ran in a relatively small amount of time was difficult. We tried a number of classic approaches using minimax, then negamax, then negascout. All three suffered from acute paranoia. After way too much time hunting we found an extension of minimax, Hypermax, that solved the issue. To our surprise this algorithm was employed in a 90's NES game called "Spot." Spot is based on the 1990's 7-UP mascot and is 2+ player connect four style game. Playing it is on our todo list. Hypermax is so similar to minimax with ab pruning that we had a little trouble implementing at first. We kept making assumptions about how it works. When we eventually landed on a working version of the AI, the solution was stunningly simple and elegant. If you want to talk about it, shoot us a message. Even with Hypermax, getting the AI to hit deep evaluation depths with limited evaluation time was still a challenge. The game state search space for even a small dots and boxes board is massive. Toss 4 players into the mix instead of 2 and the evaluation overhead just goes up. The first thing we did to overcome this was move all of our AI code out to a web worker to take the load off the rendering thread. Next, we spent weeks identifying intelligent move generation, ordering, and culling rules to dramatically reduce the search space. If you give the game a go on a larger board size with 4 players you will still see it take a moment to generate an AI move when game is about 1/2 complete, but its well within tolerable levels for a player. We're super stoked about the AI we came up with for Dots and Boxes. Its a heavily studied problem and a number of excellent AIs exist but not many that run in real time and pose any real challenge. We believe ours does and haven't seen a better one out there yet. Give it a shot and let us know what you think. Looking forward, we'd eventually like to add multiplayer support, but that is a ways down the line. More new games first! What classic games should we build next? Cheers, Gametable.org
  24. Erz0

    Mobile Flappy Monster

    📹Trailer📹 Flappy Monster is back with a Remastered Version , new mechanics, graphics and rewards are waiting for you to come back.Touch and Fly , simple as that , mentain the rigidbody velocity of the flappy monster and get into a world full of danger. OZN , ASTEROIDS. You must protect yourself from danger !Don't worry , you have unlimited Ninja shurikens to throw into obstacles 1.0.1 VERSION NEW Features • NEW LEVELS• NEW MECHANICS• NEW GRAPHICS• POWERS• COOL MUSIC• MENU REMASTERED• AUTOMATIC SAVING PROGRESS• SHOP• FREE COINS FOR A FUN START • COLLISION UPDATEDLinksAPP LINK: https://play.google.com/store/apps/details?id=com.erzo.flyingmonsterarcade DOWNLOAD IT FROM GOOGLE PLAY Contact us at erz0development@gmail.com for errors, suggestions, business and privacy policy.
  25. The Load/Save code is confirmed working, even with the cities and AI. So now the game state can have progress! Also, we have our first two multiplayer tests. The first was local and because of a bug, could only do three people. The second lasted for 3 hours and had 6 people (thank you testers!), and was done over the internet (which was actually a first!). There were no complaints about performance or lag, so I think the networking code is working well. There are two known bugs that need to be tracked down, but such is development. They weren't critical enough to stop a lot of melee battles in space! Both pulse based and beam based ships were tried out. A lot of good feedback was had, and everyone enjoyed themselves. Currently, it was simply dog-fighting in space. However, the biggest comment was how one got destroyed. Meaning, depending on what got hit, a person might lose a weapon (or all of them!) and limp along. They would experience the controls freezing when their engines exploded but didn't kill their ship, etc. So it felt more like dying by pieces rather than all at once, so it was a fresh experience. Some of the feedback was taken to heart, so some of that is the screenshots enclosed. One was a sense of movement. So that got implemented by green “grid lines” as shown. Also, whatever is targeted now has a listing of who owns that object (building or ship). So it makes it easier to know which if your friends you are blowing up! Other code additions have been getting the camera working again so that some of the “out of body” screenshots are now possible again. More to the point, the collisions with the ground with ships and weapons now works correctly finally. As shown in the screenshots, the ship one is flying is smaller than one thinks. The lighter blue triangles are showing the progression of the beam across the surface of the planet if it was perfectly smooth. The darker blue triangles are the same triangles as the lighter blue, but follow the terrain. In the end, you can see where the impact is on the ground. These beams are from an older design that had a longer than usual range. I look forward to more multiplayer testing and scenarios as time moves forward. Hopefully there will be some videos of that at some point. Full story »Original post blogged on Rank: Warmaster Dev Blog. View the full article
  26. RickBaker

    Bare bones AAA team

    I am not talking off the shelf assets but graphics our designers have already made.
  27. ProjectTaival

    Dev Diary #041 - Slicing Images

    You are most welcome, I'm glad it helped you out
  1. Load more activity
  • 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!