[{"data":1,"prerenderedAt":616},["ShallowReactive",2],{"content-dir-\u002Fprojects":3,"nav-config":593},[4,87,168,241,321,378,447,566],{"id":5,"title":6,"body":7,"description":13,"extension":68,"meta":69,"navigation":82,"path":83,"seo":84,"stem":85,"__hash__":86},"content\u002Fprojects\u002F001-portfolio-class-work.md","Class Work at Iowa State University",{"type":8,"value":9,"toc":59},"minimark",[10,14,19,22,26,38,42,45,49,52,56],[11,12,13],"p",{},"This is an overview of notable classes I have taken and a reflection of the class work I did while taking these classes at Iowa State University.",[15,16,18],"h2",{"id":17},"software-development-practices","Software Development Practices",[11,20,21],{},"In this class, we were tasked with forming a group of four and then creating an Android based application with a SQL database on the backend. This project was the first time I was introduced to concepts such as development sprints and agile development. I learned about Rest API and utilized Springboot, a Java based backend framework that can be used to pull data from an SQL database. The idea we had was a simple one. A map based Android app that would find you a barber or hair stylist by placing their location on a map. I was originally on frontend side of this project, but I quickly learned the ropes as a full stack developer on this project. In the end, our app was not entirely functional and was a mess that could be improved substantially in hindsight, but I learned a lot of the basics of software development, working virtually with teammates on a project, development sprints, and full stack development.",[15,23,25],{"id":24},"object-oriented-analysis-and-design","Object-Oriented Analysis and Design",[11,27,28,29,33,34,37],{},"This class further reinforced the idea of development sprints and core design elements and ideology when writing object oriented code. It also taught me a lot about planning out the design of your program so that you can build more modular and scalable projects. One of my key takeaways from this class, was the idea of the open close principle. Ideally, you want to write classes that are ",[30,31,32],"em",{},"open"," for extension, yet ",[30,35,36],{},"closed"," from modification. Therefore, you want the core classes in your program to be a solid foundation for the rest of the project.",[15,39,41],{"id":40},"introduction-to-database-management-systems","Introduction to Database Management Systems",[11,43,44],{},"This class taught me the basics of using SQL and how to properly set up a database structure and the relationships that should be made between the tables. I really enjoyed this class, and I learned a lot about how SQL databases should be configured and the proper terms for things like foreign keys, primary keys and schemas.",[15,46,48],{"id":47},"program-analysis","Program Analysis",[11,50,51],{},"This class focused on analyzing programs in order to debug and make more secure programs. This class taught me about the concepts of fuzzing and static analysis of code. All of the programming I did in this class was done in C. We ultimately wrote a program that used static analysis of code to determine if a program may have common memory errors such as use after free or double free bugs. This was challenging to me, as it introduced debugging and program testing strategy that I was not familiar with, and gave me ideas on how to test future software that I develop.",[15,53,55],{"id":54},"computer-science-senior-project","Computer Science Senior Project",[11,57,58],{},"This class is very similar to the Software Development Practices class, in that we formed a group of 5 students and we collaborated with a client, in this case a professor at Iowa State University to create an application to help solve a problem they were having. The professor wanted a website that could display standard operating procedures or SOPs for completing lab exercises. They also wanted the ability to use basic editing tools on the SOPs. Lastly, the SOPs were currently stored as Microsoft Word documents. This presented a challenge, as we needed to convert between the Microsoft Word document .docx file and a markdown file to enable easy editing of the file. This project presented a few challenges for me, I implemented the CI\u002FCD which was tricky since it needed to shutdown the previous instance of the backend so that the correct port would be open when it gets launched again. I learned quite a bit about managing processes on unix operating systems while working on that issue.",{"title":60,"searchDepth":61,"depth":61,"links":62},"",2,[63,64,65,66,67],{"id":17,"depth":61,"text":18},{"id":24,"depth":61,"text":25},{"id":40,"depth":61,"text":41},{"id":47,"depth":61,"text":48},{"id":54,"depth":61,"text":55},"md",{"identity":70,"slug":71,"image":72,"view":73,"tags":74,"excerpt":78},1,"classwork","feature-images\u002Fblogimagecs.webp","PostView",[75],{"name":76,"color":77},"Class Work","#9B1B23",{"type":8,"value":79},[80],[11,81,13],{},true,"\u002Fprojects\u002F001-portfolio-class-work",{"title":6,"description":13},"projects\u002F001-portfolio-class-work","ot2jbXwgh3e6ROrRyTXXcFhuxdb7oMXFXRk-LawLZ48",{"id":88,"title":89,"body":90,"description":94,"extension":68,"meta":153,"navigation":82,"path":164,"seo":165,"stem":166,"__hash__":167},"content\u002Fprojects\u002F002-portfolio-AI-Chess.md","C-Chess Minimax Algorithm",{"type":8,"value":91,"toc":146},[92,95,99,110,113,117,120,124,132,136,139,143],[11,93,94],{},"I wrote this C++ Chess Application and I am implementing better opponent AI.",[15,96,98],{"id":97},"overview","Overview",[11,100,101,102,109],{},"This is a side project to implement a simple AI to play against in my C++ Chess application. You can view the code for this project ",[103,104],"svg-under-line-link",{"always-visible":105,"link-to":106,"seed":107,"text":108},"true","https:\u002F\u002Fgithub.com\u002Fcarterbrimeyer\u002FC-Chess","51251","here",".",[11,111,112],{},"This project was originally written as a final project for a C\u002FC++ university class.",[15,114,116],{"id":115},"maintaining-code","Maintaining Code",[11,118,119],{},"When I had originally started this project it was for a final project for a C++ university class which introduced me to writing C and C++ code. As a result, some of the implementation of the features of this code was not ideal. Looking back, I see how I could improve and could use this opportunity to fix my original code and make it much more efficient and easier to maintain.",[15,121,123],{"id":122},"implementing-new-features","Implementing New Features",[11,125,126,127,131],{},"For this project, I wanted the user to be able to select if they want to play as 2 players, or one player against the AI. I also wanted them to pick which color they play as. Additionally, I wanted them to be able to select the difficulty level of the AI opponent. Adding these option selection before the game starts was easy, as well as the actually abstraction of the second player and being able to swap in the different opponent player options. One of the more difficult parts was converting the different possible move options for the AI so that it could simulate the different board states to pick the best one based on the scoring scheme. As opposed to my ",[103,128],{"always-visible":105,"link-to":129,"seed":107,"text":130},"https:\u002F\u002Fgithub.com\u002Fcarterbrimeyer\u002FMinimaxOthelloJS","othello implementation"," which had a much more simpler set of move options and scoring. However since I am using C++ for this chess simulation, its much faster and optimized, despite the more complex game and rules.",[15,133,135],{"id":134},"better-opponent-ai","Better Opponent AI",[11,137,138],{},"The way that MiniMax works is simple, the AI will generate potential game board states and score the board. The AI will recursively build this collection of game board states and the score of the board and decide which path it will travel down. You can think of it like putting a definitive number value on certain actions. For example taking the opposing player's king is the goal and would win the game so it would have a really high value. But if another move would put their own king in danger, it would be ranked extremely low and should be avoided at all cost. The algorithm would simply choose the move that has the highest score.",[15,140,142],{"id":141},"what-i-learned","What I learned",[11,144,145],{},"One thing this project taught me is to plan and optimize the structure of a project early on in development. Having to convert or translate a project later will just lead to a much longer and tougher development experience which slows down the production of the application.",{"title":60,"searchDepth":61,"depth":61,"links":147},[148,149,150,151,152],{"id":97,"depth":61,"text":98},{"id":115,"depth":61,"text":116},{"id":122,"depth":61,"text":123},{"id":134,"depth":61,"text":135},{"id":141,"depth":61,"text":142},{"identity":61,"slug":154,"image":155,"view":73,"tags":156,"excerpt":160},"minimax-chess","feature-images\u002Fblogimagechess.webp",[157],{"name":158,"color":159},"Personal Project","#21593c",{"type":8,"value":161},[162],[11,163,94],{},"\u002Fprojects\u002F002-portfolio-ai-chess",{"title":89,"description":94},"projects\u002F002-portfolio-AI-Chess","tBXzFB1INOq7Fn8zmtI4PDYcnyZt5Kvi-qGA73oONKw",{"id":169,"title":170,"body":171,"description":175,"extension":68,"meta":225,"navigation":82,"path":237,"seo":238,"stem":239,"__hash__":240},"content\u002Fprojects\u002F003-portfolio-AI-Othello.md","AI for Othello in Javascript",{"type":8,"value":172,"toc":217},[173,176,178,184,187,190,194,197,199,202,207],[11,174,175],{},"Learn more about my development of an othello AI opponent.",[15,177,98],{"id":97},[11,179,180,181,109],{},"I originally wrote this simple HTML and Javascript program for a project in my principles of artificial intelligence class at Iowa State University. The user interface is simple HTML and ES6 Javascript, but the artificial intelligence of the computer player is much more interesting. View this code on github ",[103,182],{"always-visible":105,"link-to":129,"seed":183,"text":108},"884124",[11,185,186],{},"For this project, I implemented a minimax algorithm with alpha beta pruning for the othello AI algorithm. Even with the pruning, the artificial intelligence algorithm can be inefficient while attempting to process a move on higher depths. This issue became exponential as the algorithm would initially map out the entire possible game and attempt to find the best move. I decided to implement a limit of how far the algorithm would map the game out, similar to how most casual players would consider their moves.",[11,188,189],{},"You can think of depths as how far the computer player is looking into the future. At a depth of four, where the below implementation is set, the artificial intelligence is looking up to four moves ahead.",[15,191,193],{"id":192},"design-considerations","Design Considerations",[11,195,196],{},"I decided to program this simple application in ES6 Javascript, CSS and HTML not for a performance or UI based reason. This project was one of my early experiments in using Javascript and familiarizing myself in how the language works. This ultimately led to my interest in learning the more type safe Typescript.",[15,198,142],{"id":141},[11,200,201],{},"I value what I learned from this project a lot. This was a great way for me start programming in Javascript and continue to develop my skills. If I were to solve this problem again, I would definitely try to use a completely different programming language in order to learn more about it.",[203,204,206],"h3",{"id":205},"try-it","Try it",[208,209],"iframe",{"id":210,"src":211,"width":212,"height":213,"style":214,"scrolling":215,"title":216},"othello-frame","\u002Fcontent\u002Fprojects\u002Fstatic\u002Fothello\u002Fothello.html","100%","800px","border: 2px solid #ccc; border-radius: 8px;","no","Othello Game",{"title":60,"searchDepth":61,"depth":61,"links":218},[219,220,221],{"id":97,"depth":61,"text":98},{"id":192,"depth":61,"text":193},{"id":141,"depth":61,"text":142,"children":222},[223],{"id":205,"depth":224,"text":206},3,{"identity":224,"slug":226,"image":227,"view":73,"tags":228,"excerpt":233},"minimax-othello","feature-images\u002Fblogimage3.webp",[229,230],{"name":76,"color":77},{"name":231,"color":232},"Try It","#434194",{"type":8,"value":234},[235],[11,236,175],{},"\u002Fprojects\u002F003-portfolio-ai-othello",{"title":170,"description":175},"projects\u002F003-portfolio-AI-Othello","H73YUt6jxmDL-Le6NsPaVm3YHCurs4Ybd39vFXb094A",{"id":242,"title":243,"body":244,"description":248,"extension":68,"meta":306,"navigation":82,"path":317,"seo":318,"stem":319,"__hash__":320},"content\u002Fprojects\u002F004-portfolio-Space-Scroller.md","Space Scroller using P5",{"type":8,"value":245,"toc":298},[246,249,255,259,262,266,269,273,276,280,283,286,288,291,294],[11,247,248],{},"Read about the development of my space scroller game I made with P5.js.",[11,250,251,252,109],{},"I developed a simple side-scrolling space shooter game built with p5.js and JavaScript. What started as a fun experiment with vector-based graphics has evolved into an interactive experience integrated directly into this page as a Vue component. View this code on github ",[103,253],{"always-visible":105,"link-to":254,"seed":183,"text":108},"https:\u002F\u002Fgithub.com\u002Fcarterbrimeyer\u002FSpaceScroller",[15,256,258],{"id":257},"from-idea-to-implementation","From Idea to Implementation",[11,260,261],{},"The idea was to create a basic side-scrolling game, leveraging the vector graphic capabilities of p5.js. The project started as just a way to use p5.js using simple JavaScript and HTML. I reached a point where I wanted to showcase my work in a dynamic and accessible way. This led to converting the original pure JavaScript code to align with Vue and ES6 standards. The conversion process presented its challenges, but the outcome was a functional game that retained the core mechanics of the original version.",[15,263,265],{"id":264},"tackling-vector-graphics-and-math-challenges","Tackling Vector Graphics and Math Challenges",[11,267,268],{},"Learning to work with vector graphics introduced a fascinating layer of complexity. It required a lot of math, experimentation, and perseverance. However, the effort paid off as I created a project that felt truly unique and that I could showcase in a different way.",[15,270,272],{"id":271},"addressing-collision-detection-efficiency","Addressing Collision Detection Efficiency",[11,274,275],{},"One of the more challenging aspects of development was implementing collision detection for the asteroids. Their irregular shapes made precise intersection calculations for lasers and ships resource-intensive. To strike a balance between accuracy and performance, I opted for a proximity-based collision system. If an object comes within a specific distance of an asteroid or ship, it registers as a hit. While this approach involves some compromises, it proved to be the most efficient solution for my use case.",[15,277,279],{"id":278},"lessons-learned","Lessons Learned",[11,281,282],{},"Reflecting on this project, I realized the importance of considering the broader scope of a project from the outset. Adapting the game for deployment on a website introduced scope creep, adding unanticipated complexity to the development process. In the future, I plan to keep compatibility and deployment in mind from the beginning to streamline the development workflow.",[11,284,285],{},"Reading about this project is one thing, but its a lot more fun to try it out.",[203,287,206],{"id":205},[11,289,290],{},"Try it below!",[292,293],"scroller-game",{},[295,296,297],"style",{},"\n#post-view {\n  margin-bottom: 800px;\n}\n\n#all-content {\n  background-color: black;\n}\n",{"title":60,"searchDepth":61,"depth":61,"links":299},[300,301,302,303],{"id":257,"depth":61,"text":258},{"id":264,"depth":61,"text":265},{"id":271,"depth":61,"text":272},{"id":278,"depth":61,"text":279,"children":304},[305],{"id":205,"depth":224,"text":206},{"identity":307,"slug":308,"image":309,"view":73,"tags":310,"excerpt":313},4,"spacescroller","feature-images\u002Fblogimage4.webp",[311,312],{"name":158,"color":159},{"name":231,"color":232},{"type":8,"value":314},[315],[11,316,248],{},"\u002Fprojects\u002F004-portfolio-space-scroller",{"title":243,"description":248},"projects\u002F004-portfolio-Space-Scroller","d_S2hVhlK8c8l-KGMBwfOpJNZj5M53tyPeTcY3mzDGw",{"id":322,"title":323,"body":324,"description":328,"extension":68,"meta":364,"navigation":82,"path":374,"seo":375,"stem":376,"__hash__":377},"content\u002Fprojects\u002F006-portfolio-matter-js.md","Matter.js C# translation",{"type":8,"value":325,"toc":359},[326,329,331,337,340,344,347,350,353,356],[11,327,328],{},"Find out more about my side project with converting Matter.js to C#.",[15,330,98],{"id":97},[11,332,333,334,109],{},"I wanted to familiarize myself more with Matter.js and C# so I decided to convert the Matter.js github repo from javascript to C#. View this code on github ",[103,335],{"always-visible":105,"link-to":336,"seed":183,"text":108},"https:\u002F\u002Fgithub.com\u002Fcarterbrimeyer\u002FMatterDotNet",[11,338,339],{},"I started by reviewing the many different javascript files and converting them to C# classes. This was difficult as the Matter.js at the type was not strongly typed. This led to some issues with some properties that were not easily converted to C#.",[15,341,343],{"id":342},"my-goals","My Goals",[11,345,346],{},"I wanted to work on a project that combined my practice with Javascript with C# as I was interested in refining my experience with C#. Additionally I wanted to learned more about simple graphics and I decided on using SDL2. SDL2 is a simple graphics library for drawing lines and simple shapes in a rendered window. The library was originally written in C++ but I was able to use a C# wrapper to use the library with C# and all of its benefits. By converting this from Matter.js I was ultimately able to simulate simple physics and generate complex polygons with collision. I was also able to have the same collision work for composites, which were a collection of physics bodies.",[15,348,349],{"id":141},"What I Learned",[11,351,352],{},"I had some success with converting this project from javascript to C# but ultimately I had to archive this project as I did not have the time to keep working on it. Ultimately I learned a lot about both Javascript and C# while working on this application.",[11,354,355],{},"Ultimately the scope of this project got more and more complex as it went on. Since Javascript is not strictly typed, It was difficult to accurately define properties and classes in C# that would work as expected. Often, there would be properties that stored many different types depending on the scenario and event that was being passed into a function.",[11,357,358],{},"Another part I found interesting about working on this was learning more about SVG and vector paths. I was able to recreate SVG files as polygons by recreating the path logic code of the SVG file to create a composite physics body. This introduced me to working with the SVG format and you can now see the results of this experimentation on this website in the dividers and link underlines.",{"title":60,"searchDepth":61,"depth":61,"links":360},[361,362,363],{"id":97,"depth":61,"text":98},{"id":342,"depth":61,"text":343},{"id":141,"depth":61,"text":349},{"identity":365,"slug":366,"image":367,"view":73,"tags":368,"excerpt":370},6,"matter-dotnet","feature-images\u002Fblogimage6.webp",[369],{"name":158,"color":159},{"type":8,"value":371},[372],[11,373,328],{},"\u002Fprojects\u002F006-portfolio-matter-js",{"title":323,"description":328},"projects\u002F006-portfolio-matter-js","L_0HWYPibV730aP3gFnwBmtNDSA0QONdRjPcH55eEO8",{"id":379,"title":380,"body":381,"description":385,"extension":68,"meta":433,"navigation":82,"path":443,"seo":444,"stem":445,"__hash__":446},"content\u002Fprojects\u002F007-portfolio-website.md","This Website",{"type":8,"value":382,"toc":426},[383,386,388,391,395,404,407,411,414,418,421,423],[11,384,385],{},"See more detail about the development and tech behind this portfolio site.",[15,387,98],{"id":97},[11,389,390],{},"I programmed this site with Nuxt, Nitro, Vue and Tailwindcss to create this expandable, modern and maintainable website. The first iteration of the site utilized Nuxt v2 and an older version of Vue, but I decided to update the frameworks and style to what you see now.",[15,392,394],{"id":393},"design-and-ideas","Design and Ideas",[11,396,397,398,403],{},"When I initially created this website, I wanted to impress the user with something unique. I initially implemented my ",[103,399],{"always-visible":105,"link-to":400,"seed":401,"text":402},"\u002Fprojects\u002F004-portfolio-space-scroller#try-it","21415632","Space Scroller"," game into the background of the home page. I found it to be a fun and unique way to draw users into my site. However it was quite distracting from the content, so I eventually decided to change it to the Helix Skill display at the bottom of the home page now.",[11,405,406],{},"I also wanted this website to reflect a little bit about myself. One way I found to be effective was the simple additions of the SVG underlines and dividers. These gives the website a little bit more style and heart that was missing when using regular underlines and squared up dividers.",[15,408,410],{"id":409},"a-short-note-about-colors","A Short Note About Colors",[11,412,413],{},"One thing that I am always working and improving on is my eye for color. When creating this website and selecting the colors, I found it challenging to decide on exactly the theming I should go for. I ultimately decided to go for a simple background color scheme with a light and dark mode. Having to pick colors for both modes gave me an opportunity to select more colors, and to automatically have the colors switch when the theme switches. This is something I am always working on and will definitely continue to experiment with.",[15,415,417],{"id":416},"updating","Updating",[11,419,420],{},"One challenge I faced was updating Nuxt v2 to Nuxt v4. I also decided to update Node and Vue at the same time to the latest releases. This was a challenge for me as there were many different changes in the way a lot of the frameworks and packages work. This would lead to fatal errors or even more subtle ones that weren't as obvious. I decided to start the app from scratch and reference the older code to understand where I could improve the structure, layout and design. Ultimately, I was able to convert everything from the older and outdated frameworks to the latest releases with all of the functionality I wanted.",[15,422,349],{"id":141},[11,424,425],{},"Updating an application from an older framework to the latest release can introduce unexpected challenges. Things like object structure, or the properties and their naming scheme can and will change dramatically between major version updates. Understanding these changes are important when doing this conversion.",{"title":60,"searchDepth":61,"depth":61,"links":427},[428,429,430,431,432],{"id":97,"depth":61,"text":98},{"id":393,"depth":61,"text":394},{"id":409,"depth":61,"text":410},{"id":416,"depth":61,"text":417},{"id":141,"depth":61,"text":349},{"identity":434,"slug":435,"image":436,"view":73,"tags":437,"excerpt":439},7,"this-website","feature-images\u002Fblogimage7.webp",[438],{"name":158,"color":159},{"type":8,"value":440},[441],[11,442,385],{},"\u002Fprojects\u002F007-portfolio-website",{"title":380,"description":385},"projects\u002F007-portfolio-website","83WRr1nh1XqOphYqrqoxjChui7ppI8eerSLW9YuajrQ",{"id":448,"title":449,"body":450,"description":454,"extension":68,"meta":551,"navigation":82,"path":562,"seo":563,"stem":564,"__hash__":565},"content\u002Fprojects\u002F008-portfolio-KaiOS-Space-Scroller.md","Space Scroller On KaiOS",{"type":8,"value":451,"toc":540},[452,455,464,466,469,473,476,480,483,487,490,494,497,501,504,508,511,513,516],[11,453,454],{},"Learn about my personal project to port my Space Scroller game to KaiOS.",[11,456,457,458,461,462,109],{},"View this code on github ",[103,459],{"always-visible":105,"link-to":460,"seed":183,"text":108},"https:\u002F\u002Fgithub.com\u002Fcarterbrimeyer\u002Fspacescroller\u002Ftree\u002FkaiOS",". Or try out the web version ",[103,463],{"always-visible":105,"link-to":400,"seed":401,"text":108},[15,465,98],{"id":97},[11,467,468],{},"A friend of mine had recently switched from a smartphone to a flip phone to cut back on screen time, which is how I first learned about KaiOS, the operating system that powers many modern flip phones. What caught my attention was that KaiOS apps are built with standard HTML and JavaScript, the same technologies my Space Scroller game was already written in, and I wanted to see if I could get it running on actual hardware with minimal effort.",[15,470,472],{"id":471},"getting-it-on-the-device","Getting It on the Device",[11,474,475],{},"The AT&T Cingular Flip IV runs KaiOS and is cheap and easy to source. To install apps outside of the official KaiOS Store I had to enable developer mode and root the device, then use Mozilla's WebIDE to sideload the app. The original game already used a bundled p5.js v1.4.0 minified file for its graphics, which worked without modification on the device's runtime. I also had to do some optimization to get the game running smoothly on the more limited hardware.",[15,477,479],{"id":478},"rotating-the-game-world","Rotating the Game World",[11,481,482],{},"The original game is a side-scrolling shooter designed for a landscape screen, but the flip phone's display is portrait. I rotated the entire game world 90 degrees so that enemies scroll downward from the top of the screen and the player's ship sits at the bottom. This took some effort to implement correctly, but it was worth it. The portrait orientation gives the player more distance between themselves and the oncoming obstacles, making the game noticeably more enjoyable on the smaller screen.",[15,484,486],{"id":485},"adapting-the-controls","Adapting the Controls",[11,488,489],{},"KaiOS devices don't have a mouse or touchscreen, so I had to remap all inputs to the D-pad, keypad buttons, and center D-pad button. One challenge was replicating the mouse-driven movement from the original game. I solved this by simulating a mouse point on the opposite side of the screen from the pressed direction. The longer a direction is held, the more the ship's speed accumulates and its rotation increases, closely matching how the original controls feel.",[15,491,493],{"id":492},"overheating","Overheating",[11,495,496],{},"To prevent players from simply holding down the fire button, I added an overheating mechanic. Firing continuously builds up heat, and once the weapon overheats it locks out until it cools down. This adds a layer of resource management to the combat and makes engagements more deliberate.",[15,498,500],{"id":499},"auto-pause-on-focus-loss","Auto-Pause on Focus Loss",[11,502,503],{},"The game automatically pauses whenever it loses focus. On a flip phone this is especially useful since closing the phone or switching away from the app suspends the game rather than leaving it running unattended. Resuming is as simple as returning to the app and pressing a button.",[15,505,507],{"id":506},"menu-screen","Menu Screen",[11,509,510],{},"I added a simple menu screen to give the game a proper entry point on the hardware. It displays the key bindings so players know how to control the ship, and prompts them to press a button to start. This was a small but important addition to make the experience feel complete.",[15,512,349],{"id":141},[11,514,515],{},"This project showed me that standard web technologies can reach platforms far beyond the browser. Even a relatively straightforward port introduced meaningful challenges: rotating a game world, adapting input from mouse to hardware buttons, adding new mechanics, and optimizing for more limited hardware, all of which expanded my understanding of cross-platform development.",[517,518,522,524,527,535],"div",{"className":519},[520,521],"hidden","md:block",[15,523,206],{"id":205},[11,525,526],{},"Since KaiOS apps are built in HTML and Javascript, I can easily implement it here so you can try it  out. Use the arrow keys to move the ship, 5 for shield, and space to fire:",[208,528],{"id":529,"src":530,"width":531,"height":532,"style":533,"scrolling":215,"title":534},"scroller-kaios-frame","\u002Fcontent\u002Fprojects\u002Fstatic\u002Fscroller-kaios\u002Fscroller-kaios.html",240,320,"border: 2px solid #ccc; border-radius: 8px; display: block; margin: 0 auto;","KaiOS Space Scroller",[11,536,537,538,109],{},"Compare it to the original game I started with ",[103,539],{"always-visible":105,"link-to":400,"seed":401,"text":108},{"title":60,"searchDepth":61,"depth":61,"links":541},[542,543,544,545,546,547,548,549,550],{"id":97,"depth":61,"text":98},{"id":471,"depth":61,"text":472},{"id":478,"depth":61,"text":479},{"id":485,"depth":61,"text":486},{"id":492,"depth":61,"text":493},{"id":499,"depth":61,"text":500},{"id":506,"depth":61,"text":507},{"id":141,"depth":61,"text":349},{"id":205,"depth":61,"text":206},{"identity":552,"slug":553,"image":554,"view":73,"tags":555,"excerpt":558},8,"kaios-spacescroller","feature-images\u002Fscrollergamekaios.webp",[556,557],{"name":158,"color":159},{"name":231,"color":232},{"type":8,"value":559},[560],[11,561,454],{},"\u002Fprojects\u002F008-portfolio-kaios-space-scroller",{"title":449,"description":454},"projects\u002F008-portfolio-KaiOS-Space-Scroller","S3js0N7IOZ3OZB6tXR0UVeL2WxL4LSqEhXjjVBdw1yE",{"id":567,"title":568,"body":569,"description":573,"extension":68,"meta":583,"navigation":82,"path":589,"seo":590,"stem":591,"__hash__":592},"content\u002Fprojects\u002Findex.md","Projects",{"type":8,"value":570,"toc":581},[571,574],[11,572,573],{},"Below are some posts where you can check out some of my personal projects and other things I have been working on more in depth.",[11,575,576,577,109],{},"Or check out my ",[103,578],{"always-visible":105,"link-to":579,"seed":183,"text":580},"https:\u002F\u002Fgithub.com\u002Fcarterbrimeyer","github",{"title":60,"searchDepth":61,"depth":61,"links":582},[],{"view":584,"childrenRouting":82,"tags":585},"PostFeedView",[586,587,588],{"name":76,"color":77},{"name":158,"color":159},{"name":231,"color":232},"\u002Fprojects",{"title":568,"description":573},"projects\u002Findex","nfCoibcl4wE7HTSy33l0IJWez2cQi6jVSZYDRtE5r_w",{"id":594,"title":595,"body":596,"description":596,"extension":597,"meta":598,"navigation":82,"path":612,"seo":613,"stem":614,"__hash__":615},"content\u002Fnavigation.yml","Navigation",null,"yml",{"navbar":599,"footer":605},{"signatureNavItem":600,"navItems":603},{"title":601,"href":602},"Home","\u002F",[604],{"title":568,"href":589},{"navItems":606,"imageNavItems":610},[607],{"title":608,"href":609},"Contact Me","\u002Fcontact",{"githubUrl":579,"linkedinUrl":611},"https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fcarterbrimeyer\u002F","\u002Fnavigation",{},"navigation","B6uyhDhz7a64WFj-KprkHg5qQIVtyIvj_Pij7Zq0r_o",1790721645479]