Jump to content
  • Advertisement
    1. Today
    2. FordPerfect

      Mathematically ideal field of view

      And then there's also virtual reality, where straying from "physical" FOV might be a Bad Idea.
    3. wintertime

      Multiplayer networking for modded open source game?

      Another problem would be map hacks and similar. If all hidden information is on the client, it can be revealed much easier.
    4. Well to be honest I haven't really thought of threading anything at this point, but yes, that is fair point. The thing I'm skeptical of this as well, that's why I asked, but it just seems such a straightforward way of doing the job that it's really tempting to use, are there any alternatives that don't rely on global state that would also work?
    5. What if you actually want two groups of listeners that get called in different contexts? How are you going to handle the case where you're constructing and calling listeners on multiple threads (eg. we enter vector's push_back on both threads at the same time)? What happens if a listener is in the middle of doing something unrelated on another thread when _Listener_UpdateAll is called? Is Listener responsible for unregistering itself, and if so, how are you going to ensure that classes implementing its interface actually do that? This isn't the worst possible use of global state, but I'm with All8Up in that we should generally be skeptical of global state. I would also say that having to call Update manually is a feature not a bug. In general you will find it easier to read, understand, and debug code where the control flow and data dependencies are explicit.
    6. Can you give an example of a possible way an error could effect the global state with the code I have shown? I'm just not picturing it. Also how can I eliminate the coupling altogether (and increase cohesion) of the model I've provided? Thanks, that's actually a much better way to do this. I've changed my code to reflect this. The reason I was doing it this way was because I thought that I needed to save the derived class's pointer (by casting it to a base pointer first) to make the correct virtual call. But I tried it and this works too (and now I don't have to manually invoke the base constructor on every derive, which is great). Can you explain why this works though? Also can you tell me why you're using emplace_back instead of push_back, from what I looked up its functionality is identical.
    7. khawk

      Gamedev api?

      On that particular item - latest topics on the front page - if you select the blue drop down that defaults to "Activity" and select "Forums", you'll see the latest topics. Same as going to the Forums tab on desktop. I know it's an extra step, but it will get the view you want for new posts/forum activity. The "reboot" I referenced is a complete review of these types of things. I'm hoping to have more to share on this in the coming months, depending on progress.
    8. VanillaSnake21

      Gamedev api?

      You mean particular functionality? Nothing out of the ordinary, something akin to reddit's api. Allow posting on user's behalf, allow deep queries, profile management. All the basics, but of course, the more functionality the better.
    9. CrazyCdn

      Gamedev api?

      @khawk Going to back only having the latest post on a topic on the main page, none of this 10 repeats on the same thread would be fantastic! Makes scrolling through to see new posts horrible on my phone. Honestly I flat out refuse to look at the site on my phone anymore unless it's to view replies to threads or PMs. Otherwise I will only view the site on my desktop.
    10. No way! I'm a fan, I actually own AO Tennis. If they're willing to answer fan mail from a hobbyist developer, I'm wondering if I could ask them a bit about their engine and animation system. But this might also be a conflict of their interests.. My burning question is will they make a sequel or continue building on the existing game? I'm guessing it's the former. Here's my WIP so far -- made 5 animations in a diamond shape (1 on each point + 1 center), and drew a circular hitbox since the racket face is large enough to round out the diamond's edges. Anything outside of that hitbox will require a different hitting anim, while anything within this hitbox counts as a safe clean hit and would look right. However this only works for the X/Y axis for balls where the player is stationary. For X/Z, I'm planning lots of different footwork patterns to account for z distance to the ball like approach shots and retreating shots. So far, so good! Really fun implementing the ideas we discussed.
    11. In this instruction we will study how to write executable specifications for a very simple Calculator project using Jasmine testing framework. Source code on GitHub: https://github.com/8Observer8/calculator-browserify-ts If you do not have "browserify" then install it globally using this command: npm install browserify -g Note. You can read about why we need "browserify" in this project in my instruction here: Browserify TypeScript Create the folder "calculator-browserify-ts" and install the necessary package: npm init -y npm i -D @types/jasmine Search in the Internet: jasmine cdn. Create the "SpecRunner.html" file and copy founded CDN links to it: SpecRunner.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Jasmine Spec Runner v3.3.0</title> <link rel="shortcut icon" type="image/png" href="https://cdnjs.cloudflare.com/ajax/libs/jasmine/2.0.0/jasmine_favicon.png"> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jasmine/3.3.0/jasmine.min.css"> <script src="https://cdnjs.cloudflare.com/ajax/libs/jasmine/3.3.0/jasmine.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jasmine/3.3.0/jasmine-html.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jasmine/3.3.0/boot.min.js"></script> <!-- include source files here... --> <script src="dist_client/bundle.js"></script> <!-- include spec files here... --> <script src="dist_specs/bundle.js"></script> </head> </html> Let's describe specifications for our calculator. The calculator will have four operations: Add(a, b) Sub(a, b) Mul(a, b) Div(a, b) If "b == 0" then method "Div" will throw an exception with the text: "Divided by zero". Create the "src_specs" folder. Create the "calculator_tests.ts" in the "src_specs" folder Create the "src_client" folder. Create the "calculator.ts" in the "src_client" folder Let's create the first specification in the "calculator_tests.ts": import { Calculator } from "../src_client/calculator"; describe("Calculator", () => { it("Add_PositiveNumbers_ReturnsSum", () => { // Arrange let a = 9; let b = 1; let expectedSum = 10; // Act let actualSum = Calculator.Add(a, b); // Assert expect(actualSum).toBe(expectedSum); }); }); We could try to compile it but we cannot because we do not have the "Calculator" class. Let's add it in the "src_client" folder: calculator.ts export class Calculator { public static Add(a: number, b: number): number { return a + b; } } Add the "tsconfig.specs.json" file in the root of your projects: "tsconfig.specs.json" { "compilerOptions": { "sourceMap": true, "outDir": "dist_specs" }, "include": [ "src_specs/calculator_tests.ts", "src_client/calculator.ts" ], "exclude": [ "node_modules", "src_client" ] } Now we can compile and browserify the specification. Enter two commands: tsc -p tsconfig.specs.json browserify dist_specs/src_client/calculator.js dist_specs/src_specs/calculator_tests.js -o dist_specs/bundle.js You can add these commands to the "package.json" file in the "scripts" section: "scripts": { "build_specs": "tsc -p tsconfig.specs.json", "bundle_specs": "browserify dist_specs/src_client/calculator.js dist_specs/src_specs/calculator_tests.js -o dist_specs/bundle.js", "test": "echo \"Error: no test specified\" && exit 1" And you can run these short commands: npm run build_specs npm run bundle_specs Open the "SpecRunner.html" in the browser and you will see that the specification will run. Try to add another specifications for: Sub, Mul, and Div methods. Later I will add specification for "Divide by zero" exception.
    12. It is the most common problem for anyone who starts to study TS. They cannot include a few ".js" files after compilation to <script> tags in "index.html". It is very simple in JS. You have two files in JS and you can include them in "index.html": index.html <html> <head> <script src="js/sayHello.js"></script> <script src="js/main.js"></script> </head> </html> sayHello.js function sayHello(name) { console.log("Hello, " + name); } main.js function main() { sayHello("Ivan"); } window.onload = main; Output: But if you rewrite these files in TypeScript: sayHello.ts export function sayHello(name: string): void { console.log("Hello, " + name); } main.ts import { sayHello } from './sayHello'; function main(): void { sayHello("Ivan"); } window.onload = main; And if you compile them to JavaScript: tsc ts/main.ts ts/sayHello.ts --outDir "dist" You cannot just include this files in "index.html": <html> <head> <script src="dist/sayHello.js"></script> <script src="dist/main.js"></script> </head> </html> You will see this errors in the browser debug console: There are a few ways to solve this problem: You can concatenate all generated ".js" files in one bundle.js file using: Webpack, Gulp, Grund and so on. For example, see this official instruction: Gulp - TypeScript You can compile to AMD modules and use RequreJS to load them. For example, see my instruction: A few TypeScript files on Sandbox You can use Browserify to concatenate all generated ".js" files in one bundle.js file I will show you how to use Browserify. Install Browserify using this command: npm install browserify -g You can create bundle.js using this command: browserify dist/main.js dist/sayHello.js -o dist/bundle.js You will see "bundle.js" in the "dist" folder. Now you can include "bundle.js" in "index.html" using <script> tag: <html> <head> <script src="dist/bundle.js"></script> </head> </html> Open "index.html" file in a browser and you will see "Hello, Ivan" in the browser debug console. Bonus. UglifyJS You can install uglifyjs: npm install uglify-js -g And compress your "bundle.js" to "bundle.min.js": uglifyjs dist/bundle.js -o dist/bundle.min.js Do not forget to change a script name from "bundle.js" to "bundle.min.js" in "index.html": index.html <html> <head> <script src="dist/bundle.min.js"></script> </head> </html>
    13. khawk

      Gamedev api?

      Yes, there are plans for this that are part of a broader reboot. An official mobile app has also been looked at, but temporarily shelved for other priorities. Along those lines, if GameDev.net offered APIs, what would be of interest?
    14. There is a few TypeScript files in our example. We want to place these scripts on Sandbox. This is the result on the Sandbox: click. Open the debug console in your browser to see the result: "Ctrl+Shift+J" in Chrome. You will see in the debug console this messages: Create these files on Sandbox: https://plnkr.co/edit/ Program.ts import { Rectangle } from "./Rectangle"; export class Program { public static Main(): void { // Create a rectangle let rectangle = new Rectangle(); // Draw the rectangle rectangle.Draw(); } } Program.Main(); Rectangle.ts export class Rectangle { public x: number; public y: number; public constructor(x: number = 0, y: number = 0) { /* ... */ console.log("Rectangle was created"); } public Draw(): void { /* ... */ console.log("Rectangle was drawn"); } } We need to compile these files to AMD. For this, create the "tsconfig.json" file on the Sandbox: tsconfig.json { "compilerOptions": { "module": "amd", "outDir": ".", "sourceMap": true }, "include": [ "*.ts" ], "exclude": [ "" ] } Create the RequereConfig.ts file on the Sandbox: RequireConfig.ts requirejs.config({ baseUrl: "." }); requirejs(["Program"], (Program) => { }); Add "require.min.js" in the "index.html" file: index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>A few TypeScript files on sandbox</title> <script data-main="RequireConfig" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js"></script> </head> <body> <h3>See the console output. Press "Ctrl+Shiprt+J" in the Chrome browser.</h3> </body> </html> This is the result on the Sandbox: click. Open the debug console in your browser to see the result: "Ctrl+Shift+J" in Chrome. You will see in the debug console this messages: P.S. If you need to work locally you need to run these commands: npm init -y npm i -D @types/requirejs P.S.S. Read this book to learn more about AMD and RequireJS: Mastering TypeScript - 2nd Edition - Nathan Rozentals
    15. Yesterday
    16. Daniel Ricci

      Win Animation

      In my last post, I presented the Autocomplete feature that I implemented. This feature lets you right-click anywhere on the board, and all face-up top-most cards will attempt to put themselves in one of the four Foundation piles above the board. I also mentioned a handful of bug fixes that were done. This next and final feature that I will demonstrate here is the `Win Animation` feature that occurs when you win the game or push the Alt+Shift+2 key combination. The `Win Animation` is an animation that is played when you win the game. That is when all the cards are properly situated on each of the four Foundation piles above the board. The animation starts at the left-most pile, ending at the rightmost pile for each group of cards (Kings first, then Queen, Jack, 10, etc). The path that the card follows is similar to a sine/cosine wave. Each card has a wave randomly generated that fits within a specified period. These choices are limited to a set number of choices based on my observations of the original game, and there are quite a few randomly generated choices that can occur. I originally started prototyping this functionality using vanilla trigonometry, however, I found an implementation online that I felt was much simpler to implement, and that had much better readability for those not so fluent in the way of mathematical formulas. The implementation that I retrofitted into my game is the one from `Mr. Doob`, you can find the link to his code here. This is what the win animation looks like in my game (The animation is slow because of the recording software that I use, it is about twice as fast as this in RL) There are a few parts to the code to make this work, and I will explain the major players of this process in snippets below. For me to implement this animation I first created a class called `WinAnimationHelper` to manage the animation process. This class has a static method called `processCards` that gets called when someone wants to process all the cards on the Foundation piles (called when the game winning condition has been met). /** * Process all the cards held by the foundation views */ public static void processCards() { // Get the list of foundation piles List<FoundationPileView> foundationsList = AbstractFactory.getFactory(ViewFactory.class).getAll(FoundationPileView.class); // Reverse the list so that we start with the left-most pile. Collections.reverse(foundationsList); // Initialize this helper class initialize(); // Populate the queue of items to be processed _foundations.addAll(foundationsList); } Of interest is the `initialize()` method that I call above. This is a private static method that creates a timer that processes a field called _foundations at a rate of 80 times per second. After I perform a call to add the available foundations to the queue this timer will start to process them in a first come first serve fashion. For each foundation pile that it processes, it will grab the top-most card and create a WinAnimationHelper object, passing in the card that it received. Here is what the constructor of this class looks like. /** * The change in `x` over time */ private double _deltaX = Math.floor(Math.random() * 6 - 3) * 2; /* * The change in `y` over time */ private double _deltaY = -Math.random() * 16; /** * Constructs a new instance of this class type * * @param cardView The card view to animate */ private WinAnimationHelper(CardView cardView) { _cardView = cardView; Point position = cardView.getParentIView().getContainerClass().getLocation(); _x = position.getX(); _y = position.getY(); if(_deltaX == 0) { _deltaX = 1; } } The above code will first initialize the deltas for this card. For the rate of change on the X-Axis, the domain of available values are from [-6, 4]. For the rate of change on the Y-Axis, the range of available values are from (-16.0, 0]. I also handle an edge case where if the change in X is 0, I set it to 1 so that there is at least some movement along the X-Axis. After the object is constructed, my timer that created the object calls the method `update()` for each tick until the update can no longer occur because the card is out of bounds of the canvas dimensions. Here is what the method looks like. /** * Performs an update by performing both a next step point calculation and a draw routine * * @return TRUE if the operation was successful, false otherwise */ private boolean update() { Point point = calculateNextStep(); if(point == null) { return false; } draw(point); return true; } The above code is very straight forward, calculate the next location of the card, and then draw to that point. Here is the `calculateNextStep()` method. /** * Calculates the next position that the currently set card will be at * * @return The position associated with the next step where the card would be at */ private Point calculateNextStep() { // Take the change in X and the change in Y and apply them respectively _x += _deltaX; _y += _deltaY; // If you are outside the left or right canvas limits then the card should not // longer be positioned anywhere relevant so do not return any position if(_x < -CardView.CARD_WIDTH || _x > _canvasWidth) { return null; } // If the position is outside canvas height (with respect to the bottom of the card) if(_y > _canvasHeight - CardView.CARD_HEIGHT) { // Normalize the position of the card by placing it on the theoretical bottom of the canvas _y = _canvasHeight - CardView.CARD_HEIGHT; // Take the change in `y` inverse it, this along will cause the card to bounce upwards // Take only a small percentage of the delta so that it bounces less _deltaY = -_deltaY * 0.85; } _deltaY += 0.98; return new Point((int)_x, (int)_y); } The above code takes the currently computed deltas and adds them to the current x and y positions that were recorded by the card. If the `x` location is outside the bounds of the canvas then there is no more computation to be performed, this is our exit case. If this is not the case then I check to see if the `y` position is outside the lower bounds of the canvas. If it is, I position the card at the absolute bottom of the canvas and then I apply an inverse linear force to the current deltaY. This will cause the card to move upwards, however, only upwards by a certain percentage. This is an ever decreasing number that will simulate a `bounce` and that will eventually flatline itself with the y-axis if this statement is executed many times. Finally, I update the deltaY with a constant to ensure that the change in `y` counteracts the `bounce` effect. Once this is computed I perform a draw. Here is what the draw call looks like. /** * Draws the currently set card view to the specified position * * @param point The position to draw to */ private void draw(Point point) { CardView cardView = CardView.createLightWeightCard(_cardView); cardView.render(); ViewFactory viewFactory = AbstractFactory.getFactory(ViewFactory.class); GameView gameView = viewFactory.get(GameView.class); gameView.add(cardView, gameView.getComponentZOrder(viewFactory.get(StatusBarView.class))); cardView.setBounds(new Rectangle(point.x, point.y, _cardView.getWidth(), _cardView.getHeight())); } This was tough because I really wanted to just change the position of a single card and reuse the same draw buffer for performing the draw call just like in the original game. Doing this however was not possible because the layout manager that I am using is a Swing manager called GridBagLayout, and it was showing many artifacts that were making this functionality look horrible. So instead, for each point that I calculate I create a lightweight representation of the specified card view which is in layman terms a JPanel with an image. I take this card and I update it to the position that I calculated previously. I also make sure that it is added to the GameView and that it is positioned at the proper z-position. The finishing touches for this feature were to make sure that clicking anywhere during the animation or pressing on any key stops the animation and asks you if you want to play again, this is in line with the original game. So that is how I implemented the win animation. I also fixed a few more bugs, that I will outline below 1. performing an undo doesn't undo the score, it just subtracts 2 https://github.com/danielricci/solitaire/issues/164 2. Performing an automove no longer updates the score https://github.com/danielricci/solitaire/issues/155 3. Cannot perform an undo after doing an Autocomplete https://github.com/danielricci/solitaire/issues/153 The next thing on my list is to normalize the UI and I have a couple of bug fixes left to do. You can always follow my progress by following the game located at https://github.com/danielricci/solitaire, and if you have any questions I will do my best to answer them. Take care, until my next blog post.
    17. I've decided to devote a bit more time to improve my 3D skills and had attempted to use the prior GameDev challenges as an opportunity to do so. Sadly I don't think it's a good way as I end up spending a bit too much time working on graphics and less time actually completing the challenges themselves which kills a lot of my motivation to do the challenges all together... (I don't like starting something I cannot finish). I made a post on the hobby section offering to work with anyone doing a non-commercial project: If I can find someone to work with then I'll be posting my progress on my blog which will be welcomed to any feedback as I really want to improve my ability to make great assets. Later I'll be working on my own challenge projects which will be short term. I'll post about that when ready.
    18. I've been primarily programming in the last two decades but I've been working on getting my 3D skills up and running since about two years ago. I've done art on and off prior but nothing great. As a way to improve my current skill sets I'm willing to offer the following for a single non-commercial project (combined not separate): - 3D Modeling (will create low poly versions from a high poly and bake) You will be provided with the low poly plus relevant texture maps to use - Texturing (PBR) - Rigging + Animation If anyone is looking at making a 3D game for fun send me a link or information regarding your project and I'll see if it's something I can jump on board with. Keep in mind that my work is not for commercial use, and I'm not interested in any rev share projects. I only ask for the following: - I maintain full rights to all my work and I can post and use any of the assets anywhere at anytime without limitation regardless of your project being a WIP, or not released yet. I'm simply allowing you to use them for non-commercial use with credit to myself as per below, but restricted to the project in which they were made for. (all assets provided with come with a restrictive non-commercial license) - Any reference to my work displays credit to me and links back to my profile here on GameDev.net - None of my work is used by you in any commercial capacity, and outside of the original project in which the assets were provided for - I'm not involved in anything but doing graphics (I'm using this as an opportunity to improve my 3D skill sets, not to program or do anything else) This is perfect for someone working on something for fun on the side, or if you're a programmer using Unity or Unreal but would like an artist to work with as you learn. Once the project is done, or has seized to continue for whatever reason I will post back here looking for more projects to work on. My limited gallery can be seen here (most of these were all made within a short period of time during challenges here on GameDev):
    19. VanillaSnake21

      Gamedev api?

      Are there any plans to develop an API for this site? Most major places have it at this point. It would also allow for construction of a mobile app, which is painfully lacking at the moment.
    20. Rutin

      DanceForce V4 DIY DDR Pad Build Thread

      Wow! You're a wizard @Promit Thanks for sharing this DIY guide.
    21. Watching Saturday morning cartoons with my kids (the old school way on cable TV), there's a commercial that comes up every now and then for this Earth Rangers website where they're doing some kind of "gamified" "save the environment" kind of thing. Any commercial I see during a kid's show automatically triggers a defensive avoidance filter and any hint of something "gamified" (I feel queazy just using the word) amplifies that significantly. However, it sounds as though it would be the sort of project that you're considering here, if not something to cover a wider set of social issues. I would suggest further research on other similar sites and projects currently exists (I would expect there to be several).
    22. I think what could be cool, would be if an organizer of a charity, food pantry, etc. could create something similar to a pokemon go hotspot, marking an area where people could potentially get points(by volunteering)
    23. I don't know if the group focus is so necessary. What about individual improvement, and through that, community or societal improvement? Self help points first and social help points second. Improve the world not by helping others in the immediate thought, but instead improve ones self and become productive, outspoken, active, considerate, intelligent and engaged. Through this method, society is improved or scales on each person being a better person and challenging ones self and from each person behaving this way, the world is closer to being saved. Focus on empowering ones self with the capacity to do better and cause change for the better, and the idea that each person can also be engaged in this process. I'm not saying that some people don't need help, a lot of people do need help and should be helped. The idea is that everyone should be engaged at changing society, and ultimately this begins with each individual person working on themselves.
    24. Catenary and textured rails. I think I'm on the right track! (pun not intended, but happily welcomed) This is also in the game engine already. Yes, from the technical point of view, this is exactly what I want to accomplish. Just less complex, since I have just one specific use case (railway tracks).
    25. If every client sends packets to every other client, then the number of packets scale by N-squared, which at 100 clients is already way past what you'd want to see. This is one of many reasons why peer-to-peer connected mesh networking topologies don't work for many-player games on the internet. If every client broadcasts their state (which only works on LAN, of course,) then the number of packets only scales by N, which is much better, BUT if there's a lot of non-playing client computers on the same network, all those computers/links will also see all those broadcasts, which may not be desired. Over the general internet, the model where each client sends a small packet to a central location (server) and the central location sends a aggregated packet to each client is the most network-efficient. On a LAN, you can do even better with one machine being the host, all clients sending their inputs directly to the host (not broadcast,) and the host broadcasting one packet with all the inputs for that tick to all the clients. It's the best of both worlds, in this case.
    26. hplus0603

      Multiplayer networking for modded open source game?

      Most RTS-es are done this way, because it's such a great match to the genre. It allows tons of units with not too much bandwidth. The one thing this model doesn't do well is "late joins," and the main cost of this model is having to correctly control for all possible sources of indeterminism. Some people think that this cost is a feature, because record/replay becomes very easy to implement, and good for reproducing bugs! You can just always have recording on in the background, because the total size of the record file will be small.
    27. 8Observer8

      c# console snake game

      This explanation does not depend on the language and how you draw squares. It is very short and it explains common approach to implement snake movement I copied this text from here: https://noobtuts.com/python/snake-game
    28. I'm working on an RPG and, right now, I'm just modeling environments. I'd like someone to handle the character models. Low polygon. Feel free to ask any questions.
    29. phil67rpg

      c# console snake game

      I am working with your code.
    30. Hi, I am currently learning 3D graphics using openGL, and I am trying to grasp the different viewing projections. Currently Orthographic. I think i am understanding it, but I just want to be sure, so hoping someone can let me know if I am wrong or not. So what I am trying to figure out is: Does the Orthographic viewing projection matrix get multiplied by each point in the viewing projection box, and that is why z = 0 in the projection matrix, because all the points are being brought to a 2D plane? Initially I thought that Z = 0 did not make sense since the viewing projection box was -1 to 1 in each dimensions, and I thought the matrix had to do with that.But that is wrong, correct?
    31. Sorry Embassy, not sure what needs expansion regarding NPCs and Organizations? i'll try. Most areas have a homeless shelter or food pantry or EPA offices or (the list goes on). These organizations generally have a coordinator, someone in charge. Having a mobile app the coordinator can use to draw volunteers for a time/date they need help with, would be infinitely valuable to them. Using the veneer of a game, wouldn't matter at all. Having an organizations event coordinator using the app, registering with the app as a point of contact for volunteers, creates an NPC in the Game app for the players. The players can get simple, everyday, "don't piss on your neighbor" types of quests from these in-game equivalents. The in-game NPC gets to a certain "reputation", or point in a quest line, and offers a real world contact. The player can pursue or not at their own leisure. After a short series of in-game coordinated quests that also involve individual effort with said organization, they can begin to utilize Team Quests that involve real world action verified with the organization's coordinator. This process would be repeated with every organization's coordinator. Vetting the coordinator becomes the hurtle to get over here. Edit: Oh Yeah, and this could become serious life lessons type stuff for the younger players. If you show up to volunteer then weasel out and not help, the coordinator can ban you, restrict you, leave feedback "Lazy" etc. other coordinators will see this... Essentially end up created an in game reputation section for each player. The reputation being reflected in the organizers app.
    32. Okay, we can work from there. For the high fantasy setting are you locked in to Tolkien style? If not I would recommend going the Witcher route, it can still be medieval European influenced and high fantasy, but instead of relying on the classic LotR and English tropes their world was based around Slavic mythology and had a very Eastern European feel to it. I'm not saying do Russian stuff because they did, it's already been done, what I'm saying is look at the different cultures there from about 1000-1500, earlier or later if you choose, then look at how they fought and what their units were named. I recommend Machiavelli's "Art of War", just like the better known Chinese counterpart it goes into the different types of units and how they were used. It focuses mainly on the different city states that would become Italy but it is the only comprehensive written piece on Medieval tactics written at the time it is discussing. So basically like the other poster said, for things like "knight" I would pick a culture that interested me, find what their equivalent of a knight was (landed gentry with authority given by a monarch with the expectation that they and their resources will be used to help that monarch if he so needs it) and try and write the qualities they were most known for into the unit. If the story and game is fleshed out already and the names are just a cherry on the sundae I would hold off on changing them, let the Beta testers name them because the name will directly relate to the experiences (most likely frustrations) they give players, it would make sense and be a little more creative than using a map and google IMO.
    33. Something I just thought of recently, if you have a lot of clients connected in your LAN network (say over 100), would sending your packets to the broadcast IP (assuming it's not blocked) be more efficient vs having each client send packets to every other? I would assume so because each client only talks to and listens from one IP, rather than having to iterate through all other clients IP addresses, but I'd love to hear your thoughts.
    34. markypooch

      Pygame - alternatives?

      Have you profiled? I highly recommend CProfiler if you haven't. Never optimize, or consider switching libraries until you have a consistent data backed narrative that supports your intuition. A lot of the times in pygame applications I see a lot of time tends to go in to needlessly updating the entire surface every frame. Also, by default, I believe pygame uses a software based surface, which can be quite slow, so make sure when initializing it, you pass the appropriate arguments (pygame.HWSURFACE comes to mind) Take a look at this SO thread, and see if it applies in your case: https://stackoverflow.com/questions/6395923/any-way-to-speed-up-python-and-pygame TLDR; you can do some pretty intense stuff with PyGame, but there are performance traps that you'll want to be aware of, and profile for. PyOpenGL is also actively maintained, and easy to pick up and run with if your express goal is to do only 2D with it. I won't feed you the party line however about using modern gl, and that if you use any legacy functionality you'll die of cancer in three years, and your girlfriend will dump you, but I do recommend it despite how easy it is to get legacy GL to do something initially.
    35. Also, don't make the, frankly quite idiotic, mistake CAD tools make of keeping your vertices in global coordinates (I'm looking at you, little 5mm x 10mm x 20mm clamp at (30000, 2000, 15000)!). Then you can keep your vertices in single precision without issues in most cases. And as others have pointed out, normals are usually fine with half precision.
    36. The wait is over You are awakened from a dream. You don't where you are or who you are. But the only certain thing is; You have to go forward. On your journey to Akimon you will face many obstacles in many forms. But before you can beat the challenge ahead You'll have to use your reflexes and determination in order to avoid death. But none will be harder than the most fearsome of them all. Yourself. To Akimon is a game based upon one mechanic only. You will have to rely on your reflexes in order to progress. The game tries to maintain a minimalistic voxel-esque visual style while also accompanying you with a soundtrack inspired by 8-bit and synthwave music. You can find more information about TO AKIMON and us here! You can purchase TO AKIMON here! SS 6.bmp
    37. That's right, Minecraft players could download the server binary and host it themselves anywhere they wanted. Official Minecraft servers only came in 2013 (Realms).
    38. wurstbrot

      Theraxius - HTML5 2D action game + level editor

      I also like the sound effects, by the way. They feel very simple and "8-bitty", yet very crisp, just like the graphics. In every way, the game radiates a vibe of "let's do it very simple, but do it very solid".
    39. I believe the collision is done actually in 2D, as even champions that are 'knocked up' are impacted and targetted with abilities and autoattacks. There might be some effect to have proper projectile or spell path rendered (but the rendering does not impact game logic at all). It depends on the type of attack. Depending on amount of users you may need to use hardware to prevent attacks. In games I'd be more concerned with just cheating primarily, although DoS and DDoS attacks could cause major losses in case your game has competitions and other sponsored online events. I don't know, but I doubt he used any expensive production level servers at the time. It is simply useless to have expensive and powerful servers for development - while most of the time only developers and testers will be running on it. If I'm not mistaken, Notch also wasn't hosting any public Minecraft server on his own - he let users host it themselves.
    40. Brain

      Firework Factory 3D version

      Mr Boom's Firework Factory rewrite in Unreal Engine 4. Previously attempted rewrite from scratch using DirectX 11. Due for release July 2019.
    41. Personally, I'd go for double precision for my transform matrices on the CPU side, but convert them to single precision after "flattening" my transform tree and upload single precision modelView matrices to the GPU. "modelView" is a critical part here, because that way, things that are close to the camera get the best possible precision. If you commit the fatal mistake of having a world space and uploading separate model and view matrices, you won't gain anything from using double precision on the CPU. For example, you don't want to first transform the model to (1e30, 1e29, 0), then apply the inverse transformation of the camera which is at (1e30, 1e29, 1e-3) especially if even the slightest rotation is involved. You may even want to multiply the projection matrix in as well (and upload MV and MVP matrices, as you'll likely still need view space for things like lights).
    42. There's nothing wrong with static methods, but static variables and data members are global state, and global state causes coupling. You might think that using static is somehow better than globals because they are "hidden", but hidden coupling is still coupling and in many ways it's even worse because at some point someone (potentially you yourself) will do something which looks ok because it is not immediately visible that it affects global state, break everything and wonder why. Also, Listener(Listener* instance){ mListenerList.push-back(); }; looks wrong. Shouldn't it probably be Listener(){ mListenerList.emplace_back(this); }; , because (ignoring the obvious errors) why would a Listener add anything except itself to the list of listeners? Furthermore, shouldn't the destructor remove it again instead of creating a dangling pointer?
    43. Sorry this is probably nomenclature .. I have a biology / ecology background, and there is a simplistic equation: phenotype = genotype + environment https://en.wikipedia.org/wiki/Phenotype So in biology environment is everything aside from the genotype, including other individuals of the same species. This is in contrast to the layman use of the word 'environmentalism' which tends to be concerned more with green space, greenhouse gases, wild animals, sitting round a campfire singing 'Kumbaya' etc. So to a biologist a city would be just as much the environment as a savanna in Africa. Resources are things like food, water, shelter, territory, mates etc, required for growth, maintenance and reproduction. Most humans are happier when they have good access to these resources. When there are too many people in an area, there may not be enough resources to go around and there is competition. Competition can lead to many things we would associate with 'unhappiness' (but ironically drives evolution to make us better as a species).
    44. Haha I actually do, but only on the rendering code! e.g. I added HDR-TV support to the XbOne version of AO International Tennis, but honestly I have no idea how the gameplay / animation / physics tech on that game actually works 😁 What I've described is how I'd do it / my guess at how games like that work. I could ask them, but it might be considered a trade secret so I'd rather just guess 😀
    45. LorenzoGatti

      JSON Editor for games

      Just write the tool yourself. JSON is text, and JSON editors are structured text editors which need to be extremely conservative with the sort of custom widgets you desire. You also describe tight integration with your game engine and its assumptions (e.g. gamma correction, which implies rendering everything exactly like your game engine does) and behaviours, such as sorting object properties in a certain way, that are appropriate and easy to implement for a custom tool but out of the question for a general purpose editor. What you probably want is a model or level editor (of relatively small scope, specialized for your game engine) that happens to use JSON as a file format but could switch to something else in the future: your task is "tuning 3d models" for use in the game, not editing JSON per se.
    46. I see where you're coming from, but don't forget that we are talking about beginners here. To them, everything is "hard to achieve". So when you tell them that, they just think "oh, no problem then, I will work hard, let's do this" and end up going in the wrong direction. And building a game engine* is the wrong direction for a beginner. * where "a game engine" is a general-purpose set of tools used to build video games If someone never laid bricks before, building a house is "hard to achieve". So is building a skyscraper... on the Moon. One of those things really should be called "impossible" for their own good
    47. Draika the Dragon

      Draika's Bakery - Tower Defence

      There's an emergency in Draika's Bakery, Draika's goods are running away! Don't let his baking efforts go to waste, stop them from escaping! Use various kitchen utensils to defeat them and save the day. Features: - Fully randomised spawning sequences - Infinite progressive difficulty system - Infinitely expandable playing field - Unlockable turrets Notes: - Minimum android version 4.4.2 KitKat, tested on Galaxy Note 2 - Contact risole123@hotmail.com for any queries - There is an in game text guide at the top left, which may provide useful information This is my first game release. I hope you all enjoy it as I have just gotten started. I decided to release this because I have gotten my friends to play test and they really enjoy it. This project was a challenge set for me to delve into all aspects of game development. The gameplay is fully self-contained, there are no pay to play options anywhere. If you like it please leave feedback as I value thoughts and criticism.
    48. 8Observer8

      c# console snake game

      What is bad with this instruction? Why do you dislike it? It describes basics of development of snake prototype. It does not matter that it is in Python. It is very simple to rewrite it to another language. I rewrote it to: Snake 2D using C#, WinForms, GDI+ Snake. WinForms, OpenGL 3.1 Snake 2D using JavaScript/ES5, Canvas API Who disliked it? Why did you make it? I spent my time to make these instructions to help beginners.
    49. Shaarigan

      Need Advice Important (advanced questions)

      Sorry dudes but all of you that tell someone that especially asked for making an engine, even as beginner, to just drop that and instead make a game is not even mistaking but even worse is leading people to the wrong track! Without going too offtopic here, I despise those people that tell anyone that he/she can't do anything 'just because' and this is exactly the fact here. I don't say anything against telling those people what work is behind the topic, providing resources and so on but there is a huge difference between 'It is not possible' and 'it is possible but hard to achieve'. Sure Unreal and Unity have some more devs that are driving development but even those are cooking just with hot water and no magic happens here anyways. Unreal for example links the SDL2 library and a lot of other third party libs.The most time consuming part of developing a game engine along with design decisions is learning/developing technologies that weren't available before but they also write blog-posts, articles and make talks so taking their solutions saves a lot of research one would need to do otherwise. You could even take a look at their source code and see what happens behind.
  • 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!