• Content Count

  • Joined

  • Last visited

  • Days Won


Everything posted by Antriel

  1. Still in development and the editor is effort by single person, but seems to be quite close to unity. Although it obviously can't compare in size. It uses as platform, which seems to have pretty solid coverage and quite big effort behind it.
  2. Admob is for mobile apps, not html5 games.
  3. Unfortunately I don't see much into it, but to me it seems more like chrome actually trying to handle HDR, but due to some issue its using wrong setting (e.g. telling the driver it supports 10b, but doesn't send it, or something). I really have no idea, but it's more likely a case of misconfiguration and will hopefully be resolved eventually.
  4. I meant that not even google offers reward ads.
  5. Google does offer reward ads for games? As far as I know they only have video and full-slot ads.
  6. Maybe this?
  7. Yeah I can imagine how that can be pretty annoying. Not sure about keyboard movement. Explaining and getting used to 6 buttons would be a bit difficult. Using 4 in zig-zag pattern might take away the "automatic subconscious" movement people are used to. But it's definitely something to think about and implement. Thanks
  8. Without authoritative server, you can only get so far. You need to hide the score value in memory and apply some sort of encryption when sending the values. That's all just obfuscation though and won't stop anyone (though it should make it difficult enough so it doesn't happen). Hiding the score value means something like scattering it over multiple places in various forms, to prevent it being easily changeable in CheatEngine (or any other memory hacks). Encrypting the sent data could be sending alongside the score also salted hash of it, where the salt calculated and never kept in the memory for long and its generation is heavily obfuscated. Even with all that, it's still quite simple to find where the score is applied to the salt and then sent, so with the right breakpoint in debugger, cheater could still change it relatively easily. Maybe some sort of clever math function so that the actual score value won't be ever used directly (rather calculated from different sources, where you can check if the resulting value is valid). But that still only makes it a bit harder, not impossible.
  9. Thank you guys Yes, the trick is simple. You can never actually touch enemy's tiles with yours. Once you own a tile, you can click on its neighbors, if those neighbors were owned by someone else, they lose the ownership (the tile stops being owned by anyone, but is accessible to both you and your enemy to click on). The mines are redistributed randomly based on how many mines there is and how many should be. This can cause to change numbers for the enemy, but that doesn't matter as any decision they might be in the process of making won't be affected.
  10. Antriel

    By the way, AWS Lightsail has similar pricing to Linode, just less RAM.
  11. Some additional resource regarding how to implement that:
  12. Multiplayer online hexagonal minesweeper. Fight against other players, claim your area and steal theirs in a massive world. Reach the top of the leaderboard by having big score. Claim as much of the world as you can for yourself in this puzzle iogame. Play the game here: Developed entirely in Haxe, using pixi.js for rendering, nodeJS with uws for server. Feel free to ask me anything
  13. I can recommend The Art of Game Design: A Book of Lenses.
  14. The actual dimension matters. When the atlas is loaded it's decompressed from whatever format it is (png, jpeg) into pure bitmap (well, some gpus are able to use certain compressions natively, but let's not go there). That means your bitmap font will take exactly the same memory as any other atlas of the same dimensions. Afaik, the dimensions matter only for GPUs, i.e. webgl mode. They have a certain max size that they support, which makes sense if you think about how GPU works.
  15. Just keep in mind that scaling by throwing better hardware at the problem isn't really scaling, and has its limits while being lot more costly than actual scaling (i.e. spreading the load on multiple boxes). Properly scaling multiplayer games is pretty big and complicated topic (and usually includes things like low latency fault tolerance and moving players between machines).
  16. We published this game over a year ago, but I entirely forgot about posting it here. It's a cute physics removal puzzler. Created using Flambe in Haxe with Nape physics. Art made using Flash. Save the Ice Cubes in this physics puzzler with unique twist. [puzzle, removal, physics]. Play Here Feel free to ask about anything about this game. The game is also available for non-exclusive licensing. Please contact me if you are interested.
  17. @Julz57 Yeah certainly as long as the CFF you mentioned is met, it will work (as in the 3d stereoscopic effect will be achieved). All I wanted to convey is that going above 60 FPS is certainly worthwhile and that modern VRs certainly don't work on 30 FPS. There's a difference (which you did explain even, so I'm sure you understand it better than me - again, just bluntly and succinctly repeating it for the sake of people who don't read with understanding), between 30 FPS low res stereoscopic 3d and VR headset that adjusts the reality based on the head movement. To reiterate, going above 60 FPS in general gaming is good. Stereoscopic 3d needs 60 fps per eye to look good and VR needs 90 fps per eye to not cause too much motion sickness.
  18. As far as what Phaser does -> it will try to use RAF, which will trigger as fast as hardware allows, basically syncing the update loop with display refresh rate (assuming atomic updates). This is usually 60 Hz, but it can really be anything, even 160 Hz or more in the future. We should also keep in mind that freesync, gsync and hdmi 2.1's VRR exist and can allow for intermediate values (e.g. relatively stable 75 Hz or 90 Hz or anything really). As for going over 60 FPS being pointless, I disagree. The difference in perceived smoothness between 60 and 120 FPS is extremely visible for majority of the population. There's plenty about this on the internet. About VR, the modern VR headsets use 90 Hz for both eyes. Older stereoscopic displays needed 120 Hz to achieve 60 Hz per eye. I'm not aware of any TVs actually using 30 Hz per eye. At the very least nvidia's 3d vision always required 120 Hz display. Web VR will once again use device's RAF and therefore run as fast as hardware allows (typically 60 Hz on mobiles and 90 Hz on desktop headsets for both eyes).
  19. For simple static site hosting, amazon web services will cost few cents (literally). It's not even that difficult to setup. And if you didn't use it so far, it comes with pretty big free limits for the first year, i.e. basically free.
  20. This guy also tries to push something like that forward:
  21. Looks pretty good! I would add client side prediction (with reconciliation) for the movement. For shooting I would leave it without prediction, just add some animation so there's immediate feedback for the player.
  22. Were they? IIRC they were not by default. Unless you used the optional parameter to set it as a weak listener and the object was gc-ed. Although in case of buttons, they indeed would not trigger (because they weren't in display list). The listeners would stay there though. Not sure how Phaser does it, but I expect the listeners to stay connected (although possibly not triggering as you can't really 'inputOver' them). Maybe `group.destroy()` will work? Not sure
  23. Another devlog and it's a big one! Multiplayer Platformer Log #5 – Entity Interpolation Explaining entity interpolation. Implementing client-server synchronization using phase-locked loop. Talking about server update loops. And lot of shared code. Finally some worthwhile gif – moving around on a real server with ~200 ms ping:
  24. I asked @hexus and apparently Tilemaps can solve this issue for you. You will have to change how you create the map to use the Tilemap API instead. Unless you want to have levels that don't always fit in a grid, this should work nicely.
  25. Antriel

    Multiplayer desync

    server.js line 55: You use for loop, but then use `inputs.shift()`, which manipulates the array in place. Maybe it's different in JS, but you probably want to use `while(inputs.length > 0)` instead of the for loop. Otherwise you might have issues once there's more than 1 input at a time. I strongly recommend to refactor the code, so that game logic that's shared between the client and the server is separate and shared. You should use the same code to apply update on a player instance on both. This removes code duplication and down the road will save you lot of headaches (that code duplication almost always causes). On the client side you cache all the inputs in `updates` array forever it seems. There's no reason to keep the confirmed inputs, they can be thrown away. I suggest using some big enough circular buffer instead. As for the actual trouble you have: I'm not 100% sure, at first I thought you weren't properly syncing the `lastBoost` variable, but that one is part of the inputs (which might not be a good idea either, see below), so it should work properly. The only thing I noticed is that it seems you apply the last input twice on the client. First you push it to the `updates` and then you iterate all updates and then once again apply this latest `data` update. Maybe this isn't the cause of the issue, but certainly something to check. I recommend inspecting values and trying to find out at what point the reconciliation result becomes different than expected. Regarding sending `lastBoost` and `time` as part of the input data to server: If the server is supposed to be authoritative, all that should be sent are the inputs and the server should simulate it all. Otherwise what stops me from saying my `lastBoost` time is constantly 0 even though I am boosting? Even the delta time shouldn't really be sent, although that is a design decision that might be needed if you need perfect reconciliation results. I do in my game and I went about this in a slightly different way (constant timestep). You can read about my approach on my blog: While it doesn't yet solve all the issues like time synchronization and entity interpolation, that article should come next week