- 11
- 40 726
Tamta Asatiani
Georgia
Registrace 19. 03. 2017
I document my C++ and game development things here!
I made a Game Engine for C++
I made a game development library called "tahmlib" for C++
tahmlib: github.com/tamtaasatiani/tahmlib
pong++: github.com/tamtaasatiani/pong-plusplus
___________________________________________
MY SOCIALS
github: github.com/tamtaasatiani/TicTacToe
google play games: play.google.com/store/apps/developer?id=Tamta+Asatiani
patreon: www.patreon.com/TamtaAsatiani
ko-fi: ko-fi.com/tamtaasatiani
twitter: x.com/tamta_asatiani
tahmlib: github.com/tamtaasatiani/tahmlib
pong++: github.com/tamtaasatiani/pong-plusplus
___________________________________________
MY SOCIALS
github: github.com/tamtaasatiani/TicTacToe
google play games: play.google.com/store/apps/developer?id=Tamta+Asatiani
patreon: www.patreon.com/TamtaAsatiani
ko-fi: ko-fi.com/tamtaasatiani
twitter: x.com/tamta_asatiani
zhlédnutí: 18 552
Video
Timer Class for the Unity Engine
zhlédnutí 483Před měsícem
I made a timer class for Unity and you all can use it. CODEMONKEY'S ORIGINAL CODE: unitycodemonkey.com/utils.php MY UNITY TIMER CLASS: github.com/tamtaasatiani/Timer.cs MY SOCIALS github: github.com/tamtaasatiani/TicTacToe google play games: play.google.com/store/apps/developer?id=Tamta Asatiani patreon: www.patreon.com/TamtaAsatiani ko-fi: ko-fi.com/tamtaasatiani twitter: x.com/tamta_asatiani
don't do gamedev youtube
zhlédnutí 27KPřed 2 měsíci
Talking about why if you want to do gamedev, you shouldn't do gamedev youttube, as well as the future of this channel. ARTICLE ABOUT THE RUSSIAN LAW: www.bbc.com/news/world-europe-68822483 MY TIC-TAC-TOE MADE IN C : github.com/tamtaasatiani/TicTacToe MY SOCIALS github: github.com/tamtaasatiani/TicTacToe google play games: play.google.com/store/apps/developer?id=Tamta Asatiani patreon: www.patre...
HOW TO STRUCTURE YOUR VIDEO GAME CODE
zhlédnutí 1,3KPřed 2 měsíci
In this video I'm going to explain how to structure your video game code and not get tangled in it. TIMESTAMPS 0:00 intro 1:21 demo 3:11 game design/prototypes 15:27 source code 56:00 outro PLAY ATOMI: play.google.com/store/apps/details?id=org.godotengine.atomi SOURCE CODE AVAILABLE ON MY PATREON: patreon.com/TamtaAsatiani?Link MY SOCIALS github: github.com/tamtaasatiani/TicTacToe google play g...
Harvard's CS50 - Introduction to Game Development - Final Project Showcase
zhlédnutí 1,1KPřed 4 měsíci
A showcase for the final project I made for Harvard's course "Introduction to Game Development".
WE MADE A GAME WITH NO COMMUNICATION (collab with wannibe manisha)
zhlédnutí 1,4KPřed rokem
@WannibeManisha and i made a game with no communication WATCH MANISHA'S VIDEO!: czcams.com/video/6m0xzrh7ku4/video.html play the game here: gamejolt.com/games/snowballed/686259 my tumblr: spacenoomad.tumblr.com/ my gamejolt: gamejolt.com/@thespacenomad/games my google play games: play.google.com/store/apps/developer?id=space nomad my twitter: space_noomad
GAMEDEV GIRLS TALKING ABOUT GAME DESIGN (with Wannibe Manisha and Tamara Makes Games)
zhlédnutí 1,9KPřed rokem
Talking about how we got introduced to games and why we decided to pursue it as a career, what we like in games now and why and how it affects the games we make. YOU CAN FIND THESE AWESOME LADIES HERE: TAMARA MAKES GAMES CZcams (GameDev): czcams.com/users/TamaraMakesGames Discord Server: discord.gg/dCJBpe2meg WANNIBE MANISHA CZcams: czcams.com/users/WannibeManisha Twitter: manisha_w...
WHAT'S INSIDE A SCORPION GAMING MOUSE?
zhlédnutí 442Před 3 lety
i disassemble my old scorpion gaming mouse. TIMESTAMPS 0:00 - intro 0:22 - disassembly starts here 7:37 - a good view of the motherboard 8:16 - outro my twitter: space_noomad play.google.com/store/apps/developer?id=space nomad my gamejolt: gamejolt.com/@thespacenomad
I like you so much, you are so talented
Neat!
Congrats on your progress! I am interested in LLL aswell, but so far my only experience is asm on Gameboy color hardware,which is as low level as it gets (apart from maybe compilers) modern hardware is a Intimidating to me. So much uncertainties. I am toying around with godot atm, but a c++raylib project sounds super interesting to me. A project like yours seems like an insane undertaking. Respect.
sick!!!
Congratulations lady ! You sold your soul to C++ ! Was it worth it ?
oi what's ur age? I mean you hold a lot of knowledge for a teen(if you are one)
Love this kind of content even if I barely understand the coding part, kudos !
Wow beauty with brain
C++ Girl🤟
oh yes let's reinvent the wheel.
ooo ROBIN from 'How I Met Your Mother' made a game engine lib!!!
Pretty cool but im not a fan of the misleading title, you didn't make a game engine, you wrote a small wrapper around SDL Which is still cool but that giant claim is just not truthful. And unless im missing something here your Tahm deconstructor isnt properly freeing resources, you might wanna check that out.
i just opened youtube and i saw this and im also building one. But hey im building just for fun ; ). kudos to you for completing the project !
:) thank you
16 minutes just to show you made pong
ქართველი Jonathan Blow
დიდი მადლობა იუთუბის ალგორითმს რომ ამომიგდო fellow C++ and video games enjoyer, proud of you, ეგრე გააგრძელე. World is not doomed yet
Oh look! It's C/C++ engine number 2048503 on youtube... Let's reinvent the wheel over and over again instead of contributing to solutions that already exist since years like Bevy, Godot or Raylib.
Keep going you're doing great! I've been a big fan of using LLMs to speed up learning, not sure if you are already. It's pretty useful to be able to ask ChatGPT to explain how a library or game engine works. Or even have it generate the code for you then you walk through it in the debugger to understand how it works. It's much faster than looking through the API docs and sample code for SDL, etc. I think the new era of jobs are all going to be AI-assisted. Game development is so slow and companies love that LLMs make developers 25-40% more productive. In my last couple videos I've been using Google's Filament rendering library to make a VR game in C++. Filament also uses SDL (and Assimp for asset importing) for a couple things behind the scenes. But it handles all the rendering itself. Someone mentioned below that it would be a useful next step to learn how to write the rendering code with a modern graphics API like Vulkan (or even the older OpenGL) or DirectX 12.
TamtaEngine XD
i m just starting to learn c++ and now i m scared
😀😄
You're going down a really shitty path. But ı like it bro Your determination dazzled my eyesssss
ძაან კაი კონტენტია გააგრძელე <<<333
Nice project, also cool haircut
That'll be cool something IDE independent. In a way anyone with his/her selected platform, compiler, IDE or even simple text editors be able to run it. Anyway, congratulation!
While, I am happy and proud of your effort, you've made an abstraction layer. Basically, SDL already is doing exactly what you've done, you've just given it different names. I'm happy to see it simplified, and it's cool that you're flexing your understanding of OOP and header file/c++ knowledge, I definitely think if you want to learn properly for C++ development and jobs, learn (modern) OpenGL, build a 2d scene, a 3d scene, make some shaders. SDL uses OpenGL underneath, and if you wrote a game engine that interfaces with graphics through OpenGL and audio through OpenAL, then that would be awesome. If you want to take it a step further, networking is probably the hardest thing to do in c++ and a lot of people will see that as an impressive skill. Anything networking in c++ is amazing. You could build a packet system in your game engine with Game Networking Sockets, asyncio, or enet. Awesome starting point, keep up the good work! I really do recommend learning OpenGL next.
I think the approach taken is a reasonable first step: understanding how a lower level C++ library like SDL interacts with the system then make some basic games in C++. A next step of course could be to try to implement the rendering code with Vulkan or OpenGL for simplicity.
Good start! 2 pieces of advice: 1: look into learning build systems like cmake or meson. 2: force people to instantiate an object derived from your `tahm` class. that way you can use virtual functions for those 4 primary methods you used. people will tell you "BUT THE VTABLES!!!!1111" but ignore them for the time being, your library is not yet in a state where the handful of nanoseconds that level of indirection causes per call actually matter.
I like polymorphism and i love hacking around with vtables but saying the cost is only nanoseconds isnt quite right, the branch predictor gets all messed up cause of the dynamic jump to a "yet unknown" instruction address it has to wait for to get resolved. But yeah it doesn't matter either way for this project.
Instead of using functions why not wrap everything into a class and pass the main loop to that class CGame game; int main(int argc, char** argv){ try { game.Startup(argc, argv); result = game.Run(); } catch(std::exception& ex) { } game.Shutdown(); return result; } // The engine class class CEngine { public: void Startup(int argc, char** argv); void Shutdown(); int Run(); protected: virtual void OnUpdate(); virtual void OnRender(Graphics g); //... other engine events private: void Update(); void Render(); }; The user can select any events he needs class CGame : public CEngine { protected: virtual void OnUpdate() overrride; virtual void OnRender(Graphics g) overrride; // other events }; For a game loop I suggest using a timer to limit updates to 30 or 60fps,, because not all systems have the same speed, this will also help interpolate updates const double UPDATE_STEP = 1000000000.0 / 60.0; // 60 updates per second const double DISPLAY_FPS_STEP = 1000000000.0; // 1 second ... // for updates double dDeltaUpdateTime = 0; int nLastUpdateTime = 0; // for displaying fps and ups counter int nLastFPSCounterTime = 0; // for displaying fps and ups int nUpdatesPerSecond = 0; int nFramesPerSecond = 0; while(running) { uint64_t nCurrentTime = CTimer::Now(); dDeltaTime += nCurrentTime - nLastUpdateTime; nLastUpdateTime = nCurrentTime; while (m_dDeltaTime >= UPDATE_STEP) { // increment ups nUpdatesPerSecond++; // decrease delta time dDeltaTime = dDeltaTime - UPDATE_STEP; // update update(); } // show fps and ups every second nCurrentTime = CTimer::Now(); if (nCurrentTime >= nLastFPSCounterTime + DISPLAY_FPS_STEP) { nLastFPSCounterTime = nCurrentTime; // display FPS counter std::string strTitle = strTitle + " - FPS:" + std::to_string(nFramesPerSecond) + ", UPS:" + std::to_string(nUpdatesPerSecond) SDL_SetWindowTitle(window, strTitle.c_str()); // reset counters nFramesPerSecond = 0; nUpdatesPerSecond = 0; } // increment fps nFramesPerSecond++; // draw on the screen draw(); } The counters can be wrapped into a timer class for easier use timedUpdate.Update(); while (timedUpdate.CanStop(UPDATE_STEP)) { Update(); } if (fpsCounterTimmer.Stop(DISPLAY_FPS_STEP)) { // display FPS counter std::string strTitle = strTitle + " - FPS:" + std::to_string(nFramesPerSecond) + ", UPS:" + std::to_string(nUpdatesPerSecond) SDL_SetWindowTitle(window, strTitle.c_str()); // reset counters nFramesPerSecond = 0; nUpdatesPerSecond = 0; } class CTimer { public: static uint64_t Now(void); public: void Update(void); bool Stop(double ns); bool CanStop(double ns); protected: uint64_t m_nStartTime = 0; uint64_t m_nLastStopTime = 0; double m_dDeltaTime = 0; }; uint64_t CTimer::Now() { auto now = std::chrono::system_clock::now(); auto now_ns = std::chrono::time_point_cast<std::chrono::nanoseconds>(now); auto epoch = now_ns.time_since_epoch(); auto duration = std::chrono::duration_cast<std::chrono::nanoseconds>(epoch); return duration.count(); } void CTimer::Update() { uint64_t nCurrentTime = CTimer::Now(); m_dDeltaTime += nCurrentTime - m_nLastStopTime; m_nLastStopTime = nCurrentTime; } bool CTimer::Stop(double ns) { uint64_t nCurrentTime = CTimer::Now(); if (nCurrentTime >= m_nStartTime + ns) { m_nStartTime = nCurrentTime; return true; } return false; } bool CTimer::CanStop(double ns) { if (m_dDeltaTime >= ns) { m_dDeltaTime = m_dDeltaTime - ns; return true; } return false; }
People will literally build their own game engine instead of getting therapy.
congratulations you made me chuckle. your prize is getting pinned in the comments
Way better than therapy 🤔
@@MartianGames Indeed
best therapy
Real
you should check out neovim! I am building a game engine as well in C++ lol. It makes my workflow so much better.
Very cool! I had a poke through the repository, I think it's a great example of something that could be useful for multiple games without the overhead of developing in larger/commercial engines, especially for smaller games, which is a hard thing for a lot of new game devs to wrap their heads around. I hope this inspires a lot of new developers, and you're clearly on your way to growing and building more. Great job!
thank you for all the kind words! i initially thought about making the library just for me and my projects but then i thought hey, why not share it
по любому русская баба
Calling timer function in Update instead of fixed update make no sense, Complete() is being called in update instead of locally defined Boolean, better to use a coroutine or thread instead of mono behaviour methods. you should not destroy object, but considering your demo functionality it is fine. though your C++ video was great.
lisan al gaib.
1:38 "I keep saying engine. It's more of like a library" > titles video "I made a Game Engine" I guess "I made a game library" would sound a lot less cool, hah
The distinction has never been clear on what is an "engine".
i'm allowed a little bit of clickbaiting, as a treat
Loved you in Dune. Great video ✨.
i thought you were space nomad ..Have you found a permanent planet?
I think i know how to solve your problem with callback. Here Cherno imokemented an Entry point. Basically engine it self controls where everything starts. czcams.com/video/meARMOmTLgE/video.html One or more things: 1) i noticed that you are commiting the files which is not intented to commit like .tlog. I want suggest of using .gitignore file 2) Second big thing, you've put external libraries into lib directory. As far as i know it is not the best choice of the name. lib directory is inteded to store .lib, .dll files the Vendor dir "should" store the external libs.
unity is pretty powerful if you know how to program well. I like the job system and since I've worked with it for like 12 years it's my go to thing to mess with
I guess film business having bad times if Timothee going for c++.
When a 🤡 Stan of T. leaves a smell in the room
That’s awesome job kid! Keep it up.
❤❤❤❤❤❤❤❤😊
you should consider transitioning to a female
lovely video :3
hi tamta ❤
Not to discourage you, but I don't know if I would call this a library. Feels more like a game template more than anything, which is fine. It's just, an library typically has a lot more components ready to make games. Nevertheless, keep up the good work. Suggestion: Be sure to add the Debug and Release folders to your .gitignore. You don't want/need to be pushing those folders to git.
Dont let the gamedev industry kill the love for the games in you. Do games for fun, I'm not recomend it for a job.
Liked this so Tamta sees it
Amen. If I ever finish one of my game projects, I'll make them available for free. Anything forced kills the passion.
Hi
Why didn't you just use UE5, its C++ ?
UE5 is a game engine and as she said she is doing this to land a job. Most big companies don't use game engine and have their own. So she needs to do this to understand how they work.
noice! look up pimpl pattern to hide the window function