He wrote this out BY HAND? // Code Review

Поділитися
Вставка
  • Опубліковано 17 гру 2024

КОМЕНТАРІ •

  • @TheCherno
    @TheCherno  2 місяці тому +44

    Hope you enjoyed the video! Check the description if you want me to review your code.
    Also don't forget you can try everything Brilliant has to offer-free-for a full 30 days, visit brilliant.org/TheCherno . You’ll also get 20% off an annual premium subscription.

    • @yingcheng1589
      @yingcheng1589 2 місяці тому

      Cherno make a python teaching 😊series

    • @TheFrankvHoof
      @TheFrankvHoof 2 місяці тому

      You don't type that out by hand.
      You have an intern do it for you! 😂

    • @layqwo4274
      @layqwo4274 Місяць тому

      Hi Cherno! Can you please tell what Visual Studio theme you are using or is it a custom one, cause i haven't been able to find smth like this. Thank you in advance

  • @saurabhmehta7681
    @saurabhmehta7681 2 місяці тому +394

    Thanks for reviewing my code Cherno! I agree that there could be better way to structure the code, like having a reference to renderer rather than making it static and so on. And the initialization does seem weird when I look at it now after a year :) Thanks for the awesome feedback, I will definitely checkout the full length review on Patreon!

    • @AftercastGames
      @AftercastGames Місяць тому +9

      I love Cherno, and I love this channel, but I actually disagree with him here. I use static classes and variables by default, and only use non-static instances when needed. Especially in games, where you will only ever have one game engine and one window, both of those classes can just be static, and can be called by any other code. However, as a general rule, I normally try to minimize the number of static classes that one class interacts with.
      This is a great little project, btw. Good job.

    • @devmishra18
      @devmishra18 Місяць тому +5

      Interesting take, I personally think that Static classes makes it very difficult to extend the code or write tests for the code which are very important aspects of software development imo. Obviously, some use of static classes can be justified, but if you are depending on it too much then it sounds like a code smell to me.
      Being said that I am open to learning more about this.

    • @Unhinged-yu6km
      @Unhinged-yu6km Місяць тому +6

      L indian coder hahaha

    • @malekith6522
      @malekith6522 Місяць тому +11

      ​@@AftercastGames With static classes, you can’t predict when they will be initialized. This can be problematic when the order of initialization is crucial. For example, your logger needs to be initialized before the game engine itself, or network components need to be initialized separately or any other resources.
      As a rule of thumb, you should think twice before using static classes. Consider whether it even needs to be a class, or if it could just be functions within a namespace.

    • @lukasjetu9776
      @lukasjetu9776 Місяць тому +2

      @@Unhinged-yu6km your name fits you pretty well

  • @RandomGeometryDashStuff
    @RandomGeometryDashStuff 2 місяці тому +65

    02:50 also not use "unsigned long" or "signed long" because it's same size as memory address (`sizeof(void*)`) on linux, but 32 bit on windows (both 32bit and 64bit)
    edit: I mean don't assume `sizeof(void*)==sizeof(long)` if you care about windows

    • @DataToTheZero
      @DataToTheZero 2 місяці тому +10

      What's next, you going to insist on proper usage of size_t, intptr_t, and uintptr_t? Suddenly int32_t and int64_t are your new best friends? And then all bit arithmetic can't be 8 based but instead needs to count from CHAR_BIT because magic numbers are bad and just maybe somebody will be targeting a more than 8-bit per char system? pfft, portability is for porters.
      PS, "explain the difference between size_t, intptr_t, and uintptr_t?" is a good interview question.

    • @Firestar-rm8df
      @Firestar-rm8df 2 місяці тому +25

      @@DataToTheZero I expect you are being sarcastic, but to everyone else reading this, please just use the standard types for portable code. It's not that much harder to just use the portable types, and if you care about the bit layout of a type you should really be being explicit about it anyway. Please. Please. Please I don't want to debug more issues that work on one OS and CPU but don't on another because the length of a type changed.

    • @mytech6779
      @mytech6779 Місяць тому

      Meh. Windows is not always 32b long.
      Anyway int64_t uint64_t are sufficient. Or int_fast32_t if 32b is big enough but you want it more portable between 32b and 64b machines

    • @RandomGeometryDashStuff
      @RandomGeometryDashStuff Місяць тому

      @@mytech6779which windows `4!=sizeof(long)`?

  • @Aoun-Hussain
    @Aoun-Hussain 2 місяці тому +222

    Whoever made this game
    I LOVE YOU
    Because I'm working on my first game and was having second thoughts that it's not worth going through with it becuase it looks just like "Skyward Scammer". But now I'm going to finish this project if it's the last thing I do

    • @saurabhmehta7681
      @saurabhmehta7681 2 місяці тому +27

      Glad to hear. Go for it! :)

    • @fangornthewise
      @fangornthewise 2 місяці тому +6

      Name checks out.

    • @w花b
      @w花b Місяць тому +2

      ​@@fangornthewise lol

    • @charmander2k
      @charmander2k Місяць тому +3

      ​@@fangornthewiseyour name doesn't check out

  • @vadimkokielov2173
    @vadimkokielov2173 2 місяці тому +31

    Hey, been lurk watching your channel for three years now. Time to give back, всего наилучшего

    • @TheCherno
      @TheCherno  Місяць тому +4

      Благодарю! ❤

  • @stepa10online27
    @stepa10online27 2 місяці тому +473

    How did you get my code?

    • @ndrechtseiter
      @ndrechtseiter 2 місяці тому +30

      Этот код не только твой, тёзка... 🌚

    • @filimanistr6124
      @filimanistr6124 Місяць тому +18

      он наш

    • @TheRealZitroX
      @TheRealZitroX Місяць тому +12

      @@ndrechtseiter speak english.

    • @ndrechtseiter
      @ndrechtseiter Місяць тому +46

      @@TheRealZitroX 🤓☝️

    • @ndrechtseiter
      @ndrechtseiter Місяць тому +71

      @@TheRealZitroX you have a "translate to English" button, by the way.

  • @AgentM124
    @AgentM124 2 місяці тому +115

    for April fools you got to review perfect code and then suggest things that make it worse. Or, review something atrocious and say that it's perfect. idk. but it has potential :)

    • @pandalonium
      @pandalonium 2 місяці тому +10

      But… what is perfect code?

    • @no_name4796
      @no_name4796 2 місяці тому

      Perfect code is basically what haskell programmers masturbate to

    • @Al-tt6tj
      @Al-tt6tj 2 місяці тому +5

      he would lose credibility if he did that

    • @roberthoople
      @roberthoople 2 місяці тому +13

      Maybe not as an April Fools, but I like the idea.
      From experience, there's a lot of value in sometimes tackling a problem from an unusual angle. This is especially true for learning as well, but unfortunately we love our one-size-fits-all way of teaching, and such things are frowned upon.
      I used to get in trouble, in my Math classes, for using the answer key (when available) to work backwards, in order to actually understand the concept we were learning, because their traditional method of lecture, notes, then work, didn't work for me. All the stuff that never "stuck" with me, was almost always the stuff I didn't have the answer keys for, or the times that I was outright prohibited from using my "backward" method to understand them; getting my text book (with its answer keys) taken away, and then being given only photocopies of the assignment from that textbook.
      So this idea could be a very interesting way to teach certain advanced topics that people really struggle with. Start out with that "perfect" code, which is so cryptic and unrecognizable to the student that they'll normally just give up on it, but then break it down into "bad" code, which despite being "bad" (and maybe funny to more advanced programmers), lands up cutting through all the in-between concepts and creating a path back to the recognizable and comfortable concepts that the amateur does understand (aka: bad code).
      Plus, it would be very entertaining.

    • @xeridea
      @xeridea Місяць тому +3

      @@pandalonium int main() { return 0; }

  • @billy.d3v
    @billy.d3v 2 місяці тому +111

    3:43 - "Okay, im excited, lets play this gam..." *ERROR: THIS CODE EXECUTION CANNOT PROCEED...*
    Lmao xD

    • @JavedAlam-ce4mu
      @JavedAlam-ce4mu 2 місяці тому +12

      Lol guess he skipped over the troubleshooting and left it in the Patreon version.

    • @billy.d3v
      @billy.d3v 2 місяці тому +4

      @@JavedAlam-ce4mu ye, but funny cut xd

    • @WibleWobble
      @WibleWobble 2 місяці тому +5

      I think it was a fairly simple fix at least, looks like that thing that happens when you forget to put the dll in the same directory as the exe

  • @anon_y_mousse
    @anon_y_mousse Місяць тому +9

    They've proposed and supposedly adopted for C++26 #embed which is already available for C23. We're not quite there as far as it being usable for the majority because people don't update their compilers but once a decade. However, I'm excited for the future because if C or C++ gets it, you know other languages will copy it. I also like the filesystem::path technique because you can just write paths like you're always on a good OS, such as Linux, but then get the correct delimiter and whatnot. The real bonus is that you can just about use plain text in your source code when defining paths instead of everything in a long string or using any kind of format stuff.

  • @doglitbug
    @doglitbug 2 місяці тому +13

    Totally seeing the remnants of one lone coder engine here!

  • @afterschool2594
    @afterschool2594 2 місяці тому +28

    2:39 I usually support Linux and Windows but not MacOS since I have never used it

    • @ismbks
      @ismbks 2 місяці тому

      that's not very chill

    • @gaming53wishmaster71
      @gaming53wishmaster71 2 місяці тому +1

      And me idk if i would support windows or mac as for i think windows has to meany holes and is a dieing os linux to the win

    • @vibaj16
      @vibaj16 2 місяці тому +4

      @@gaming53wishmaster71 And I don't try to support anything other than my particular device b/c I'm lazy

    • @WHYUNODYLAN
      @WHYUNODYLAN 2 місяці тому +7

      MacOS can be a nightmare to support

    • @toby9999
      @toby9999 2 місяці тому +5

      ​@gaming53wishmaster71 Windows has a vastly larger user base than Linux as a desktop os, and this will continue. Linux is unlikely to displace Windows any time soon. Linux is way behind, and it's an inconsistent mess.

  • @Roman8707
    @Roman8707 2 місяці тому +70

    5:12 is that seriously Mario Raceway from Super Mario Kart??? XD

    • @TheCherno
      @TheCherno  2 місяці тому +13

      lol I didn’t even notice that!

    • @MattRose30000
      @MattRose30000 2 місяці тому +20

      Javidx9 made a video a while ago where he made a mode7-like effect and used this exact tilemap. I guess they just took the code and pasted it into here.

    • @zoobloik2
      @zoobloik2 26 днів тому +1

      I immediately thought the same as soon as I saw it - straight away I was like "have they seriously ripped off the mario kart track?" 😂

  • @exxon47_
    @exxon47_ 2 місяці тому +12

    15:46 I'd like to mention that in C23 there is a preprocessor directive called #embed built-in that allows you to construct a byte array from a binary file unfortunately this feature was not added to the C++23 standard however C++ may get this feature one day which would be cool

    • @0LoneTech
      @0LoneTech Місяць тому +1

      It's a little silly. The purpose of #embed is to bypass chunks of the compiler when all you want to do is embed a bunch of data. I.e. it avoids parsing an autogenerated array literal typically 2-5 times the size of the input data. But if what you needed done was bypassing the compiler, you can simply link it in the first place, e.g. objcopy -I binary -O elf64-little inputfile object.o. So the advantage is single entry point to the compiler and constexpr sizeof. C++ is all about adding stuff and painfully slow compiles so it'll probably get there.

    • @anon_y_mousse
      @anon_y_mousse Місяць тому +5

      It's proposed for C++26, so in about 12 years when everyone updates to that version you can count on seeing it everywhere. I don't know why the other guy doesn't like it, but it would actually speed up compiles because instead of parsing a giant comma separated array of 0x??'s you'll get direct inclusion. The objcopy method isn't exactly portable either.

  • @dnishimura
    @dnishimura 2 місяці тому +14

    Congrats on nearing end of October with 666K subscribers :)

    • @gaming53wishmaster71
      @gaming53wishmaster71 2 місяці тому +3

      Wow i dident even notice he had 666k wow lol happy Halloween in deed

  • @comalab2387
    @comalab2387 2 місяці тому +10

    You don't put stuff in a c'tor that can fail, hence the init function which offers a return type.

    • @Firestar-rm8df
      @Firestar-rm8df 2 місяці тому +5

      Normally I'd agree, but this is the init for the main game loop... if this fails what are you really going to do? I say log an error and then terminate.

    • @comalab2387
      @comalab2387 Місяць тому +1

      @@Firestar-rm8df it's a matter of principle. If you have a class function that can fail, let the user decide what to do. Imagine documenting this. "Here's the Game class. It has a void init() function which can fail but you'll never know. Just let your program crash or whatever."

    • @RetroAndChill
      @RetroAndChill Місяць тому +3

      @@Firestar-rm8dfI think in that case maybe but I still think it’s less error prone to have a factory function that returns an std::optional than just having the constructor throw an exception since it forced the user of your API to deal with the error explicitly. In Java its a somewhat different story because of checked exceptions, but in C++ I would do it that way.

    • @Firestar-rm8df
      @Firestar-rm8df Місяць тому

      I agree if this was something else. But it isn't. It's the top level of your application code. Looking at how the rest of this is structured an error message followed by termination is fine.
      I would never recommend throwing an exception from a constructor or destructor, that is messy imo. I prefer explicit return types.
      Returning a std::optional from a factory is a good alternative for similar cases. Especially if you make the factory function a friend of the class, and then restrict instantiation to force the use of the factory for initialization of the object. I especially like this as you can't forget to initialize portions(something I see all too often with init functions).
      That said, for a top level object in application code like this I still think it's kind of overkill. Now if this was a library, or something, again, yes, definitely do this, or if you are setting up a reusable framework for other games yeah you should do it. It's cleaner, and you still have a single call where you can pass all the required parameters so you don't get half initialized objects. But if the main application code for your application can't initialize really, 99% of the time all you are going to want to do is log an error and terminate nearly immediately. Maybe attempt to dump a crash file to disk, pop up an error msgbox, or attempt send a signal to some other process that we are about to force terminate if we got far enough we can do basic IO, but that's about it really for most cases. This isn't an embedded safety critical system where we keep the software limping along in whatever state we can as much as we can just so we can maybe mitigate something. It really doesn't make sense to do anything else in this case.

  • @rohitaug
    @rohitaug 2 місяці тому +17

    There are some benefits to using a fixed array for assets. You could have an enum with the names of all assets defined at compile time, which can then be used to pass in asset handles globally anywhere in your code just using that enum value. A file watcher would discover the assets at runtime so you need a gui based editor to know what the assets are.

    • @anoomage
      @anoomage 2 місяці тому

      In my system I get my assets based on their file path (for example "Resources/Meshes/cube.obj")
      I supposed that I would load/get assets only on application init, so I don't think I need something like a superfast std::vector, or an ultra-fast std::array. A fast enough hashmap should do the job. The benefit is that I can load my assets from their on-disk path/name, which is very convenient.

    • @andersr9545
      @andersr9545 2 місяці тому +4

      another trick is to let the last value of the enum be named size, then you can for instance store an std::array if you want to do what he did in the video. the array is then automatically set to the correct size

    • @MrDavibu
      @MrDavibu 2 місяці тому

      I think what you mean is not possible in C++.
      In C++ an enum is represented as literals, that are translated into numbers at compile time. There are no strings in enums in C++.
      I mean you could use a hashmap inside C++ that saves the name as string and the "handle" as ID if you want.
      But I think it's better to abstract the concepts you use for assets away and have a document that specifies what asset is what concept (e.g. floor, wall, object, player, enemy). You could still specify these mappings inside a ,.cpp or .h file if you have a smaller game or want to avoid parsing a file. This can also be useful for development, because later on you only have to write a parser that fills in the data structure you already have and the rest should still work,

    • @rohitaug
      @rohitaug 2 місяці тому

      @@MrDavibu See andersr9595's comment. I mean the exact same thing, using the enum as an index into an array of strings. Maybe I didn't word it properly...

    • @SchmittySchfin
      @SchmittySchfin 2 місяці тому +1

      I worked on a contract where the company’s developers did that - an enum and a string array (technically char*), where they’d index into the string array with the enum. It was the worst thing ever implemented and the source of way too many bugs.
      You never ever want code to be structured in a way that two separate data sources MUST line up to work correctly. All it takes is one value to be removed, changed, or moved in only one of the sources for everything to collapse… which is exactly what happened with the contract I worked on. So yeah, don’t do that.
      There’s no benefit at all to what you suggested - only ways it WILL fail.

  • @JavedAlam-ce4mu
    @JavedAlam-ce4mu 2 місяці тому +4

    What a speedrun! Harder than it looks, that was pretty impressive for a first go.

  • @daviddursty3215
    @daviddursty3215 Місяць тому +6

    When you say to "structure your code like a tree" at 9:00, I think what you mean to say is to "prefer object composition over class inheritance". This is by no means a new concept. There's a great section on this in the 1995 book "Design Patterns" in Section 1.6 under "Inheritance versus Composition". Yes, I quoted the section there. If you don't have the book, I'd recommend buying it (or checking it out from the library). It's a classic in Software Engineering literature, with much information still relevant.

  • @irrelevant_noob
    @irrelevant_noob Місяць тому +4

    20:52 bug introduced: you changed the expected structure of the image folders, and now all the sprites need to be folders containing a single file called ".png"... 👀

  • @spicynoodle7419
    @spicynoodle7419 2 місяці тому +50

    Holy crap, they have overloaded the division operator to use it for concatenating OS path strings

    • @Mad3011
      @Mad3011 2 місяці тому +21

      Yep, and here I thought overloading the shift operators for io was bad already. xD

    • @VerMishelb
      @VerMishelb 2 місяці тому +7

      IIRC it is this way to make it separate from regular concatenation with +, because different OS can use a different path divider. Even though most of them support the forward slash out of the box.

    • @AlexMax2742
      @AlexMax2742 2 місяці тому +1

      Even worse when you accidentally use that overload on a URI out of habit.

    • @AlexMax2742
      @AlexMax2742 2 місяці тому +8

      @@Mad3011 Overloading bitshifting is bad enough, but my hot take is that overloading addition on strings was a bad idea. Addition is a fundamentally different operation than concatenation, because it doesn't compose like addition - there is no such thing as subtracting two strings, nor multiplying or dividing.

    • @bartolhrg7609
      @bartolhrg7609 2 місяці тому +3

      ​@@AlexMax2742 there doesn't need to be subtraction
      In the simplest terms: plus sign means addition, and concatenation is adding characters of the 2nd string to the end of the 1st
      It is not necessarily tied to subtraction

  • @letronix6243
    @letronix6243 9 днів тому

    These are pretty healthy videos and a nice idea. Helping beginner programmers by going through their code and addressing common inconveniences is a nice idea and I think it would have helped me in a time where I was new and did identical things.

  • @Baekstrom
    @Baekstrom 2 місяці тому +6

    I'm just happy to see that in 2024 there are still newcomers to programming that choose C++ as their language of choice. Recruiting for C++ jobs is already getting rather difficult as other languages gain popularity.

    • @RetroAndChill
      @RetroAndChill Місяць тому +5

      Rust programmers learning there’s no Rust jobs

    • @RetroAndChill
      @RetroAndChill Місяць тому +3

      Realtalk thought, I love C++ because it gives you options for relative safety but still allows you to do hacky things if you need to

    • @adygombos4469
      @adygombos4469 Місяць тому

      @@RetroAndChill Rust lets you do wacky stuff too, just makes you put it in an unsafe block so it's easier to debug.

    • @samuelclemens6841
      @samuelclemens6841 Місяць тому

      @@adygombos4469 And then you might as well use C++

    • @rretro2042
      @rretro2042 29 днів тому

      ​@@adygombos4469too much hassle with rust. c/c++ is much easier

  • @chotenque6877
    @chotenque6877 2 місяці тому +10

    bro saw that macro with replacement text and got legit pissed lmaoo

  • @notdeus3834
    @notdeus3834 2 місяці тому +4

    Amazing vid as always, Cherno. Could you please make a video dedicated strictly to best practices?

  • @ChadMourning
    @ChadMourning 2 місяці тому +3

    Ending reminds me of Mode 7 from SNES.

  • @sumikomei
    @sumikomei 2 місяці тому +2

    This is interesting, so much to take in from all this lmao also extreeemely interested in seeing the pseudo-3D rendering that reminds me of SNES and Genesis games.

  • @Ayodehi
    @Ayodehi 2 місяці тому +4

    You make me feel so old that you don't immediately recognize Mode 7 graphics from Mario Kart on the SNES :)

  • @daniel.watching
    @daniel.watching 2 місяці тому +2

    15:45 Is there a better or more standard way to embed binary data in C? Often I have a bunch of data structures I have to pre-compute. I could massively reduce the start-up time for some code with those things pre-baked but I can't think of an elegant way to include an arbitrary binary blob inside a C binary (other than explicitly hex encoding it in a header file which feels hacky).
    Also I don't think this is good practice for fonts. It makes the code less readable with no performance benefits. Just make sure you include the font file in the source so people don't need to install a system font to run your project. Embedding as binary is a little extra.

    • @Stroopwafe1
      @Stroopwafe1 2 місяці тому +3

      C23 introduced the #embed preprocessor statement. If using a newer version is not a hindrance, you can take a look at that?

    • @VerMishelb
      @VerMishelb 2 місяці тому +2

      To add to the above-mentioned #embed directive, another way for older C standard would be to use assembly, though I'm not sure how cross platform that would be. This was a common thing among the GBA devs because it's faster to compile and guarantees the alignment if done properly. You can read about this in TONC Bitmap section. Using arrays is still fine otherwise, as long as they are const and are not defined in the header file, which would cause *every* file using the array to compile it again.

    • @JanSoltan-wj1hs
      @JanSoltan-wj1hs Місяць тому +1

      ​@@VerMishelbYou can declare e.g. mFontBytes as extern in a header and define the actual data in a separate source file

    • @0LoneTech
      @0LoneTech Місяць тому

      The source file in this case is the resource file (e.g. the .ttf), to link it you can wrap it in an object file. E.g. with GNU binutils:
      objcopy -I binary myfont.ttf -O elf64-little myfont.o
      You'd then access it with something like SDL_RWFromConstMem(&_binary_myfont_ttf_start, &_binary_myfont_ttf_size). Unfortunately the tooling for this isn't standard, but it might be available in your build system.

    • @mytech6779
      @mytech6779 Місяць тому

      In C++ you could try consteval to force pre-computing during compile. It's a bit like constexpr but constexpr is allowed to fall back to runtime execution while consteval is an error if not computed at compile time. (*do your own research, I'm a bit fatigued)

  • @grubzer1369
    @grubzer1369 2 місяці тому +4

    2:58 - also dont use platform-specific compiler C++ extensions. Got caught on GCC dynamic c-style arrays not compiling on windows msvc

    • @HypocriticalLemur
      @HypocriticalLemur Місяць тому

      What do you mean? What was the problem exactly?

    • @grubzer1369
      @grubzer1369 Місяць тому

      @@HypocriticalLemur syntax like:
      Int size = getIntFromUser();
      Int[size] myArr = {0};
      Wont work in msvc since c-style array with dynamic size is a gcc c++ extension

  • @rideorhitchhike3347
    @rideorhitchhike3347 2 місяці тому +4

    Hahaha, 18:55 looks like Pirate Software (Maldavius Figtree)'s code.

  • @aredrih6723
    @aredrih6723 2 місяці тому +4

    21:02 never used the filesystem path api before but shouldn't there be a + instead of a / between the filename and extension ?

    • @bronkolie
      @bronkolie 2 місяці тому +3

      The std::filesystem::path class has the / operator overloaded to concatenate two paths, while adding a path separator in the middle if necessary

    • @aredrih6723
      @aredrih6723 2 місяці тому +4

      @@bronkolie sure, and I have no problem with the first use of the operator on the line.
      But the second is between the sprite name and the string ".png"; do you add a path separator between a file name and its extension ?

    • @bronkolie
      @bronkolie 2 місяці тому +4

      @@aredrih6723 Damn, looks like you're right. It says in the docs "when appropriate", butI just checked, and it still adds a slash between a filename and extension, even if the extension is just a const char* or a std::string. Weird
      Edit: now that I think about it, you can have filenames like .gitignore or .bashrc. So assuming something is a file extension can't work

    • @0LoneTech
      @0LoneTech Місяць тому

      Either path+".png" or replace_extension(path, "png").

  • @vxlaris
    @vxlaris 2 місяці тому +3

    4:55 the outplay thoo

  • @LacklusterFilms
    @LacklusterFilms 2 місяці тому +4

    Woupd you ever go over some of the godot engine source code? Would be cool to hear from a game engine guy what you like or don't like about it's code

  • @cswithjustin
    @cswithjustin 4 дні тому +1

    where can i buy this hoodie ?

  • @Draeith
    @Draeith 27 днів тому

    @ 16:14 Not a headafile! Anything but those!

  • @astralengineer1
    @astralengineer1 2 місяці тому

    I’m a web dev, no idea what is going on in any of your videos but I still love to watch them.

  • @andersr9545
    @andersr9545 2 місяці тому +1

    what are the advantages of using filesysystem::path over string? seems a bit annoying to me, is it just that you can write path/to instead of path + «/« + to?

    • @jamesmnguyen
      @jamesmnguyen 2 місяці тому

      More functionality I assume

    • @merseyviking
      @merseyviking 2 місяці тому +10

      It handles platform specific stuff such as path separators; it does path validation; it can normalize paths; you can get absolute or relative paths; change extensions, and a load more. It also means it's easier for a human to understand its sematics.

    • @dawiddulian2403
      @dawiddulian2403 2 місяці тому +2

      You can also easily: list the whole directory, create and destroy files or folders, check if file/folder exists, get access to every part of the address, etc

    • @Firestar-rm8df
      @Firestar-rm8df 2 місяці тому +1

      in addition to what's already been stated, it adds some extra type saftey as you know it should be a path and handled as such. And you can leverage this in a bunch of ways, such as with templates.

    • @ChaoticRay
      @ChaoticRay 2 місяці тому

      @@merseyviking Is there something like this for C? I somehow forgot that different platforms have different path separators. That would be very useful.

  • @BobChess
    @BobChess 2 місяці тому +6

    I initializer my pointer arr without using for loop

  • @roberthoople
    @roberthoople 2 місяці тому

    @11:16 - How did you select all the static keywords like that?

    • @dmitrikozak7837
      @dmitrikozak7837 Місяць тому +1

      Holding alt and dragging over the code allows a more squared highlight

    • @roberthoople
      @roberthoople Місяць тому

      @@dmitrikozak7837 OMG!!!!
      You have literally made my week!
      Thank you.

  • @0z2ae
    @0z2ae Місяць тому +1

    17:44 how did he change ASSETS to assets so fast??

  • @kevinkkirimii
    @kevinkkirimii 2 місяці тому +2

    Regardless of the issues, what a nice game.

  • @damyandimitrov611
    @damyandimitrov611 25 днів тому

    Couldn't RPG Assets in 17:34 be done with a single string and then split by ", " or " " instead of hardcoding it like that?

  • @Sollace
    @Sollace 2 місяці тому +28

    15:47 NO. God no. For the love of hod, do NOT embed resources as cpp header files. Include the ttf in your project and load it in the first time you need it. No one will subtract points if you do that (except this guy apparently).

    • @JasonGrace69
      @JasonGrace69 2 місяці тому +12

      Due to this actually being a big demand, c23 adds #embed as a preprocessor definition to do exactly what you are saying not to do. This kind of thing is great if you want a resource to be available at compile time or just to avoid wasting resources unnecessarily at runtime. Its becoming more popular now since worrying about binary size is really a thing of the past.

    • @brod515
      @brod515 2 місяці тому +2

      why not ?

    • @connorsweeney6210
      @connorsweeney6210 2 місяці тому +2

      Why not?

    • @JohnDoe-jk3vv
      @JohnDoe-jk3vv 2 місяці тому +1

      Why not, brony?

    • @Sollace
      @Sollace 2 місяці тому +6

      @@connorsweeney6210 You're taking a file, that you can view, easily, and turning it into a jumble of bytes. What's going to happen if you need to edit or replace the file? You can't. You have to pull up the original, make the change, and re-run whatever conversion. It's better to just have your code read the file. Embedding it in your code isn't going to make it run faster to any degree that matters. Maybe it did when we were coding for the NES but not any more. You're trading away maintainability for little to no reason.

  • @Egalobert
    @Egalobert 2 місяці тому +1

    The nitialization is definitely kinda 'weird' .. some things being implicitly initialized on the Objects creation, some requiring an explicit call to 'init', and even 'startGameLoop' seems to do some further initialization.. i guess that both the RAII and the deferred approaches are reasonable, but it should at least be consistent (along related Objects)

  • @kfitch42
    @kfitch42 2 місяці тому +20

    This is arguably nitpicking, but I would rather see GameEngine as a member of RPG_Game instead of a parent class. Having it as a parent class fails the classic IS-A vs HAS-A test. RPG_Game IS A GameEngine ? RPG_Game HAS A GameEngine works better.

  • @yoshmeme931
    @yoshmeme931 2 місяці тому

    I love the way you say 'code' lol

  • @jeremyadair5780
    @jeremyadair5780 22 дні тому

    I enjoyed the video. I took basic C courses in college and learned a bit of databases in industry. I like hearing people's opinions. Its refreshing to see logical constructive criticism. I would much rather hear Do's and Don'ts compared to politically correct ambiguity.

  • @nielsdaemen
    @nielsdaemen 26 днів тому

    5:12 This is like Dragon Ball Z on Gameboy Advance!

  • @urisinger3412
    @urisinger3412 2 місяці тому +6

    Do you accept rust code?

    • @zanagi
      @zanagi 2 місяці тому +10

      Hes the cherno for c++ maybe need the rherno for rust

    • @bluesillybeard
      @bluesillybeard 2 місяці тому +1

      He's done C# before, and he said he's open to accepting other languages. Although I don't know about Rust in particular...

    • @poleve5409
      @poleve5409 Місяць тому

      ​@@zanagiLOL

  • @gsestream
    @gsestream 2 місяці тому

    no, even ascii shader files are separate includes. but that needs to be editable. the font file does not.

    • @gsestream
      @gsestream 2 місяці тому

      make an opencl video

  • @KDTechverse
    @KDTechverse 2 місяці тому

    The Cherno : that was a journey after finishing the game in 5 mins. 😂

  • @Zettymaster
    @Zettymaster Місяць тому

    one thing about the std::filesystem::path concatonation you did: you did it wrong! you used the operator/ instead of operator+ which adds the separator between the filename and its extension, if done like you showed.

  • @MrJay_0xJ
    @MrJay_0xJ 2 місяці тому

    15:56 How can we embed the font and take byte into cpp? can u explain dear master? for example define the fonts in a global h file?

  • @phill6859
    @phill6859 Місяць тому +1

    The folder idea makes me think you have no idea what you are doing.

  • @maervo4179
    @maervo4179 Місяць тому +1

    I think every developer has the famous singleton phase, it will stop after someone ask you to test your code and then you see why singletons are bad 😂

  • @calabrais
    @calabrais Місяць тому +1

    "I absolutely love the tiling. The fact that this texture does not tile whatsoever, but it's so confidently used."
    😂💀

  • @scarletevans4474
    @scarletevans4474 Місяць тому

    5:13 should we be able to see the curvature of the Earth here, especially on that height? The horizon looks completely flat, is the Earth really flat? 😱

  • @theprakashrdas
    @theprakashrdas Місяць тому

    I wanted to check if you have some thoughts on COW(Copy on Write) in C++. can you make a video on it.

  • @skeleton_craftGaming
    @skeleton_craftGaming 2 місяці тому

    the background of the end was DP1 from mario kart ... ...

  • @der.Schtefan
    @der.Schtefan Місяць тому

    This is obviously Mode 7 on a SNES. I am 100% sure they use a SNES emulator and use that to draw the end screen ;)

  • @OrangeIND-
    @OrangeIND- 2 місяці тому +4

    Do Tokyospiff Code review 😂

  • @ttt69420
    @ttt69420 25 днів тому

    If by hand you mean copy paste and tab to next instance of character, then yes.

  • @DanielChristensen-mb5qr
    @DanielChristensen-mb5qr Місяць тому

    It took me 3 minutes to figure out what this "card" you kept talking about was. I realized you're just an aussie pronouncing "code" :D

  • @duramirez
    @duramirez 12 днів тому

    I don't 100% agree about the Static stuff. If a method is self contained and the parameters are all it needs to perform it's function, then I see no reason for that method to be Instance only, since it is not accessing anything that is Instance only.

  • @mattanimation
    @mattanimation 2 місяці тому

    was that a map from wacky wheels?

  • @kotofyt
    @kotofyt 2 місяці тому +9

    I don’t think that code review should be "paid", because it is made to improve reviewed code

    • @deadliaski
      @deadliaski Місяць тому +1

      jeeeez! He doesn't owe you a thing and he's published a free review any way

    • @cicin.
      @cicin. Місяць тому +1

      ​@@deadliaskiYeah people complain way too much when it comes to making stuff paid as a content creator

  • @pillboxgaming4144
    @pillboxgaming4144 Місяць тому

    You didnt notice the ground textures being from Mario Kart? Wonder why Mario Kart?

  • @quintvandijk533
    @quintvandijk533 Місяць тому +1

    Does anyone recognize the brand of his hoodie?

  • @CPUfy
    @CPUfy 27 днів тому

    Me watching the video whilst having no Idea what is going on

  • @Daniel_Zhu_a6f
    @Daniel_Zhu_a6f Місяць тому

    main function consisting of 2 meaningful lines is my biggest trigger. why do people do this is beyond my understanding

  • @3amael
    @3amael Місяць тому

    One simpe rule for mewbies to make their code and life better... composition over inheritance!

  • @donw4889
    @donw4889 Місяць тому +1

    Spending any time developing for Mac seems like a waste 3% of PC are Macs. If it is not a mobile app really point to think about those OS.

  • @SteveBlues87
    @SteveBlues87 19 днів тому

    Bro that's super mario kart from snes lol

  • @Necropheliac
    @Necropheliac Місяць тому +1

    I hate seeing code files that could have been YAML or even XML or JSON.

  • @Ron_DeForest
    @Ron_DeForest Місяць тому

    Just wondering. Have you ever rewritten someone’s code to make a more efficient program? More content potential.

  • @christ01011994
    @christ01011994 2 місяці тому +2

    Coding structure can significantly improve overtime with experience if you are learning along the way.

  • @m.gredemptor2610
    @m.gredemptor2610 2 місяці тому +14

    I won't make apple ports simply out of spite.

  • @kdhupar0
    @kdhupar0 Місяць тому

    Saurabh Mehta ×
    Soraab meta ♡

  • @ettyxcbyrcburcbtxcfhcdtyurt
    @ettyxcbyrcburcbtxcfhcdtyurt 2 місяці тому

    i feel kinda bad id be infuriation if i was on the receiving end of this

  • @MisterEpsilon
    @MisterEpsilon Місяць тому

    Oh... I thought your name was ''Chemo", as in chemotherapy, oops

  • @pablogguimaraes
    @pablogguimaraes 2 місяці тому +1

    The Cherno make a series making an AI model (YOLO) , i think you teaching that stuff will be very exiting!

  • @DelicueMusic
    @DelicueMusic 2 місяці тому

    When your subscriber count is stuck at 666K 😂

  • @fdelduquenobre
    @fdelduquenobre 2 місяці тому

    Is he used to his feet?

  • @Macciejable
    @Macciejable 2 місяці тому +1

    I'm on minute 5, didn't see the code yet, but I love it. Best game 2024.

  • @rswindol
    @rswindol 4 дні тому

    Daily jeet code review

  • @kaosspectrum9805
    @kaosspectrum9805 2 місяці тому +2

    This is a straight rip from javid one lone coder the scene at the end

  • @РусланЗаурбеков-з6е

    100% new game engine in C++ and in SDL??? ))))

  • @albertvanzyl366
    @albertvanzyl366 Місяць тому

    Great video. Next video review please.

  • @will_koerner
    @will_koerner 5 днів тому

    6-8 minute ads....jesus UA-cam needs to stop

  • @arushford
    @arushford 2 місяці тому +2

    lol it's not a TimeStamp Yan, it's a Card.

  • @RonyMarcolino
    @RonyMarcolino 2 місяці тому

    Very interesting!

  • @oleksiistri8429
    @oleksiistri8429 Місяць тому

    Damn, i do this all the time

  • @YoungMetroid
    @YoungMetroid 2 місяці тому

    Mr skill issues trying to roast others 🤣🤣

    • @toby9999
      @toby9999 2 місяці тому

      What does "skill issues" mean in this context? It's an often used phrase in programming comments. Is it a derogotory thing?

  • @xorcise
    @xorcise 5 днів тому

    16:30 beautiful

  • @dj10schannel
    @dj10schannel 2 місяці тому

    Nice 😊

  • @Nitu-s7e
    @Nitu-s7e 2 місяці тому +4

    Premature optimization is bad. This code is better than doing nothing,

    • @MrMoon-hy6pn
      @MrMoon-hy6pn Місяць тому +3

      I’d hardly call taking a const reference to a string, initialising in one place, avoiding macros, avoiding creating objects that are mostly but not completely static, etc, premature optimisations. They just seem like logical tips and design choices.

    • @Nitu-s7e
      @Nitu-s7e Місяць тому +3

      @@MrMoon-hy6pn My point was more like most people waste so much time thinking of organizing their code that they forget the problem they're trying to solve. This guy can fix his code as he gets more mature as a programmer but it is commendable that he put in his effort and made the project work in the first place.

    • @poleve5409
      @poleve5409 Місяць тому

      ​@@Nitu-s7ebro the guy asks for a code review and got the code review, what is the problem here?

    • @Nitu-s7e
      @Nitu-s7e Місяць тому

      @@poleve5409 I don't.

  • @Arkoto1
    @Arkoto1 28 днів тому

    video starts at 3:44 . thank me later

  • @JosaxJaz
    @JosaxJaz Місяць тому

    Haven't done C++ in multiple years, haven't even really commented in a while, but man C++ looks way more complex than I remember it being.
    I've been using plain C for many years now at my courses in college and uni, and looking at C++ code now is just intimidating. I know Unreal Engine uses C++, so I should probably get back into it (I'm a game dev), but the amount of different definitions and ways of doing things is quite a lot. It seems like so many people have different opinions on how to do things in C++, rather than there being agreed-upon standards and such.

  • @ValorQuestStudios
    @ValorQuestStudios 23 дні тому

    I coded my game on rocks and use AI to read it

  • @VakkaHUN
    @VakkaHUN 2 місяці тому

    Do you sleep enough?