Debug the original code and check the result of your dynamic_cast. If it returns 0, then you absolutely not replace it with a "normal" cast, because it means you probably have a pretty fundamental bug in your class hierarchy. Not using a safe dynamic_cast won't fix anything, it will simply hide the bug and turn it into a minefield of weird crashes (if you're lucky) and very obscure behavior (if you're not so lucky).
dynamic_cast returning 0 clearly tells you "sorry, but that object is not of the type you want". Using a dangerous brute force C cast says "I don't care, just pretend that it is". You then move on to access members that don't exist, execute random code or overwrite memory that belongs to something completely different.
The reason dynamic_cast is often considered "bad" is not the cast itself, but that your requirement to explicitly downcast at all hints at a problem with your design. IF you continue to downcast like that, you should at least keep the dynamic_cast until you decide to abstract things to the point where all your components can use a common interface (hint: directly reading/writing members like you do is not a good start to achieve that).
Basically I see three options:
a) downcast to a specific component and use a unique interface for each type
b) completely pollute the base class with tons of empty virtual functions
c) abstract things to the point of components handling generic messages
If you are only starting out with C++, it might be better not to try and implement a component based system yourself, because finding a path between "doing very ugly things" and "it's a pain to use and causes more problems than it solves" requires a good bit of experience.