Jump to content
  • Advertisement
    1. Past hour
    2. jbadams

      #1 - Welcome!

      Welcome!
    3. JessGame90

      Jess Cantrell

      Drawings using Corel Painter
    4. Today
    5. What options do I have for a cheap/low-scale address space for a Tomcat/glassfish server. Alternatively, is it easy to implement a system where any pc can host the server? If this is too ambiguous let me know, I'm pretty bad at asking technical questions as a distributed systems developer. I'm developing a 2 player turn based card game. Thanks, CE
    6. Game_Passion_Itself

      Want to Improve your Portfolio?

      You are a 3D artist, concept artist or sound designer. You have experience at what you do, but you would love to work on a team and finish a few projects to show what you are capable of. You know it will greatly increase the chances of getting hired by a good company in the future, but you can't do that by entering projects of unrealistic scope that will most likely never be finished. I am a game designer / programmer who has lots of game mechanics needing to get out of pre production and get funded by a publisher. How can we help one another? By working together on Vertical Slices, which are small parts of a game. They are finished and polished, and their purpose is to: · Show what the final project will look like; · Prove that a team has the right skills to make a great game. See? Working on vertical slices will both add a lot to your portfolio in little time and, as we are working as a group, it will also improve your teamwork / communication skills. You can receive part of the revenue as well. Sounds good? Let’s have a talk. Here’s my Discord: Berzerkker #7783.
    7. Yesterday
    8. Salutations, Node Collective LLC is searching for several positions to be filled. Node Collective LLC regrets to inform you that the budget has been cut due to a company bankruptcy threat. As of now, we are searching for your dedication and skills, preferably staff with education experience via college/university. Payment is not included anymore. THE BUDGET HAS BEEN PLACED TOWARDS EXPOSURE, MARKETING, ADVERTISING AND LEGAL DOCUMENTATION. ABOUT NODE COLLECTIVE LLC Node Collective LLC is a global development studio, with professional staff and a large backing. Currently, Node Collective LLC's project is a video game titled "Where Ravens Fly." If you apply for a position, you will be shown the Game-Design Document. THE DESIGN DOCUMENT IS COPYRIGHTED VIA THE UNITED STATES COPYRIGHT OFFICE. Node Collective LLC started out as a HL2 Modification group, which soon evolved into an LLC with a larger staff team which works in UE4. WHY WORK WITH NODE COLLECTIVE? We're looking for dedication, which Node Collective is full of. We're estimated 4-6 years of development, and we're not stopping any time soon, no limitations to our creativity. We have alot fun, loving development team, which is more of a family to us developers and even managers. As our staff are glad to work here, we love team building exercises and a fun loving management team. In-fact, even today we played "Cards Against Humanity!" And had a blast of a time doing so. Plus, our dedication guarantee's something professional for your resume. ABOUT OUR GAME We currently can not explain to much about the production of the game, as it's classified information. Though, we'd be happy to show you our REGISTERED COPYRIGHTED Game Design Document, upon chatting with our management team. Though, generally our game is a military open world game, with both linear story game play and open world madness and fun. Which, even includes a cooperative mode! You play within the second American Civil War within 2030, between 3 factions, and many explosions. That's all I can say. THOUGH, THE GAME DEVELOPMENT IS STILL QUITE EARLY, SO IN-GAME THERE ISN'T MUCH TO SHOW, THOUGH WE ARE MAINLY FOCUSING ON WRITING AND GAME PRODUCTION DEPARTMENT. WHAT ARE WE LOOKING FOR? POSITIONS AVAILABLE: ASSOCIATE-GAME DESIGNER: REQUIREMENTS: Full Understanding of Screenplay format Past writing experiences, portfolio OR resume Highschool/College/University Education OR Hobby writings/stories Open schedule PUBLIC RELATIONS REPRESENTATIVE: REQUIREMENTS: Native/Extremely Fluent understanding of the English language Past PR experiences Open schedule UNREAL-SCRIPT PROGRAMMER REQUIREMENTS: Fluent understanding of Unreal Script Open schedule and quick working Experience within Unreal Script Resume/Portfolio/Past Works VOICE-OVER ARTIST REQUIREMENTS: Good microphone No microphone static Fluent English Past works OR portfolio/resume YOU WILL BE REQUIRED TO FILL OUT A STAFF INFORMATION FORM. WE HAVE A SECURITY TEAM FOR INFORMATION SECURITY - YOUR INFORMATION WILL BE SAFE THIS POSITION DOES NOT INCLUDE EMPLOYMENT BENEFITS SUCH AS INSURANCE. GAME NAME HAS BEEN CHANGED FROM "SHADOWS WAR" TO "WHERE RAVENS FLY" CONTACT Discord: Sakirin is Cool#0850 Steam: https://steamcommunity.com/id/notmikushutup/ Company Email: nodecollectivedevelopment@gmail.com (COMPANY EMAIL WILL BE CHANGED TO @nodecollective SOON NODE COLLECTIVE LLC DOES NOT TOLERATE LEAKS - IF YOU ARE IDENTIFIED LEAKING COPYRIGHTED/CLASSIFIED MATERIAL WITHIN NODE COLLECTIVE LLC YOU WILL BE TERMINATED AND WITH EXTENT PLACED AGAINST LEGAL ACTION. PLEASE ASK BEFORE YOU SEND SOMETHING OUT.
    9. Scouting Ninja

      Random Room Generation?

      Unreal has the Blueprint system that was made for this. You can build small rooms by hand, place walls and pathways inside blueprints. Then you only need to select a compatible blueprint randomly from the list. Every room can be filled with random content in the same way. I would recommend you look outside of Unreal tutorials etc. The internet is full of random level generation content, just not for Unreal. If you know Unreal well enough it should be possible for you to translate procedural generation from other kinds of tutorials.
    10. Since the big yearly professional cycling race (Le Tour de France) is being held at this moment, I wanted to work on my own Cycling Game. The first version of this game was launched about three weeks ago (link), but it still didn't feel finished. The main reason is that there was not too much difference in the players. All players had just one strength value (determining their race strength) and two different traits (like being better in the mountains or when riding solo). I wanted to try and change this by removing the traits and the single attribute and adding 14 new attributes. As of right now i have added the attributes mentioned below to the game. They don't actually do anything, that is the topic for the next update. Climbing, Composure, Condition, Descending, Determination, Flair, GroupTechnique, Luck, Restoration, SoloRiding, Sprinting, Stability, Strength, Tactics. My next goal is to remove the traits (that is going to be a big change, since they are used almost everywhere in the code) and then start to add functionality to the different traits and see how the game will feel afterwards. I will keep you posted!
    11. Finally, the barebones first version of my personal blog on game development is online. I will post my entries both on this website and on my personal blog on Blogger (link). Let's start with a little introduction about myself and my games, in the coming weeks I will try to post regularly on the subjects I am struggling with as I am improving the games I have made so far and as I think about new topics for new games. Enjoy! About me My name is Jaap, I live in the Netherlands and I enjoy both programming and designing games. I started the latter when i was probably around 8 years old and (according to my parents) i spent considerate amounts of time trying to create my own games with pawns, marbles, dinky toys and little toy soldiers. Theoretically this means i have been a game developer for 25 years 😉 When i was 12 i started programming in GWBASIC. I really liked it a lot and have been doing it a lot (sometimes more and sometimes less of course). I have tinkered with different languages and IDE's to finally settle on the ones mentioned below. Besides programming i have a full time job, a beautiful wife, two kids and two dogs (german shepherds). When i am not behind a computer trying to program stuff, i love to play video games myself or to go outside to go hiking or running with my dogs. Games I like (to create and to play) First of all, i really enjoy turnbased games. I love the ability to think about stuff and i hate losing because of a wrong buttonpress in the heat of the moment. Basically all the games i have built so far, and probably will build in the future are therefore turnbased. Besides computer games i really like sports a lot. Mostly football, cycling and running. This combined with the fact that i enjoy turnbased games is the reason why my favourite game of all time is the Football Manager series. It’s also for this reason that I started working on Cycling the board game and Football Manager Stories. Finally i love to build and manage stuff. I must have played each entry in the Civilization series for at least 100 hours or more. I also enjoyed older simulation/strategy games like Rollercoaster Tycoon, Settlers and Capitalism 2. These games inspired me to create the games Tycoon and Civilization Wars. My progamming experience I do not have any formal education in programming but i do enjoy the technical side of programming. I mostly work in Visual Studio, programming in the Monogame framework in C#. Back in 2012 i participated in the AI Mooc, organized by Stanford and Google. Why Black Wolf? Because i have an awesome black German Shepherd called Nero, who looks a lot like a wolf, I decided to make him my mascot for my game development. My games So far, i have started development on four different games: Cycling - the board game Tycoon Civilization wars Football manager stories Please click on any of the links to find out more about them (links go to my personal website). Thank you for reading!
    12. Your question then is only about the math behind finding the point of intersection of three planes? The standard form, Ax + By + Cz + D = 0, can also be written as a dot product, `(A,B,C,D) · (x,y,z,1) = 0`, and both can be written as matrix multiplication: `[[A B C D]] * [[x] [y] [z] [1]] = [[0]]`. For all planes, `(A,B,C,D) · (x,y,z,1)` must be 0, if written as a matrix, we get: [[x] [[A1 B1 C1 D1] [y] [[0] [A2 B2 C2 D2] × [z] = [0] [A3 B3 C3 D3]] [1]] [0]] Expanded: [[A1x + B1y + C1z + D1] [[0] [A2x + B2y + C2z + D2] = [0] [A3x + B3y + C3z + D3]] [0]] Afterwards, we can solve using systems of linear equations, specifically using Kramer's Rule or row reduction: [[q*A1x + 0 + 0] [[-D1] [ 0 + r*B2y + 0] = [-D2] [ 0 + 0 + s*C3z]] [-D3]] Which more or less gives us something like the following: [[x] [[-D1/(q*A1)] [y] = [-D2/(r*B2)] [z]] [-D3/(s*C3)]] Regarding how to visualize the math behind it, I recommend watching 3Blue1Brown's series on linear algebra.
    13. Hello. I'm developing an online card game (Heartstone like) concept. But I have some doubts about the server structure that I'll use, I'm gonna describe the initial structure to you guys. 1- Login/Data Server (public) 2- Matchmaking Server (private) 3- Game Server ("public") The client will connect to the Login Server using the user/password, after the success authentication a TCP/IP connection will be opened between the client/server, where the client will receive the user profile, used decks, cards, etc, where the client will be able to change the cards in the decks, the "hero" used, etc, all those requests will be handled by this Login/Data server. After click in the "Find Battle" the Login/Data server will receive those requests and internally communicate with the Matchmaking server, that will add the client in a game search Queue. The Matchmakign server will have this game Queue, with its own logic to find 2 clients with the "same" game power and will notify the Login server about the matchmaking result, after that the MM server will notify the Game SErver to create a new Game session related to those 2 clients. The Login server will notify the 2 clients, sending them the game server IP to connect, the game session ID, session password, etc. The clients will send a request to the Game Server with the session ID and password so they can "authenticate" in the game server, creating a new TCP/IP connection with the game server, that will receive/send the game requests like drop X card, attack X card, skip turn, etc, when the game ends, the connection will be closed, and re-openning a connection with the Login/Data server again. (Not sure if I should close the first connection and reconnect like this, or just keep the Login/Data server connection opened while playing a game). I kinda like this structure that I tought, this way I will be able to scale the server in case of too many users, since the connection IP's will be given based in the "Load Balancer", and internally controlled by the Matchmaking server about the Game Servers loads, that will have N active game sessions. Keep in mind that all the servers will be writen by me, I will not use any third part servers like Photon, UNET, etc. I would like to hear your opnions about this structure, what I could improve and/or take care. Thank you
    14. It's been a while since I've done something like this, but I'll offer a few thoughts in addition to what's already been said. I'll assume you're interested in arbitrary convex brushes and not just rectangular prisms. I've seen a few different methods suggested for this. One is to create a sufficiently large initial polygon lying in each plane in the set, and then clip that polygon to every other plane in the set. Note that vertex positions that should be coincident may differ slightly due to numerical error, so welding may be required. There's some discussion about this here: https://www.reddit.com/r/gamedev/comments/4vjg1i/valve_map_file_vmf_need_help_on_finding_out_how/ Which links to this, which looks like it might have some useful information: http://mattn.ufoai.org/files/MAPFiles.pdf There are other methods as well that involve intersecting the planes in groups of three (as you seem to be doing). For each such intersection that succeeds, the intersection point is part of the brush if it lies on or in front of every plane in the set (using a numerical threshold of course). I looked at one of the references you linked to, and it looks like each intersection point is added to a polygon corresponding to each of the three planes involved in the intersection. I only took a quick look, so I'm not sure how welding or polygon vertex order is handled in that reference. (There are ways to put unordered polygon vertices in the right order though.) Another method is to find all the valid intersection points and then compute a convex hull from those points. I think any general method will probably be subject to numerical error, so that has to be kept in mind.
    15. Vilem Otte

      Which country should get taxes?

      Not necessarily, a lot of countries have agreement to prevent double-taxing and therefore you tax only in one. You will most likely need to fill in some form at least (W8-BEN for the USA). Tax laws are quite complex in the EU (and it depends on what kind of service/product it is, and who are the parties - whether private companies, or physical person on at least one of the sides). To sell anything in EU you have to be a registered business (limited liability-like company, stock-based company, "sole property" company etc. - this varies based on member state), unless you want to use seller agreements (which are often more complex than to start own company - so I never was interested in those). VAT If the registered company provides service or sells product into foreign country it automatically becomes VAT payer. This may require additional bureaucracy in your country. You are bound to charge VAT for every customer. Now depending on the customer: - ask for refund of VAT during VAT report monthly for those customers that are VAT payers in EU member state that is the one where your company is registered (each country has a form (some two ... sigh ... Czech Republic)) - for VAT payers that are in EU member states but not the same EU member state where your company is registered VAT is using reverse charge mechanism (in the end it's either not paid at all or refund for the buyer side) - for non-VAT payers you will most likely need a VAT account in all member states where you sell (note. it is possible to use MOSS mechanism instead - at least for software services, etc. - you will need to register for it though). More information available in (also on ec.europa - you can find viable information what is mentioned reverse charge and how it works) - https://ec.europa.eu/taxation_customs/sites/taxation/files/information_microbusinesses_euvat_2015_en.pdf Income Tax This is regulated on EU member state level only, you will have different rules & values in Germany, Czech Republic, Austria, Lithuania, France, etc. It can also differ per your business type, I can only add that for Czech Republic this is at 19% as of 2018 for limited-liability-like companies (S.R.O. in Czech) and stock-based companies (A.S. in Czech). Generally paid once per year - you take all income, subtract all expenditures (everything you buy required for running the business, payments to workers, etc.) - and from the rest you pay income tax. You may also need additional forms based on the country where your business is registered, like complete accounting with all transactions. Final word - I'm not a lawyer, I've spend last few years running a company in Czech Republic (in EU), and had numerous headaches with bureaucracy (and still have), so feel free to ask anything more specific - I might be able to help, but I may be mistaken (with a bit of sarcasm - in worst, you can ask for same jail as me and beat me up there). Be sure though - this will make you totally hate your country administrative and EU bureaucracy as a whole.
    16. Of course hash map is the answer to almost every problem : ) I will keep that in mind when I got the plane to vertex thing right. @KKTHXBYE 80% of your code doesn't really relate to my problem. I don't have any problems parsing the map file. My Problem is to get my mind wrapped around the plane to vertex vertices conversion. Just like I mentioned in my post (have a look at the animation). But I will get a closer look at your code when you actually //Test each face against another face then find intersection To be clear, I would like to have a more mathematically/algorithmically explanation to fully understand the problem instead of just let you guys write the code for me
    17. This could help a bit, it doesnt load every map file but somehow i managed to load few basic maps with it inline void LoadStdGTKRadiantMapFile(AnsiString fname, TachoGLModel<float> * output_model_tree, int & len) { TStringList * s = new TStringList(); s->LoadFromFile(fname); ALOG("loaded file: "+fname+" lines: "+IntToStr(s->Count)); //begin with counting worlspawns or func_groups //since we treat them as worldspawn too bool inEntity = false; bool inBrush = false; //First: count brushes in entities and func_groups so we can size output_model_tree, int & len int EntityLen = 0; int BracketDepth = 0; for (int i=0; i < s->Count; i++) { AnsiString line = LowerCase(s->Strings[i]); if ( (Pos("classname", line) > 0 ) && ((Pos("worldspawn", line) > 0 ) || (Pos("func_group", line) > 0 )) ) { BracketDepth = 0; ALOG("FOUND WORLDSPAWN OR FUNC_GROUP at line: "+IntToStr(i)); for (int j=i+1; j < s->Count; j++) { line = LowerCase(s->Strings[j]); // ALOG("j = "+IntToStr(j) +" line: "+line); if (Pos("{", line) > 0 ) { BracketDepth = BracketDepth + 1; ALOG("FOUND Bracket: depth: "+IntToStr(BracketDepth)); if (BracketDepth > 0){ ALOG("FOUND BRUSH");EntityLen = EntityLen + 1; } } if (Pos("}", line) > 0 ) { BracketDepth = BracketDepth - 1; ALOG("Closing brush: bracket depth: "+IntToStr(BracketDepth)); } if (BracketDepth < 0) {ALOG("Entity closed"); i = j + 1; break; } } } } if (EntityLen == 0) { delete s; return; } output_model_tree = new TachoGLModel<float>[EntityLen]; len = EntityLen; int EntityIndex = -1; /* * Through all lines in file check if we found { sign and are not in brush */ for (int i=0; i < s->Count; i++) { AnsiString line = LowerCase(s->Strings[i]); if ( (Pos("classname", line) > 0 ) && ((Pos("worldspawn", line) > 0 ) || (Pos("func_group", line) > 0 )) ) { BracketDepth = 0; for (int j=i+1; j < s->Count; j++) //to zakonczyc i = j+1; { bool found_brush = false; line = LowerCase(s->Strings[j]); if (Pos("{", line) > 0 ) { BracketDepth = BracketDepth + 1; found_brush = true; if (BracketDepth > 0) EntityIndex = EntityIndex + 1; } if (Pos("}", line) > 0 ) BracketDepth = BracketDepth - 1; if (BracketDepth < 0) continue; if (Pos("{", line) > 0) continue; if (Pos("(", line) <= 0) continue; //we are definetly at ( inBrush = true; //finally we have our polygon definition ffs int NumOfFaces = 0; TPlane<float> * Faces; TPolygon<float> * Polys; //count how many faces object has/consists for (int p=j; p < s->Count; p++) { AnsiString str2 = s->Strings[p]; if (Pos("}", str2) > 0) break; if (Pos("(", str2) > 0) NumOfFaces = NumOfFaces + 1; } ALOG("OBJECT CONSISTS OF: "+IntToStr(NumOfFaces)); Faces = new TPlane<float>[ NumOfFaces ]; Polys = new TPolygon<float>[ NumOfFaces ]; int FaceIndex = -1; for (int p=j; p < s->Count; p++) { AnsiString str2 = s->Strings[p]; if (Pos("}", str2) > 0) break; FaceIndex = FaceIndex + 1; /* * Receive data from 3 ( x, y, z ) */ vec3 points[3]; AnsiString VertexStr = get_text_between2("(", ")", str2); for (int iterations=0; iterations < 3; iterations++) { get_all_in_nawias(VertexStr, " ", 0); points[iterations].x = (float)pstrtoint(w_nawiasie[0][0]); points[iterations].y = (float)pstrtoint(w_nawiasie[0][1]); points[iterations].z = (float)pstrtoint(w_nawiasie[0][2]); // Swap the y and z values, and negate the new z so Y points up. float tmp = points[iterations].y; points[iterations].y = points[iterations].z; points[iterations].z = -tmp; //Reminder: Ax+By+Cz+D=0 => D = -(Ax+By+Cz) => D = -Ax-By-Cz } /* * =============================================================================================== * //eof retreiving data from (x y z) (x y z) (x y z) uselesss/text we now have plane definition [3] points */ Faces[FaceIndex].calc_plane(points[0], points[1], points[2], false); } TPolygon<float> output_polygon; std::vector<TPolygon<float> > OutputModel; //Test each face against another face then find intersection for (int n1=0; n1 < NumOfFaces; n1++) { for (int n2=0; n2 < NumOfFaces; n2++) for (int n3=0; n3 < NumOfFaces; n3++) if ( (n1 != n2) && (n1 != n3) && (n2 != n3) ) { bool illegal = false; vec3 vertex_result; bool newVertex = Get3PlaneIntersection(Faces[n1].n, Faces[n2].n, Faces[n3].n, Faces[n1].D, Faces[n2].D, Faces[n3].D, vertex_result); if (newVertex) for (int n4=0; n4 < NumOfFaces; n4++) if (Faces[n4].ClassifyPoint(vertex_result) == isFront) illegal = true; if (!illegal) output_polygon.AddVertex( vertex_result ); } OutputModel.push_back(output_polygon); } int model_vlen = 0; int model_flen = OutputModel.size(); for (int p1=0; p1 < model_flen; p1++) model_vlen = model_vlen + OutputModel[p1].Count; for (int p1=0; p1 < model_flen; p1++) OutputModel[p1].CalcPlane(); output_model_tree[ EntityIndex ].header.LENGTH = model_vlen; output_model_tree[ EntityIndex ].AOS = new TTGLVertex<float,float,float>[model_vlen]; output_model_tree[ EntityIndex ].FaceLength = model_flen; output_model_tree[ EntityIndex ].Matrixarr = new tmatrixtype[model_flen]; output_model_tree[ EntityIndex ].VBO_BE = new tvbofacenfo[model_flen]; output_model_tree[ EntityIndex ].Textureindex = new int[model_flen]; for (int fa=0; fa < model_flen; fa++) { output_model_tree[ EntityIndex ].Matrixarr[fa] = mtTriangleFan; output_model_tree[ EntityIndex ].Textureindex[fa] = 0; } int findex = -1; int vindex = 0; for (int p1=0; p1 < model_flen; p1++) { findex = findex + 1; output_model_tree[ EntityIndex ].VBO_BE[findex].INDEX_START = vindex; for (int p2=0; p2 < OutputModel[p1].Count; p2++) { output_model_tree[ EntityIndex ].AOS[vindex].v = OutputModel[p1].V[p2]; output_model_tree[ EntityIndex ].AOS[vindex].n = OutputModel[p1].normal; vindex = vindex + 1; } } i = j + 1; //skip to next line if (i >= s->Count) {delete s; return;}//reached end of file way ago }//eof for j }//eof if classname worldspawn of func_group }//eof for i delete s; } //end of function template <class T> bool Get3PlaneIntersection(t3dpoint<T> n1, t3dpoint<T> n2, t3dpoint<T> n3, T d1, T d2, T d3, t3dpoint<T> &p , T &den) { double denom = Dot(n1, vectorcross(n2, n3) ); den = T(denom); if (betweenorequal(-epsilona,epsilona, denom)) return false; //check if denominator is equal or close to 0 t3dpoint<T> tmp = vectorcross(n2, n3) * -d1; t3dpoint<T> tmp2 = vectorcross(n3, n1) * -d2; t3dpoint<T> tmp3 = vectorcross(n1, n2) * -d3; p = (tmp+tmp2+tmp3) / denom; return true; } get_all_in_nawias is a function that separates a string given a key Means: if we have a string "88, 66, 33" And call that func with key "," It will return a std::vector<std::string> with values 88 66 33 Lol just found that i nowhere store how many vertices each face has, and even with this it loaded data normally... Maybe i was setting it earlier but cant remember its an old code btw
    18. Hey together 😃 We`re developing "Shockout" since about 1 month and are 3 active developers. We`re atm just artist, who blueprinted our prototype and are now searching for some more experienced developers, who are capable of helping us shaping the game to a true game, which should be available on Steam Early Access in around 2 months! We`ve a small little spot on the upcomming Gamescom to showcase our Game and find a Publisher. Therefore we expect dedication until that date! We are in need of a Gameplay Developer, who is able to implement a few gameplay features and on top of that can implement the Steam online System. Later on we`d like to have microtransactions for being able to buy some virtual goods (skins + avatars). Additionally we need a concept artist, who is capable of working on new skins/abilities/animals/arenas/weapons/etc. , which will than be modelled, textured,animated and implemented into Unreal! Aaand additionally to the developer side, we`re looking for more members, who are willing to join our discord family (https://discordapp.com/invite/unvsY9v) for testing our newest builds and give us feedback! Below I have attached our project! Feel free to join our discord channel and get in contact with me or send me a personal message! I´ve also attached our current blockout of our first "Mech Soldier"!
    19. I want to create a good all round font system I can use throughout my apps. So I did some research on how Google does there layout, especially font sizes for different elements. Turns out they introduced SP, a font size similar to DP but takes in a scaling unit so user can enlarge all the text if the want while still maintaining the general look. I figured I start by creating a couple font elements from the google design guide below, they use there own Roboto font for this and the image below for reference. Since it's an image, obviously the text is already in pixels so the actual sizes cannot be used for reference. I am using LibgDX and since LibGDX works with bitmap fonts I use the Freetypefont library to generate them at runtime.DP or density independant pixels are relative to a 160 dpi screen. So to get the amount of pixels we need to divide the screens actual PPI/DPI by 160 (for mdpi screens) to get pixel density relative to mdpi and then multiply that pixel density by the DP amount listed in the above image as SP. In LibGDX there is a function to get the density factor right away: Gdx.graphics.getDensity() so to get the body font google is using I do: parameter.size = (int)(14 * Gdx.graphics.getDensity() * scale); BitmapFont body = regular.generateFont(parameter); // regular is the FreeTypeFontGenerator holding the Roboto Regular font. And rendering this to my S8 screen is working great. The S8 has a pixel density of 3 so the DP/SP value gets multiplied by 3. Now I tested this on my monitor and the font is barely readable. I checked the PPI/DPI of my monitor and that is roughly 96 so 96/160 = 0.6 pixel density. So the body font on desktop will be 14 * 0.6 = 8.4 pixels so it is unreadable but funny enough the same size as my S8. But why? Shouldn't I end up with the same size font in CSS for both desktop and my S8? body { font-family: 'Roboto', sans-serif; font-size: 14dp; // or sp } Yet the CSS is somewhat bigger and thus readable. I'm not sure comparing with HTML is the correct way but as far as I understand Google uses it for all it's layouts so also CSS. Anyway, when I just create my font with size 14 it will match the CSS. But obviously since the font is now 14 pixels on my S8 it will be really small since the pixels are so tightly packed. So what am I doing wrong? Are the numbers wrong? Have I some setting somewhere that makes my website text bigger then it should? Do I have an error in my understanding or calculations?
    20. Use a hash-based lookup table to identify previously created vertices matching on all attributes of the vertex: Position, normal, texcoord (and its implied texture!), and optionally color. e.g.: class MeshBuilder: def __init__(self): self.index_buffer = [] self.vertex_buffer = [] self.vertex_lookup = {} def index_for_vertex(self, x, y, z, nx, ny, texid, tx, ty): vertex = x, y, z, nx, ny, texid, tx, ty ix = self.vertex_lookup.get(vertex, None) if ix is None: ix = len(self.vertex_buffer) self.vertex_buffer.append(vertex) self.vertex_lookup[vertex] = ix return ix def add_triangle(self, a, b, c): ix_a = self.index_for_vertex(*a) ix_b = self.index_for_vertex(*b) ix_c = self.index_for_vertex(*c) self.index_buffer += [ix_a, ix_b, ix_c] Afterward, use the lookup table to get or create a vertex index to use in your index buffer. In the cube example, the 6 planes will build 6 faces (polygons). Triangulating the polygons will make 12 triangles and 36 vertices. The `MeshBuilder` example will reuse indices for the 12 duplicate vertices. The end result is a vertex buffer with 24 unique vertices, and a index buffer with 36 indices.
    21. Lactose

      Random Room Generation?

      You might find some inspiration from looking into how Spelunky did things: http://tinysubversions.com/spelunkyGen/ Often, lots of parts are created manually, with possible modifications/variations to them included in the dataset. Generating the entire room/dungeon/whatever then consists of picking between the manually created parts and potentially modifying them based on various rules. This is a lot easier to tweak and design for than having everything being purely created via rule sets, etc.
    22. Traumwolf

      ShockOut

      Welcome to the animalymic robot (war) games. Animals have evolutionary advanced and live more or less civilized. But once every 4 years the best scientists and fighters meet in the arena to demonstrate their power and live out their animalic side. About the Game "ShockOut" is an local multiplayer couch coop mech top-down shooter, where you control a crazy animal with a deadly mech. Your goal is to hunt down all enemy players in a deadly arena environment. You need to push/pull your enemies in deadly traps, which will spawn randomly over time. Additionally you have a polarization, depending on this your abilities have different effects. When the polarization of attacker and defender are the same, your ability knocks back, if the polarization is different, the ability pulls. If you`re interested, you can join our discord community: https://discordapp.com/invite/unvsY9v
    23. Gnollrunner

      Random Room Generation?

      Not sure about the room stuff but I've done planet building with noise. I use simplex noise which is not really that hard to implement. I even have an HLSL version. I'll probably have to dig into the random room and building stuff at some point myself, just to fill out my planets, but I'm still working on the terrain generation so I don't have the time at the moment.
    24. maximl

      Tank Runner

      Top-down slow runner with idle mechanics. Think, lead and train your crew. Upgrade and change setup of your tank. Use google play to store you data and see a leaderboard.
    25. swiftcoder

      Which country should get taxes?

      File in both, yes. But you can typically deduct the taxes paid to the foreign government.
    26. No advanced blacksmith in far away areas might not be true. A few options; Traveling Trader Caravans. Fixed territories with at least 1 major city or trading center in them (might be difficult to get to them). The lone hermit, smith, magician, druid; that just happens to have some stuff to trade if you get the <whatever> for them. Bandit or Monster villages with treasure hoards. The occasional teleport to city device that is crumbling and maybe has a couple charges left in it. Sometimes to a destroyed city. Adventurer villages or fortifications from the previous adventurers trying to do what you are doing now. Wall cities or fortifications from the Empire/Alliance/Kingdom of <foo> which are trying to limit the monsters from attacking their territories. And the ever popular roving Blackmarket.
    27. Since you are doing your own game "in the style of" with the gear looking only to be tailored to combat, think about exactly what damage and effects on combat that they will do. What is the primary function of this equipment for each gear slot you might use? What are the stats or modifiers that will show up at a high frequency (75%+) for each gear slot? Will there only be bonuses or will there be penalties too (will a 2h weapon get a damage bonus but slow your attacks)? Will you divide up physical damage to Pierce (spears), Slash (swords), and Crush (mace/club)? Will there be elemental magic/bonus damage (fire/water/etc)? Will you make specific tiers of gear (iron sword/steel sword/etc)? Will you have items with specific bonuses, random unique gear with bonuses not normally found on that gear, random artifact gear, fixed/static artifact gear, or even gear that is necessary to drive the plot (defeat the critter while using the sponge of purity)? Will there be any type of crafting, adding runes or gems to gear for extra bonuses? By doing the above you will be able to feel out if you have too few or too many gear slots. You will see what the function of each is, what the expected stats and modifiers are, and if that gear would be worth being in your game. Then you need to check the start to end values for the gear, keeping in mind the players party need their gear to be slightly ahead of the curve. Losing a few battles or having tough battles isn't a problem, but too weak of a party for a type of encounter too many times will frustrate players. Of course carving up all the critters in an instant would be pretty boring too. In the beginning the party needs to be able to defeat early encounters easily to build up for later, but you need to consider what gear and stats/modifiers will be needed when you encounter TUTATEOTD (The ugly thing at the end of the dungeon) aka the final boss. As an example, if helmets reduce the chance of an incoming critical hit or reduce the amount of damage from a critical hit, it might not be too important at the start, but might be really necessary to survive late game or final battle. If the players like the game and balance and the equipment handling is easy and effective the total number of slots doesn't really matter, only that each slot serves a function to better that character's power along the way so the player believes they have a chance at winning the the next battle. If you can get all 6 characters gear sets on the same screen, and have the inventory and gear sort selections below, using drag and drop for all the items you were thinking of (helmet and armor included) would be quite easy. Just make sure you can drag and drop from one character to another. Sorting problems are normally created by too much junk and limited sorting options. You might want to think of a gear rating for all gear types. If you do this and allow the selection of one character, the sort could show the items that have a better gear rating than currently equipped gear for the highlighted character to reduce the pile sorting time. If you are sorting by "strength" it could show the items that have more "strength" as highlighted (and maybe sort them to the top).
    28. Hi everyone, currently I'm pretty desperate in figuring out how to translate planes from map files (quake/half-life) into (indexed) triangles. Most of the information about map files I got from Valve Developer Community [1]. I'm also aware of Stefan Hajnoczi's documentation [2], but it is not well written enough for me to understand. I have freshen up my linear algebra knowledge about planes from Points, lines, and planes [3] and Wikipedia [4] and I got a pretty good understanding about how to transform three points into a plane, to get Ax + By + Cz + D = 0 where (A B C) is the vector normal of the plane and D is the distance from the origin. I also know how to calculate the intersection of two / three planes. I used a similar code like Stefan to achieve this. The thing with Stefan's code is, that I am trying to achieve a different approach not by using linked lists (that's what he's using). I want to solve this problem in my coding convention and fully understand the mathematical problem in order to implement it correctly (and be able to modify/optimize it). I thought of a similar procedure as it says on Valve's documentation (see figure [5]). What am I missing in order to build the cube? What are the single steps to achieve this? I think I only need a little poke to get me in the right direction. Any further sources are greatly appreciated. I looked up source code from e.g. Trenchbroom and other projects on github, but I just want a simple solution to get more into detail like texture mapping etc. Best regards, Daniel References [1] https://developer.valvesoftware.com/wiki/Valve_Map_Format [2] https://github.com/stefanha/map-files [3] http://paulbourke.net/geometry/pointlineplane/ [4] https://en.wikipedia.org/wiki/Plane_(geometry) [5] https://developer.valvesoftware.com/w/images/0/0d/Brush_planes.gif
  • Advertisement
×

Important Information

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

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!