tag:blogger.com,1999:blog-43331671998180423432024-02-23T18:01:40.254-08:00Nick Barber Game DesignNick Barberhttp://www.blogger.com/profile/09854363891328959129noreply@blogger.comBlogger30125tag:blogger.com,1999:blog-4333167199818042343.post-49198375141434137112021-03-20T23:25:00.000-07:002021-03-20T23:25:08.689-07:00Binary Trees<p></p><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/pOxE9wI2FJM" width="320" youtube-src-id="pOxE9wI2FJM"></iframe></div><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/m2Vab8eScj0" width="320" youtube-src-id="m2Vab8eScj0"></iframe></div><br /><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: left;">Binary Trees was a small scale project focused on experimenting with L-systems and procedural generation.</div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;">Below is an example of how the L-system trees grow.</div><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRUa9GovQJeyqsy75Zqj4_axto8qf6PyWLFcFYkHQ93Lj69YSq9XHAWxGXYcYTr52gMJ4cX1HEnjiccMaMh6mEe3kTDaxbrD9P0LhgywzTQxZlr8vfB-1JKW931nZdgU362pMdeYZ02no/s722/2021-03-21-02-04-11.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="722" data-original-width="591" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRUa9GovQJeyqsy75Zqj4_axto8qf6PyWLFcFYkHQ93Lj69YSq9XHAWxGXYcYTr52gMJ4cX1HEnjiccMaMh6mEe3kTDaxbrD9P0LhgywzTQxZlr8vfB-1JKW931nZdgU362pMdeYZ02no/s320/2021-03-21-02-04-11.gif" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><span><div style="text-align: left;"><span> </span>The trees are drawn by writing pixel by pixel to a texture. This is a slower method, but because of the large pixel size its not a problem. This method also makes changing branches colors, or even deleting whole branches possible. </div><div style="text-align: left;"><br /></div></span><div class="separator" style="clear: both; text-align: left;"><span> </span>Each system contains no randomized elements. Because of their simple rule system the trees could be bred together and modified in multiple ways.</div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: center;"><div style="text-align: left;"><span> </span>My favorite part of this project is the ability to cut of certain branches and pick them up. This would ideally allow the players to cut off infected branches before they spread to the entire tree. It would also allow for "prettifying" the trees, or to cut branches to use their "genetic code" to breed new trees.<br /></div><div style="text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDub3HNtmVKHOSIm0QHeET7bHCUDWT38NF1i9-EqZAuhnNTHoT5qgE2PnWnIma1Xchr6E37PWiUdH6Y_aXwv0SrMmDfN74GHwxasjmXjnfBJ6gfJWb0bUL6eAJIMiY-B6NvUnVBgWknts/s720/2021-03-21-02-14-27.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="453" data-original-width="720" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDub3HNtmVKHOSIm0QHeET7bHCUDWT38NF1i9-EqZAuhnNTHoT5qgE2PnWnIma1Xchr6E37PWiUdH6Y_aXwv0SrMmDfN74GHwxasjmXjnfBJ6gfJWb0bUL6eAJIMiY-B6NvUnVBgWknts/s320/2021-03-21-02-14-27.gif" width="320" /></a></div><br /></div><br /> <p></p>Nick Barberhttp://www.blogger.com/profile/09854363891328959129noreply@blogger.com0tag:blogger.com,1999:blog-4333167199818042343.post-90453712309357791352021-01-15T20:15:00.008-08:002021-03-19T21:55:16.660-07:00Cooking Mama Cookstar<p> </p><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/qycn-u3j-wc" width="320" youtube-src-id="qycn-u3j-wc"></iframe></div><br /><p></p><p><span> Cooking Mama: Cookstar was my first professionally shipped game. I worked on the main development team at First Playable Productions. There I:</span><br /></p><p></p><ul style="text-align: left;"><li><span>Iterated on minigame design</span></li><li><span>Implemented new minigames</span></li><li><span>Iterated on motion control for switch and input backend</span></li><li><span>Reworked the audio system</span></li><li>Helped port to PS4</li></ul><p></p><p><span>Motion control was an uphill battle, we constantly iterated on versions and the clients had a lot of input as to what felt better. One of the problems we experienced was that motion would get tuned to individuals, so one person playing the game would do it perfectly while someone else would struggle. </span>The game now notices if you are having trouble and adjusts the thresholds, but it may have not been enough in the end. I would have liked more time to tune these values.</p><p>One of my first tasks was to rework much of how audio is loaded and played asynchronously. I added a system to preload the audio, and later down the line iterated on the CMS for audio.</p><p>The Ps4 port went over fairly smoothly. We have interchangeable input backends per platform, so once the Ps4 one was completed, much of the work was related to Ps4 specific mechanics like trophies.</p><p>I worked closely with the art and animation team to implement what they desired. Overall I would call this a great learning experience.</p><p><span><br /></span></p>Nick Barberhttp://www.blogger.com/profile/09854363891328959129noreply@blogger.com0tag:blogger.com,1999:blog-4333167199818042343.post-80202674879939806502021-01-15T20:15:00.007-08:002021-01-15T21:12:45.701-08:00Real Street Festival<p> </p><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/wpR-Fn_HMO4" width="320" youtube-src-id="wpR-Fn_HMO4"></iframe></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://www.frontgatetickets.com/festivals/real-street/">Website</a><br /></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: left;">Real street festival was a professional subcontract I had with IHeartRadio to develop a Android and IOS app for the Real Street festival, a two day festival with many big names like A$AP Rock and Cardi B.</div><div class="separator" style="clear: both; text-align: left;">I'm not really into the hip hop scene, but I appreciate the effort put into the festival. I was flown out and stayed mostly in the "command room" where people ran the festival. I was in charge of maintaining the app and sending push notifications.</div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">The App was made in one week at the request of the contractor. I spent most of this time getting the camera working with filters. I decided to use unity for this project due to the limited amount of time. The App had a GPS map, a camera with filters, a vendor list, and a schedule. Each were updated on the fly. I used firebase and Natcam plugins to run the camera and push notifications as well as some simple analytics.</div><br /><p></p>Nick Barberhttp://www.blogger.com/profile/09854363891328959129noreply@blogger.com0tag:blogger.com,1999:blog-4333167199818042343.post-60660091969931280142021-01-15T14:10:00.006-08:002021-03-19T21:47:51.686-07:00GhostRunner Study<div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/0NL3pSx68vg" width="320" youtube-src-id="0NL3pSx68vg"></iframe></div><div><br /></div><div style="text-align: center;">><a href="https://github.com/nbarber20/GhostRunnerStudy">Github</a><<br /></div><p>This is a short project i used to study the game "Ghostrunner". I wanted to recreate the movement system in unreal 4 using C++. The animations were made in blender, and could use a lot of work, but the point of this project was to show my ue4 C++ ability. </p><p>For the wall running, I just got the cross product between the hit normal and the players up to decide what direction the player should run. I also smoothly lean the player camera similarly to how the game does. </p><p>When jumping towards a ledge, if the angle is towards the wall, the character attempts a ledge grab. A line trace is fired above the players head, and if it hits nothing a ledge is detected for the player to climb up on. </p><p>For the grappling hook, I add force to the player based on a curve. I also added a particle effect so you could see what you attached to. While I was at it, I cropped out the grapple icon from the game and animated it as a widget.</p><p>For the projectiles, I made it so the aim is predictive. I used a method outlined <a href="https://www.gamasutra.com/blogs/KainShin/20090515/83954/Predictive_Aim_Mathematics_for_AI_Targeting.php">here</a>. I then simply made the bullet raycast over its delta to reliably get the bullet collision. If the player is attacking, it is reflected, otherwise it restarts the level.</p><p>Overall, this was a fun side project. I really liked the feeling of the wall running and grapple. If I had time, I would spend more time working on the combat.</p>Nick Barberhttp://www.blogger.com/profile/09854363891328959129noreply@blogger.com0tag:blogger.com,1999:blog-4333167199818042343.post-8494438517114974162021-01-15T12:36:00.010-08:002021-03-19T22:55:48.202-07:00Nes Study<p> </p><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/OlqxUit4HXk" width="320" youtube-src-id="OlqxUit4HXk"></iframe></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;">><a href="https://github.com/nbarber20/NESCoverShooter">Github</a><</div><p>This project represents a curiosity that I have had about NES games and how they function, as well as an excuse to gain a better understanding of low level programming in assembly. In the above video, i show the project, and break down the code.</p><p>I had a lot of fun learning about the NES's architecture and what memory addresses are mapped to what function. There is a lot of experimentation to be done, such as switching out color palettes at runtime or creating animation by changing sprites.</p><p>It should be noted that each sprite is 8x8px so the character is made up of several sprites. This was common practice.</p><p>I later went on to add vertical scrolling, but got tied up with work, so the project was left as is.</p>Nick Barberhttp://www.blogger.com/profile/09854363891328959129noreply@blogger.com0tag:blogger.com,1999:blog-4333167199818042343.post-7484882376703834522021-01-15T12:36:00.009-08:002021-03-19T22:48:27.144-07:00The Fields<p> This page is under construction...</p><p><br /></p><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/JmjXjYXlqfs" width="320" youtube-src-id="JmjXjYXlqfs"></iframe></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/Z2xgINinyUg" width="320" youtube-src-id="Z2xgINinyUg"></iframe></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;">><a href="https://github.com/nbarber20/FieldGame/tree/main/TheField/TheFieldsLib">GitHub</a><</div><div class="separator" style="clear: both; text-align: center;">The fields is a large scale text adventure project written in C++. I wanted to add a lot of simulation to this game. This ideally would mean that I could use a level editor to craft experiences that are more based on the mechanical interaction rather than a more static experience.</div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;">The project has two parts. Firstly, the game itself which loads in world data from binary files and saves as you move between tiles. And Secondly, the level editor that those world tiles are pre-setup in. </div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;">I would like to add some more interactions and entity types in the future. One thing I really enjoyed was the behavior system, as it allowed for decision making not just by NPCs but also by entities. For instance: there is a mechanism entity type reserved for items that can be "used." This can cover simple interactions like a water pump usage, all the way to a drone that autonomously scans the environment for anomalies.</div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><br /></div><br /><div class="separator" style="clear: both; text-align: center;"><br /></div><br /><p><br /></p>Nick Barberhttp://www.blogger.com/profile/09854363891328959129noreply@blogger.com0tag:blogger.com,1999:blog-4333167199818042343.post-69357865941662570362021-01-15T12:35:00.003-08:002021-03-19T21:56:49.147-07:00TownyFrowny<p><br /></p><p><br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvBjZBR8lGzQrFs0re-QcZr9VAkiacRsR7YQ7x5NBrQOSGfvb0bwF-H9rLpQQNa-VAzZZVu0Dg3NSJVmEZ0JBtRKDAJmmezMNtN4XIqnBqiZCfNbMl-xvZVq4AS65Y4yqAtv0pPrH-F2I/s612/Capture2.PNG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="598" data-original-width="612" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvBjZBR8lGzQrFs0re-QcZr9VAkiacRsR7YQ7x5NBrQOSGfvb0bwF-H9rLpQQNa-VAzZZVu0Dg3NSJVmEZ0JBtRKDAJmmezMNtN4XIqnBqiZCfNbMl-xvZVq4AS65Y4yqAtv0pPrH-F2I/s320/Capture2.PNG" width="320" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQbflOAHs_thuJvwuz9exEbhBCHy1AvfAJc1axN8NszolEJ3iK-xescrr71doq2tHWLwhX_yzSI98og7r10NzuYeERlTHZeA0q57FCnL2UGFH_N9ZjOPfEw2LenoSy3wnpBKwa-ToUCfk/s670/Capture.PNG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="388" data-original-width="670" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQbflOAHs_thuJvwuz9exEbhBCHy1AvfAJc1axN8NszolEJ3iK-xescrr71doq2tHWLwhX_yzSI98og7r10NzuYeERlTHZeA0q57FCnL2UGFH_N9ZjOPfEw2LenoSy3wnpBKwa-ToUCfk/s320/Capture.PNG" width="320" /></a></div><br /><p style="text-align: center;"><br /></p><p style="text-align: center;">><a href="https://github.com/nbarber20/Towny-Frowny">Github</a><<br /></p><p>Towny-Frowny was a small scale project used to study games like dwarf fortress. My main goal was to have a excessively large area simulated and displayed on the screen. I created a system for pathfinding, tasks, behaviors, player input and task assignment, and some basic AI.</p><p>The world is generated and displayed with 8x8 pixel sprites. The amount of sprite ranges based on the size of the world, but i wanted to try and display at least 1,000,000 simultaneously. This obviously was too many to render every frame, so i instead wrote the sprites to a render texture once, and rewrote individual sprites when that tile updated. This did however mean that I couldn't make objects go in-between tiles.</p><p>I learned a lot about C++ from this project, and now that I have some more knowledge i would like to go back and clean up the code some day.</p><p><br /></p>Nick Barberhttp://www.blogger.com/profile/09854363891328959129noreply@blogger.com0tag:blogger.com,1999:blog-4333167199818042343.post-47979748180062841832021-01-15T12:25:00.003-08:002021-01-15T15:08:16.740-08:00Undelivered<div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/O4f7_zyjLQ0" width="320" youtube-src-id="O4f7_zyjLQ0"></iframe></div><br /><p style="text-align: center;"><a href="https://nick-barber.itch.io/undelivered-vr">Itch.io</a></p><p>Undelivered was a week long unity vr project based on an idea i had in a dream. I really like the internet trend of "Liminal Space", so i tried to add that concept into the games world design.</p><p>I had alot of fun working on the level design and "directing" the players movements with scares.</p><p>Code-wise the game is very simple, mainly relying on collision triggers. I wanted to focus more on the experience with this project than showing off my ability with programming.</p><p>A majority of the levels were created entirely in unity using pro-builder.</p>Nick Barberhttp://www.blogger.com/profile/09854363891328959129noreply@blogger.com0tag:blogger.com,1999:blog-4333167199818042343.post-63194615706923002942019-06-06T11:04:00.001-07:002019-06-06T11:04:58.782-07:00WareFare<div class="separator" style="clear: both; text-align: center;">
<iframe width="320" height="266" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/bjgs6m-m1f8/0.jpg" src="https://www.youtube.com/embed/bjgs6m-m1f8?feature=player_embedded" frameborder="0" allowfullscreen></iframe></div>
<br />
WareFare (Warfare + Wares) is a small project i worked on with some friends for a c++ class.<br />
<br />
<br />
<div style="text-align: center;">
<a href="https://github.com/nbarber20/WarefareSrc">GitHub</a></div>
<br />
The focus of this project was to create a c++ system in unreal, which is designer friendly. In the system we created, you can design your own sword, forge, hammer, and sharpen it. Once you place the sword on display, it can be sold.<br />
<br />
We used the Blacksmith Forge and Over 9000 Swords packs from the unreal marketplace.<br />
<br />
The class split into two groups of three. The idea was that one group would make a blacksmith game, and the other group would make a sword combat game. The Sword combat game would then purchase the swords made by the blacksmith. Sadly though, the combat did not finish, but the systems are still in place within the blacksmith project. The swords info is saved to a .json file when you set the sword into the shop.<br />
<br />
<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_B37Icnr75sk0rkyZIvbyumngR4NUuYMqn5-hYD5zbTk9_4bfQRZdYplfA7C6Lz7Aq3ofRQI0ISs4AwL7mUNsZl60xJSC4spfXu-fWBBBqJ3fHF7d6a98on5gOvVJ_X_og9hM1Dmm-Vw/s1600/Capture4.PNG" imageanchor="1"><img border="0" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_B37Icnr75sk0rkyZIvbyumngR4NUuYMqn5-hYD5zbTk9_4bfQRZdYplfA7C6Lz7Aq3ofRQI0ISs4AwL7mUNsZl60xJSC4spfXu-fWBBBqJ3fHF7d6a98on5gOvVJ_X_og9hM1Dmm-Vw/s320/Capture4.PNG" width="320" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVpD_GCHr1t3AIGSfIG9q7kPk63_zbaiuKa8v-9ZnOqYyztE8IplK1Jl82gGral-ywSVCAKDClYfrJD44PaK15iI3pTjzwI8kAJ8TOvrY_ttbKhBa3G-rYiY6DfXoMKndnBnR7LdYaHeQ/s1600/Capture5.PNG" imageanchor="1"><img border="0" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVpD_GCHr1t3AIGSfIG9q7kPk63_zbaiuKa8v-9ZnOqYyztE8IplK1Jl82gGral-ywSVCAKDClYfrJD44PaK15iI3pTjzwI8kAJ8TOvrY_ttbKhBa3G-rYiY6DfXoMKndnBnR7LdYaHeQ/s320/Capture5.PNG" width="320" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinpNNvva-HgoZezZz_Qj-Q7pjGKVMRTlMl_NEZoMNRBN2OgZ1BlLlHWdzYSqDapp7Or0Gjpoj-OLukpPlTEzVLkMpo-ayn6HUyspSy1sYwH2Oh_IG_SZ96OBZvgcf1vTmYzCFhGreEycI/s1600/Capture6.PNG" imageanchor="1"><img border="0" height="179" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinpNNvva-HgoZezZz_Qj-Q7pjGKVMRTlMl_NEZoMNRBN2OgZ1BlLlHWdzYSqDapp7Or0Gjpoj-OLukpPlTEzVLkMpo-ayn6HUyspSy1sYwH2Oh_IG_SZ96OBZvgcf1vTmYzCFhGreEycI/s320/Capture6.PNG" width="320" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj448IZK2t3pOUx21ndzEp7l2jlM892t_gxgHjiFBo2rd3BdRHz3oOMY-hTRxcx_cqrnyU2LAjvTMo0cG2wkkeBEY8i_uqetKxiTa7nT6s8HPmJup4Lpp3Gg62_7pjZoCJHON4FX3GN1j8/s1600/Capture1.PNG" imageanchor="1"><img border="0" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj448IZK2t3pOUx21ndzEp7l2jlM892t_gxgHjiFBo2rd3BdRHz3oOMY-hTRxcx_cqrnyU2LAjvTMo0cG2wkkeBEY8i_uqetKxiTa7nT6s8HPmJup4Lpp3Gg62_7pjZoCJHON4FX3GN1j8/s320/Capture1.PNG" width="320" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHMsppLkfMmahcEKYgYCPGHXGn3qjlb-H3-ucXOEoNYIu6tmk8eadxrRsJJjqMo-C9XghNPOJ191gX6ooJ63QfgobLoBQows3cZGF79VA31XldjZs-aCYMHAL8x2zNsoOKA2KTJ9i62K8/s1600/Capture2.PNG" imageanchor="1"><img border="0" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHMsppLkfMmahcEKYgYCPGHXGn3qjlb-H3-ucXOEoNYIu6tmk8eadxrRsJJjqMo-C9XghNPOJ191gX6ooJ63QfgobLoBQows3cZGF79VA31XldjZs-aCYMHAL8x2zNsoOKA2KTJ9i62K8/s320/Capture2.PNG" width="320" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2QYGsXywGK3v_DqN94fpFKaB_ruMAMxkztrkM32mHbqyrolSR-FSF-M-tVNKVTkw3oC7B1JgdnRyu5VDcIVnvE_B1kovw6By3AGkkHiKNx6KwnKo-sVFFbRkcnr6BDDxcM3vzmJ8CP4g/s1600/Capture3.PNG" imageanchor="1"><img border="0" height="179" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2QYGsXywGK3v_DqN94fpFKaB_ruMAMxkztrkM32mHbqyrolSR-FSF-M-tVNKVTkw3oC7B1JgdnRyu5VDcIVnvE_B1kovw6By3AGkkHiKNx6KwnKo-sVFFbRkcnr6BDDxcM3vzmJ8CP4g/s320/Capture3.PNG" width="320" /></a>Nick Barberhttp://www.blogger.com/profile/09854363891328959129noreply@blogger.com0tag:blogger.com,1999:blog-4333167199818042343.post-40093463360093716992019-03-25T17:51:00.002-07:002021-05-21T09:35:39.188-07:00The Witness Puzzle Mechanic Study<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/kMTedEgDSJU/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/kMTedEgDSJU?feature=player_embedded" width="320"></iframe></div>
<div class="separator" style="clear: both; text-align: center;">
The Witness's puzzle mechanic recreated in unity.</div>
<br />
<a name='more'></a><div style="text-align: center;"><br /></div>
<h2 style="text-align: center;">
Breakdown</h2>
<div>
I was playing the witness and couldn't help myself but to recreate the puzzles in unity.</div>
<div>
<br /></div>
<div>
I first started by creating a world space canvas with a cursor on it. I simply tied the movement of the cursor to the mouse x and y. I did not translate from screen space to world space as this would create undesired effects.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhX7TqBO7nN05NvO6gZmIb4f1dSS7NVNmiFUB_SjBtdAaCexRMQ-_dypDgK35Zc6-4FspRlJn6G2BKjKpp8KV945bU8FQDwa4fbGWKPkfIjT55kzmSRX4CYit3PXTQAVHQs3p1NTFCapSM/s1600/Capturegfdsgfds.PNG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="501" data-original-width="503" height="317" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhX7TqBO7nN05NvO6gZmIb4f1dSS7NVNmiFUB_SjBtdAaCexRMQ-_dypDgK35Zc6-4FspRlJn6G2BKjKpp8KV945bU8FQDwa4fbGWKPkfIjT55kzmSRX4CYit3PXTQAVHQs3p1NTFCapSM/s320/Capturegfdsgfds.PNG" width="320" /></a></div>
<div>
<br /></div>
<div>
After i had the cursor moving around, i created button on the ui canvas that activated initialized the puzzle. This is the white circle on the puzzle, and works just like the game. Once the puzzle is clicked on, i turn off the player movement, and add a border to the screen. The player can then reset the puzzle by clicking the button again.</div>
<div>
<br /></div>
<div>
I then needed to constrict the cursor to "Lines" of the puzzle. I did this by creating an array of rectTransforms and getting their world Corners. I then turn that into a rect and grab the world corners of the cursor collider (where we are trying to move the cursor). Its then as simple as checking if the rects overlap. Note that i do this twice because i check the delta x and then the delta y of the cursor.</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEOosLOjz9aBpnuG1K6jCwudh6qifd1klWPBV5vNGcZ23vnEbUrKA5ezN17QBYASDotwbE9Rzw20DRwyXuDOGU1UmgJlPIRzzjJZIty9H6BNmAOOybPcSOMkaW8xlhEAE6szszvDmd5TE/s1600/LineDemo.gif" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="311" data-original-width="600" height="329" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEOosLOjz9aBpnuG1K6jCwudh6qifd1klWPBV5vNGcZ23vnEbUrKA5ezN17QBYASDotwbE9Rzw20DRwyXuDOGU1UmgJlPIRzzjJZIty9H6BNmAOOybPcSOMkaW8xlhEAE6szszvDmd5TE/s640/LineDemo.gif" width="640" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
Now that i have a cursor on rails, i need to connect using a line. That line is created of spawned image prefabs. You can see the line parts being spawned in and destroyed in the gif above.</div>
<div>
<br /></div>
<div>
The last part was the most difficult. I needed to create the "Puzzle Elements". If you have played the game, you'll know that each symbol represents a requirement for the puzzle. Take the black hexagons, you need to move your line over every black hexagon without missing any.</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikWArKlNnyWQ6uDx5c7QXBi5ZmjrWz9Dhhyphenhyphen0ppwTxGn1NFxdnZvbEJL9Nt6js53YFz1B2sZaJvShndy4k5e5GfCIO_NJaEsMC8XvgYwvohiuHl02dhaAO5sdZThdgooQJK6J6XUZPWkls/s1600/fddasfdsafdsa.PNG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="480" data-original-width="483" height="318" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikWArKlNnyWQ6uDx5c7QXBi5ZmjrWz9Dhhyphenhyphen0ppwTxGn1NFxdnZvbEJL9Nt6js53YFz1B2sZaJvShndy4k5e5GfCIO_NJaEsMC8XvgYwvohiuHl02dhaAO5sdZThdgooQJK6J6XUZPWkls/s320/fddasfdsafdsa.PNG" width="320" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
This can be done with an two dimensional array. Each puzzle element has a vector 2 variable which represents its position in the array. When we create the array, false will represent an empty spot, and true will represent somewhere where the line is. When the puzzle is complete, we simply need to give the array to each puzzle element and (in this case) we need to check and see if that elements spot is marked as true (the line overlaps)</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0gY0zrbDuEnVVLb2NVJdP902w3yWtGxUgeKMlZ9txwLQ9ASMKFla2yZMNv-7_LoGGAWziaZNXjKyDt8NPgzGg0a5DV5X8-iWWRkOaNZUl__8ZNzlQEJtFAi02ZwYvlinYaUz3Xh38Kj4/s1600/CornerFinders.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="523" data-original-width="523" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0gY0zrbDuEnVVLb2NVJdP902w3yWtGxUgeKMlZ9txwLQ9ASMKFla2yZMNv-7_LoGGAWziaZNXjKyDt8NPgzGg0a5DV5X8-iWWRkOaNZUl__8ZNzlQEJtFAi02ZwYvlinYaUz3Xh38Kj4/s320/CornerFinders.png" width="320" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
The only issue is creating that array. I did this by marking each corner with a vector 2. This represents where in the array that corner should represent. The main problem with doing it this way is that you can have unforeseen issues if corners are marked improperly. Each corner is marked in the above picture.</div>
<div>
<br /></div>
<div>
The only other interesting part is the other puzzle elements. For the black and white squares, i use a fill algorithm to check every reachable spot for an opposingly colored square. If another square of opposing color is found, the element fails.</div>
<div>
<br /></div>
<div>
I do the same thing with the suns, but just count the number of found suns and ensure it is only one other sun.</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
Nick Barberhttp://www.blogger.com/profile/09854363891328959129noreply@blogger.com2tag:blogger.com,1999:blog-4333167199818042343.post-20388634751211025732019-02-07T19:14:00.002-08:002019-03-25T18:54:56.036-07:00Shutter<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEGFD29Cx9pPj2WBRe2KbJHvbDX4orFV77BrqnGth1gR-2rX-n-KLz9OTpAHXvq3T7onDqmIWRIl7O0QIPIeOUnJOsLTWJIm1ez2ZLAd-seLoko1KYUMwaonrffkzzI3zk_4_n22aGla8/s1600/Shutter1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="359" data-original-width="359" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEGFD29Cx9pPj2WBRe2KbJHvbDX4orFV77BrqnGth1gR-2rX-n-KLz9OTpAHXvq3T7onDqmIWRIl7O0QIPIeOUnJOsLTWJIm1ez2ZLAd-seLoko1KYUMwaonrffkzzI3zk_4_n22aGla8/s320/Shutter1.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://nick-barber.itch.io/">Play</a></div>
<div style="text-align: center;">
<a href="https://github.com/nbarber20/Shutter">GitHub</a></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<div style="text-align: left;">
Shutter is a game created in SFML, a lightweight opengl library.</div>
</div>
<div style="text-align: center;">
<div style="text-align: left;">
I created the game in a total of 5 weeks in my free time during my winter quarter at scad.</div>
</div>
<div style="text-align: center;">
<div style="text-align: left;">
I wanted to show my knowledge of c++ by creating a raycaster game.</div>
</div>
<div style="text-align: center;">
<div style="text-align: left;">
<br /></div>
</div>
<div style="text-align: center;">
<div style="text-align: left;">
I based my initial prototype off of the OneLoneCoders First Person Shooter. The sprite rendering and floor rendering were informed by this as well.</div>
</div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
However, I notices several issues with the OneLoneCoder's code. </div>
<div class="separator" style="clear: both; text-align: left;">
Firstly, there was an error which caused a fish eye lensing effect. This was solved by scaling the ray distance based of the ray angle.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Secondly, there was no depth buffer. This was needed to add billboard sprites to the game. I looked at the way Wolfenstein Created their billboarded sprites and implemented the sprites in a similar manor.</div>
<div class="separator" style="clear: both; text-align: left;">
Each Sprite is separated into vertical slices, hare occluded by the depth buffer. The Depth buffer only need be one dimensional because there is no way for a sprite to be overlapped horizontally, it will only ever be overlapped from the left or right side.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtKvo8nF_ucB6mpgNAMeqhKw83-AtwaaZ-5VANVSKTG-3b0h1wSewceiNa8mb7KB5JOsDGM1_oCkJx8BBXTQFr9p1EklHZsc9aQcf5qGTSbp2Kb3mgL05xOyHor5xYjTfXpf6TtzY7uY4/s1600/Shutter3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="359" data-original-width="359" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtKvo8nF_ucB6mpgNAMeqhKw83-AtwaaZ-5VANVSKTG-3b0h1wSewceiNa8mb7KB5JOsDGM1_oCkJx8BBXTQFr9p1EklHZsc9aQcf5qGTSbp2Kb3mgL05xOyHor5xYjTfXpf6TtzY7uY4/s320/Shutter3.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
After i had a simple raycaster i needed to create a game to go along with it. I came up with the idea of taking pictures and looked at how i would create that effect. When a picture is taken, the world will render out based of of a "secret" array. With hidden information like keys and doors that will only be visible in photographs.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Sadly sfml's functions for taking screenshots have been depreciated, so i had to go with a slower texture.update().</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
After i had the camera effect created i had an idea to have a ghost that only move when you take a photo. This turned the game into much more of a horror game as the player is trying to balance gaining infromation from photos of the room and keeping track of the ghost, and of course keeping track of the ghost in it of itself is a uphill battle as it moves closer each time you find out where it actually is.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
The full source code is available <a href="https://github.com/nbarber20/Shutter">Here</a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
Nick Barberhttp://www.blogger.com/profile/09854363891328959129noreply@blogger.com0tag:blogger.com,1999:blog-4333167199818042343.post-31970955801606849862019-01-05T22:01:00.002-08:002021-01-15T14:31:43.579-08:00OceanPort Mystery<div style="text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidW7KnSLB28nNATHNqNLmZ6bt9e_w-95G8tdc_VWGGi3jm70u1rJcPkf6YUY5b8JWgqmOn1JilNYDHzxLL7dhNGvzhwmd5XgHZBfHolukLvi0-zCaqSUHFt96xm7ODNVYPW5iQRMRjpxc/s1600/testy-screenshot+%25283%2529.png" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidW7KnSLB28nNATHNqNLmZ6bt9e_w-95G8tdc_VWGGi3jm70u1rJcPkf6YUY5b8JWgqmOn1JilNYDHzxLL7dhNGvzhwmd5XgHZBfHolukLvi0-zCaqSUHFt96xm7ODNVYPW5iQRMRjpxc/s200/testy-screenshot+%25283%2529.png" width="200" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgavQjgXH-tFfsHCbaf-tivmg3a_qqPToNbsLHSPDaikcnYVBqdowMLXeoX9cAC5yq6OF6RR48ymIrwKML8bdahKY_eqUBPt_gWpOqTEruy-hx1lFAcMLO8-AQMQ4cpYjVUpurHe0BPUfA/s1600/testy-screenshot+%25281%2529.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgavQjgXH-tFfsHCbaf-tivmg3a_qqPToNbsLHSPDaikcnYVBqdowMLXeoX9cAC5yq6OF6RR48ymIrwKML8bdahKY_eqUBPt_gWpOqTEruy-hx1lFAcMLO8-AQMQ4cpYjVUpurHe0BPUfA/s200/testy-screenshot+%25281%2529.png" width="200" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkLjSsHnC_Liy_eJcC6iFXFa-AACrrgudIFkxZAfqR7UHiWbTNr6tGy9bnmmhTDBth6wESWv-SHgQdvYQXozsnADEB5yg0FLQxc0-50G-p8UMzKyBewpn2ZQyvufrKTAUMvaS1JrqDD6Q/s1600/testy-screenshot+%25282%2529.png"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkLjSsHnC_Liy_eJcC6iFXFa-AACrrgudIFkxZAfqR7UHiWbTNr6tGy9bnmmhTDBth6wESWv-SHgQdvYQXozsnADEB5yg0FLQxc0-50G-p8UMzKyBewpn2ZQyvufrKTAUMvaS1JrqDD6Q/s200/testy-screenshot+%25282%2529.png" width="200" /></a><br />
<br />
<br />
<div style="-webkit-text-stroke-width: 0px; color: black; font-family: "Times New Roman"; font-size: medium; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: center; text-decoration-color: initial; text-decoration-style: initial; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
<div style="margin: 0px;">
</div>
</div>
<br />
<div style="-webkit-text-stroke-width: 0px; color: black; font-family: "Times New Roman"; font-size: medium; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; margin: 0px; orphans: 2; text-align: start; text-decoration-color: initial; text-decoration-style: initial; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
<div style="text-align: left;">
The oceanport mystery is a quick experiment i created when playing with my new fitbit versa. I used the convenient fitbit studio and some JavaScript to put it together in an afternoon and i liked it so much i just had to show it off.</div>
</div>
<div style="-webkit-text-stroke-width: 0px; color: black; font-family: "Times New Roman"; font-size: medium; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; margin: 0px; orphans: 2; text-align: start; text-decoration-color: initial; text-decoration-style: initial; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
<div style="text-align: left;">
<br /></div>
</div>
<div style="-webkit-text-stroke-width: 0px; color: black; font-family: "Times New Roman"; font-size: medium; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; margin: 0px; orphans: 2; text-align: start; text-decoration-color: initial; text-decoration-style: initial; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
<div style="text-align: left;">
Play it online: <a href="http://www.nickbarbergamedev.com/files/oceanport_web/OceanPort.html">here</a></div>
<div style="text-align: left;">
<br />
<a name='more'></a><br /></div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Here is the code:</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<br /></div>
</div>
</div>
<iframe src="https://pastebin.com/embed_iframe/iwML8Cf9" style="border: none; height: 500px; width: 100%;"></iframe>Nick Barberhttp://www.blogger.com/profile/09854363891328959129noreply@blogger.com0tag:blogger.com,1999:blog-4333167199818042343.post-9773101692949434472018-12-20T21:39:00.003-08:002018-12-21T22:39:09.678-08:00Tunics: A Replicated Complex Inventory System in Unreal Engine<div style="text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/8-WAv9iKF_I/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/8-WAv9iKF_I?feature=player_embedded" width="320"></iframe></div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<br />
<div style="text-align: center;">
<br />
<a name='more'></a><br />
<br />
<br /></div>
<div style="text-align: center;">
<br /></div>
</div>
<div style="text-align: left;">
This is a project i created during my 2018 winter break. The project is created in unreal engine using C++. I worked closely with my friend, Nicholas Chmil. You can find his breakdown <a href="https://ngciv.com/">here</a><span id="goog_376430812"></span><a href="https://www.blogger.com/"></a><span id="goog_376430813"></span>. I was responsible for creating the inventory, while Nicholas(not me) handled the animation blueprints and adding in content from the unreal store. Everything is properly replicated, so multiple players can share items and manage weaponry together.</div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbbpT-z7b0hcyEaZPq9JwgLWFC-if4DevQP-kepHu7Jpx84qH2KtpbGVIO_TmnzsQ47cvECHp3UtYJC3lV4-7o67UAn-cyQK1rsAx8yX9_kMv2A-G3FAwcbPRRQ42dkhBqXR4Hc402Wtg/s1600/ezgif.com-video-to-gif.gif" imageanchor="1"><img border="0" height="205" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbbpT-z7b0hcyEaZPq9JwgLWFC-if4DevQP-kepHu7Jpx84qH2KtpbGVIO_TmnzsQ47cvECHp3UtYJC3lV4-7o67UAn-cyQK1rsAx8yX9_kMv2A-G3FAwcbPRRQ42dkhBqXR4Hc402Wtg/s400/ezgif.com-video-to-gif.gif" width="400" /></a></div>
<div style="text-align: center;">
<br />
<div style="text-align: left;">
Each item has a constant presence in the world, and can be dropped or thrown at will. Ammunition can be stacked and unstacked with the right and left mouse buttons. </div>
<div style="text-align: left;">
<br /></div>
<h3 style="text-align: left;">
The Breakdown:</h3>
<div style="text-align: left;">
As Stated before, each item has a constant presence in the world. Items in the inventory are rarely spawned or destroyed (only when separating stacks and applying attachments). I did this to keep the actual inventory simple. It is just an array of structs,which include: a pointer to the item in the world, a boolean to determine weather or not this slot is full, and an integer to reference the array index of this slots parent.<br />
<br />
The parent slot is used for items that are larger than one slot, for instance if i were to drag the shotgun into slot 0, slots 0 through 4 would have slot 0 as their parent. This works on both the x and y axis. As you can see in the GIF above, the ar4 takes up a 4x4 slot.<br />
<br />
The item actors (which firearm actors inherit) holds all the information for the item. Ranging from the animations for the item to the size it takes up in inventory. The most interesting variable held by the item actor is its stack size. This makes it so you can drop an entire stack of items as one item. When items are unstacked, a new actor is spawned into the world. Below is the inventory category for items.</div>
<div style="text-align: left;">
<div style="text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBWVvEftaqaztFLALTMwLdtirERBlCH9VLDNdU1rPqBkprIurvOckD1Pg6kDhQzAnWJWajU3IWdkYDEXAElCkCDEOWoNd4Cl1rNWfuHKH7I_SFq4yyA4_alU7nxU0ZMvPmDShCQviEDCE/s1600/Capturewrfqa.PNG" imageanchor="1"><img border="0" height="191" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBWVvEftaqaztFLALTMwLdtirERBlCH9VLDNdU1rPqBkprIurvOckD1Pg6kDhQzAnWJWajU3IWdkYDEXAElCkCDEOWoNd4Cl1rNWfuHKH7I_SFq4yyA4_alU7nxU0ZMvPmDShCQviEDCE/s320/Capturewrfqa.PNG" width="320" /></a></div>
<div style="text-align: left;">
The full item header can be found <a href="https://pastebin.com/xNJMtdXW">Here</a></div>
<div style="text-align: left;">
and the firearm class can be found <a href="https://pastebin.com/a2XQRR4E">Here</a><br />
<br />
The complex inventory component holds the major functions called by the player and ui.<br />
The most interesting feature is the ignoreslot argument additemtoslot function. This makes it so the player can add an item to a slot even if it overlaps its previous slot (you can see this happening with the ar4 in the GIF above). I do this because the item is not removed from a slot before it is added to a new slot. If you would like more info on how the complex inventory works, you can check out the breakdown i did on a complex inventory in unity <a href="https://cf66a8bebeabf5e09c94be8e7d686778.blogspot.com/2017/11/inventory.html">Here</a></div>
<div style="text-align: left;">
<br />
This is the blueprint responsible for when a drop is detected on an inventory slot. First i cast to my custom drag and drop object, which holds information about the item like the slot it came from and its aitem pointer. i then branch off if it is splitting a stack because i need to preform special operations when splitting like creating a new actor in the world. After that it is as simple as removing the item from the slot, checking to see if it fits into the new slot, and if it doesn't we just re add it to the old slot.<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSReoY0aZaexFG4d1TkPrZv9ibCGtTvI57dv0KadZtCQ4vaAhekHIT0en8SlgIN5P16imdei4bK5h-wMEhy0MCSTiuS_gBXEB5_yNVg-yS-wdn35Ppw-6r4MLieL-2Y99Bmy8EWbmeWf4/s1600/OnDropCapture.PNG" imageanchor="1"><img border="0" height="185" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSReoY0aZaexFG4d1TkPrZv9ibCGtTvI57dv0KadZtCQ4vaAhekHIT0en8SlgIN5P16imdei4bK5h-wMEhy0MCSTiuS_gBXEB5_yNVg-yS-wdn35Ppw-6r4MLieL-2Y99Bmy8EWbmeWf4/s640/OnDropCapture.PNG" width="640" /></a><br />
<a href="https://drive.google.com/file/d/1QhhKTCAwt0BLVa3UHtkSbACA9ssTSMpw/view">Full Image</a></div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: center;">
<br /></div>
</div>
<div style="text-align: left;">
Below is the full code for the character and the inventory component.<br />
<br />
<br /></div>
<div style="text-align: left;">
<br /></div>
</div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<div style="text-align: left;">
ComplexInventory.cpp</div>
<iframe src="https://pastebin.com/embed_iframe/gbAHLQeE" style="border-style: none; height: 1000px; width: 100%;"></iframe>
<br />
<div style="text-align: left;">
Tunics Character.cpp</div>
</div>
<div style="text-align: left;">
<br /></div>
<iframe src="https://pastebin.com/embed_iframe/XB8MTa2u" style="border: none; height: 1000px; width: 100%;"></iframe><br />
<br />
Nick Barberhttp://www.blogger.com/profile/09854363891328959129noreply@blogger.com1tag:blogger.com,1999:blog-4333167199818042343.post-69004873222883526902018-10-28T21:50:00.000-07:002018-12-21T22:26:39.292-08:00Java 3d game engine<div style="margin-bottom: 1em; margin-right: 1em;">
<div style="text-align: center;">
<div style="text-align: left;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2s_WJrjkHXdpzv8grtWRKDpaHG5r3cn-at6A_7t1Q7vfT3q-kdUB1MK3AHYtttuUQeuWIGqIQkmcAj2MJRvulRddaro9RAIJMLo_QME7OzT4N3LDGb7MY1cDFJPaBSL2Z6yIU_aL9hUc/s1600/30415087_1730482910374142_1732148443482161152_n.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="903" data-original-width="938" height="307" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2s_WJrjkHXdpzv8grtWRKDpaHG5r3cn-at6A_7t1Q7vfT3q-kdUB1MK3AHYtttuUQeuWIGqIQkmcAj2MJRvulRddaro9RAIJMLo_QME7OzT4N3LDGb7MY1cDFJPaBSL2Z6yIU_aL9hUc/s320/30415087_1730482910374142_1732148443482161152_n.jpg" width="320" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyUvgGgsp_nsBmrQsDhYL7agf-saWbdSRFF8-iKcc83m5Az_9li6rMhxDU4Yg7yayxeUbEBMi3C3dTxVxGr_AGJmgSEbm23ROOJtBEBQNzvam7AetYXblNVgiHl22tiqQE1oMv0v8PiDs/s1600/30411907_1730479043707862_3710941774848458752_o.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="551" data-original-width="961" height="183" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyUvgGgsp_nsBmrQsDhYL7agf-saWbdSRFF8-iKcc83m5Az_9li6rMhxDU4Yg7yayxeUbEBMi3C3dTxVxGr_AGJmgSEbm23ROOJtBEBQNzvam7AetYXblNVgiHl22tiqQE1oMv0v8PiDs/s320/30411907_1730479043707862_3710941774848458752_o.jpg" width="320" /></a></div>
<br />
<br />
<br />
Ah java, how i love thy simplicity.</div>
<div style="text-align: left;">
So i made this 3d applet a while back and figured i should probably post it somewhere. Before i got the change however, my hard drive corrupted.</div>
</div>
</div>
<br />
YIKES.<br />
<br />
All that work? gone.<br />
<br />
I am working right now on rewriting what i can to show off that i did indeed make it, but youll have to spare me for my lack of snippets in the mean time.<br />
<br />
<a name='more'></a><br /><br />
<br />
<br />
<br />
Im loading in the map via a image(my favorite way of doing things).<br />
<br />
The 3d maths were adapted from notches ludem dare game which he streamed and i followed along with, but in the end of the day the math isn't <i>that</i> complex. i added in multiple block heights and am rendering tops and bottoms of blocks.<br />
<br />
Here is the 3d rendering class that i managed to salvage:https://pastebin.com/ew0CT2eg<br />
Sadly still way out of date but ah well. maybe ill come back to it someday.<br />
<br />
<br />
<iframe src="https://pastebin.com/embed_iframe/ew0CT2eg" style="border: none; height: 2000px; width: 100%;"></iframe>Nick Barberhttp://www.blogger.com/profile/09854363891328959129noreply@blogger.com0tag:blogger.com,1999:blog-4333167199818042343.post-4766343270528688652018-10-27T20:53:00.004-07:002018-10-27T20:53:55.230-07:00OpenGL<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
I've been studying opengl in hopes of making a small game engine in c++.<br />
I am following along with thebennybox's opengl game engine tutorials.<br />
So far this has been a great learning experience and i am being introduced to some very advanced c++ concepts.<br />
<br />
<br />
Here are some progress photos:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguULpjUtwYZXMX79yu5_hcpwK9I0mkEzhyphenhyphenHEA8BFbb20E4EV1ICB5BE1cTPM6FVKWFjJK38D4XTqg1kdLIE0nSEBWdA8DOUmGdjTBFLM1N4eNt5N9jcl8UsircN6NOKZkndutexz7oEXk/s1600/Capture4.PNG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguULpjUtwYZXMX79yu5_hcpwK9I0mkEzhyphenhyphenHEA8BFbb20E4EV1ICB5BE1cTPM6FVKWFjJK38D4XTqg1kdLIE0nSEBWdA8DOUmGdjTBFLM1N4eNt5N9jcl8UsircN6NOKZkndutexz7oEXk/s320/Capture4.PNG" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcNWq80J-1N3ADBFGCYu-Vyd_hH9T_c-e_qLrix86-d7W_InCFEMySCw4zr2odV9flLjnD4hZMThP-FI0oGl8BVTRPE4Bo-7zLcL2-ym6wXAV-SdGJVA-wb2JGq8Sc3um3qoaYs8Ptr3g/s1600/Capture5.PNG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="218" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcNWq80J-1N3ADBFGCYu-Vyd_hH9T_c-e_qLrix86-d7W_InCFEMySCw4zr2odV9flLjnD4hZMThP-FI0oGl8BVTRPE4Bo-7zLcL2-ym6wXAV-SdGJVA-wb2JGq8Sc3um3qoaYs8Ptr3g/s320/Capture5.PNG" width="320" /></a></div>
<br />Nick Barberhttp://www.blogger.com/profile/09854363891328959129noreply@blogger.com0tag:blogger.com,1999:blog-4333167199818042343.post-88708988186906876832018-10-20T17:20:00.003-07:002018-12-20T21:51:11.669-08:00AshFall<div style="text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQbG-nXEEKwjvZWnkQMpAjOXgifzSJwDCoG7BbwLDT2FgvSq-8b-n6se_vHwcsAAndGkbKHpU4auYbG2qJngvWEuqL2nUtA_iieLlWsGAxVbJ5r8RT7n6ngm-Q_zBoNJBSGD-jw7LQoE0/s1600/P5OfRH.png" imageanchor="1"><img border="0" height="225" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQbG-nXEEKwjvZWnkQMpAjOXgifzSJwDCoG7BbwLDT2FgvSq-8b-n6se_vHwcsAAndGkbKHpU4auYbG2qJngvWEuqL2nUtA_iieLlWsGAxVbJ5r8RT7n6ngm-Q_zBoNJBSGD-jw7LQoE0/s400/P5OfRH.png" width="400" /></a></div>
<br />
<a href="https://nick-barber.itch.io/ashfallch1">Store Page</a><br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiujkRs_TY7zetuP-iQgwmMiyF3cPWil9OWjKE5Hmrzu6FPIP2-XajQxWKUX6zVNjhA5NJr9W06UhshZEu02xzORcloOJ-9ZDLCCUABIBcfOJo4sKQwZpG6kCU9CmPQKdbQyN4foPWrgEc/s1600/JgiDBP.png" imageanchor="1"><img border="0" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiujkRs_TY7zetuP-iQgwmMiyF3cPWil9OWjKE5Hmrzu6FPIP2-XajQxWKUX6zVNjhA5NJr9W06UhshZEu02xzORcloOJ-9ZDLCCUABIBcfOJo4sKQwZpG6kCU9CmPQKdbQyN4foPWrgEc/s320/JgiDBP.png" width="320" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDw2ucPB1IfBvS5QNMQh2bM2bEqp_ZDcV4r3jKHoDm_2o6vQBiAvhfuWtICzom3xsYnqXwRL_Vd_UMY9xm76eWSS_e19ofLGwP4DMeROwVA-6xVNjE4FA4Bnb02fK4puaeplM4GMMvUqk/s1600/CZlRrW.png" imageanchor="1"><img border="0" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDw2ucPB1IfBvS5QNMQh2bM2bEqp_ZDcV4r3jKHoDm_2o6vQBiAvhfuWtICzom3xsYnqXwRL_Vd_UMY9xm76eWSS_e19ofLGwP4DMeROwVA-6xVNjE4FA4Bnb02fK4puaeplM4GMMvUqk/s320/CZlRrW.png" width="320" /></a><br />
<br />
Please visit the store page for more information, the following will be a breakdown of the code.<br />
<br />
<a name='more'></a><br />
<br />
I am most proud of the custom editor i made clickable objects. I needed to make it so once you clicked on an object, it checked the circumstances it was clicked under ( Held items, Global Variables, Etc.) Then it would run an action. Actions range from changing global variables, moving to different scenes, or making a spooky monster jump out at the player.<br />
<br />
Below is a demonstration of the custom editor:<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnodTtGDoxV-fz6SvwhPWZLUPCQgb8d8uwDIrCQl8RjSJ7FXaRb0Vlx2hRtbPF7boPJSbHnUF7Li-9x6Yd9HnI2I1Ybv0W6cOsOPuul6BqAzPdK67NTJLXXO0vRyX1xzMBUzzctk_u-lA/s1600/ezgif-1-1daf23cfdc38.gif" imageanchor="1"><img border="0" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnodTtGDoxV-fz6SvwhPWZLUPCQgb8d8uwDIrCQl8RjSJ7FXaRb0Vlx2hRtbPF7boPJSbHnUF7Li-9x6Yd9HnI2I1Ybv0W6cOsOPuul6BqAzPdK67NTJLXXO0vRyX1xzMBUzzctk_u-lA/s320/ezgif-1-1daf23cfdc38.gif" width="320" /></a><br />
Note that they destroy item variable only shows up when the proper enum is selected.<br />
<br />
Here is the code :<br />
<br />
<b>clickableObject.cs:</b><br />
<iframe src="https://pastebin.com/embed_iframe/bKRtwhUq" style="border:none;width:100%;height:600px"></iframe>
<br />
<b>clickableObjectEditor.cs:</b><br />
<iframe src="https://pastebin.com/embed_iframe/Uba5CcXn" style="border:none;width:100%;height:600px"></iframe>
<br />
<br />
<br />
<br />Nick Barberhttp://www.blogger.com/profile/09854363891328959129noreply@blogger.com0tag:blogger.com,1999:blog-4333167199818042343.post-14969458506506476902018-10-20T10:45:00.000-07:002018-12-17T19:01:09.079-08:00Map Generation Part 1Here is a work in progress for a dungeon generator i am putting together.<br />
<br />
So far it generates some rooms:<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3EuRt6VXSQQiYOSbxoHQ-81RK-8QSNUWasEjBt0dlL8-_Jr0p7z0PE2TBK5la73hz6ZZDmcj-ZAQaAr5mLYRd4YYp2h_Dymd_8dwvbkgmWC5VgAnFlZwFbzPC-vY3-hZ4ZosQwus4IuU/s1600/1.PNG" imageanchor="1"><img border="0" height="319" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3EuRt6VXSQQiYOSbxoHQ-81RK-8QSNUWasEjBt0dlL8-_Jr0p7z0PE2TBK5la73hz6ZZDmcj-ZAQaAr5mLYRd4YYp2h_Dymd_8dwvbkgmWC5VgAnFlZwFbzPC-vY3-hZ4ZosQwus4IuU/s320/1.PNG" width="320" /></a><br />
<br />
Then it connects those rooms with hallways.<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpHPmnMr5Oc7pZx2Aq1OZPRK6h1QZ74BnIj1j-6UYrsw6lndhCQta8fPisFZu7EnGSG2YCqKJSrsZ9lOkL4upDaagg-ULma2ylJNdnGBDxx-0mfkou8VDfKaui1jIbVbvrgkF2_i1kV_s/s1600/Capture.PNG" imageanchor="1"><img border="0" height="318" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpHPmnMr5Oc7pZx2Aq1OZPRK6h1QZ74BnIj1j-6UYrsw6lndhCQta8fPisFZu7EnGSG2YCqKJSrsZ9lOkL4upDaagg-ULma2ylJNdnGBDxx-0mfkou8VDfKaui1jIbVbvrgkF2_i1kV_s/s320/Capture.PNG" width="320" /></a><br />
<br />
<br />
<a name='more'></a><br /><br />
Here is the code so far:<br />
<br />
<iframe src="https://pastebin.com/embed_iframe/7mXmsxKS" style="border: none; height: 2000px; width: 100%;"></iframe>Nick Barberhttp://www.blogger.com/profile/09854363891328959129noreply@blogger.com0tag:blogger.com,1999:blog-4333167199818042343.post-12336033899787590402018-02-05T09:38:00.000-08:002019-02-07T16:25:59.522-08:00Vacancy<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIbBhHtwtCoZjqEulKS-keYajhuce_a3ru1hiIQkHWAEnpwTBqg1jLoWM9X29K5xObXnEDTXRsv2UCjgGY_SfvDf9xxFKLLgPK5_vp4zmR2O45lzxXYzEvsOt2UWOCuNCYZsa9R2BoAow/s1600/ss4.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div style="text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/cBA6vvOGUTc/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/cBA6vvOGUTc?feature=player_embedded" width="320"></iframe></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<a href="https://nick-barber.itch.io/vacancy" target="_blank">Play now</a></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<br />
<a name='more'></a><br /></div>
Vacancy was made for the 2018 game jam at Scad. It won Best in show, was debuted at a local gaming convention, went on to win best in Georgia, and debuted at siege con 2018 and GDC 2018<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIbBhHtwtCoZjqEulKS-keYajhuce_a3ru1hiIQkHWAEnpwTBqg1jLoWM9X29K5xObXnEDTXRsv2UCjgGY_SfvDf9xxFKLLgPK5_vp4zmR2O45lzxXYzEvsOt2UWOCuNCYZsa9R2BoAow/s1600/ss4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="847" data-original-width="1600" height="168" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIbBhHtwtCoZjqEulKS-keYajhuce_a3ru1hiIQkHWAEnpwTBqg1jLoWM9X29K5xObXnEDTXRsv2UCjgGY_SfvDf9xxFKLLgPK5_vp4zmR2O45lzxXYzEvsOt2UWOCuNCYZsa9R2BoAow/s320/ss4.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFWQ2ilEqe_QqJBYKdco4lpJUPk6CGxKhlURdW28MPC2LonRea_S0lAD0TXjTk28nnN7AmBYdiiTPWn5LNAXu1qwmzUfT4Fdf-1DzppxAebTJ_ghE3gyIf0oVGoCRUUaUNM9z41BEWPOE/s1600/ss1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="861" data-original-width="1600" height="169" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFWQ2ilEqe_QqJBYKdco4lpJUPk6CGxKhlURdW28MPC2LonRea_S0lAD0TXjTk28nnN7AmBYdiiTPWn5LNAXu1qwmzUfT4Fdf-1DzppxAebTJ_ghE3gyIf0oVGoCRUUaUNM9z41BEWPOE/s320/ss1.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
We had a team of about 8-9. I was the lead programmer and worked in unity alongside Logan McClure. I think this game was a major success, as puzzle games are no easy task to design and create on a limited budget of time.<br />
<br />
My main responsibility was Game Design and Programming. I ended up creating the movement system, animation controller, dimensional shifting, and puzzle mechanics. The puzzles were mainly designed by me.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEho238jlVe2HRXl3P29VHQgSiyhLvkJRCG25WmHFMBJ_Ys8S9aIpFtpW505qLWc4IUC21EuBMU8NLBl9AXq3WKB_qPmv-504cYmmKMeIHw9Poum50SqiOWRKYTmwPQwnStV-nIeCui9it4/s1600/ss5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="847" data-original-width="1600" height="168" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEho238jlVe2HRXl3P29VHQgSiyhLvkJRCG25WmHFMBJ_Ys8S9aIpFtpW505qLWc4IUC21EuBMU8NLBl9AXq3WKB_qPmv-504cYmmKMeIHw9Poum50SqiOWRKYTmwPQwnStV-nIeCui9it4/s320/ss5.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVngz05z_VfkTwdttTbkucRH0Z8RHH9Hutgh7omfQs9Gu7j02n44C-fv_MI2ZneyJi_GX-cwime5P02ALL-00WIgf2LQAZ_dDy3Kp_f0QC9dFQegKykEaGLBRINZHRAFVXjJGt-gFNkEg/s1600/ss2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="847" data-original-width="1600" height="168" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVngz05z_VfkTwdttTbkucRH0Z8RHH9Hutgh7omfQs9Gu7j02n44C-fv_MI2ZneyJi_GX-cwime5P02ALL-00WIgf2LQAZ_dDy3Kp_f0QC9dFQegKykEaGLBRINZHRAFVXjJGt-gFNkEg/s320/ss2.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
After the initial development time, i went back and polished the game along with alex childeres. We added a new puzzle, new animation, and reworked the narrative and ending. So far it has had over a hundred plays on itch.io, and even a lets play.<br />
<br />
Here is a GIF of how it all works:<br />
<br />
<div style="text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYFvBhuKga2eZwWLsmYYqvciqSyfSJGat1Q-6PdmuQQpF-a7WR-nf6rtIgYrnpaJUY11wFuwIXCkrghP3KnEbbfCbm7FhGxu1mttJiLZ0Grf3IlcZqya1InULBbgGzUgEn-yrz_I4qNSc/s1600/ezgif-1-1f6090d94ff5.gif" imageanchor="1"><img border="0" height="225" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYFvBhuKga2eZwWLsmYYqvciqSyfSJGat1Q-6PdmuQQpF-a7WR-nf6rtIgYrnpaJUY11wFuwIXCkrghP3KnEbbfCbm7FhGxu1mttJiLZ0Grf3IlcZqya1InULBbgGzUgEn-yrz_I4qNSc/s400/ezgif-1-1f6090d94ff5.gif" width="400" /></a></div>
<div style="text-align: center;">
<br /></div>
It's fairly simple, we just switch between two or three game objects, and overlay a static effect over the screen to hide the transition.<br />
Ill spare you the code, as its too simple to really be relevant.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />Nick Barberhttp://www.blogger.com/profile/09854363891328959129noreply@blogger.com0tag:blogger.com,1999:blog-4333167199818042343.post-87333546026970578562017-12-13T21:07:00.001-08:002017-12-13T21:26:23.969-08:00Seagull Ai<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="margin-left: 1em; margin-right: 1em; text-align: center;">
<img border="0" data-original-height="449" data-original-width="1529" height="187" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilzuoN0297xlUH0X-DdqwviPuNGRoEskCW4HhSiEx4Z-6EowkxmD5RqguITTRps_EkqfPJRNqcNIlEFyQUeC_ptYACZwYfQ8B3x8Qi2oOgoAqISUbz7faPwnepNHmJSwuGLNKrUZQfNDg/s640/Untitled-1.png" width="640" /></div>
<br />
<br />
<br />
<br />
<br />
Here is an ai for seagulls. They fly around, land, and take off similar to actual birds. A world can easily be populated with these birds to bring more "life" into the environment.<br />
<br />
<a href="https://studentpages.scad.edu/~nbarbe21/files/SeagullAi.cs" target="_blank">Full Code Here</a><br />
<br />
<a name='more'></a><br />
<br />
<br />
<pre class="brush: csharp">// Code by Nick Barber
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SeagullAi : MonoBehaviour {
float RNG;
Vector3 FlyingDirection;
Vector3 landingPoint;
Vector3 LandingRot;
Vector3 TakeoffDirection;
bool flying;
bool landing;
public float Speed;
public float YawSpeed;
public float PitchSpeed;
public Transform player;
void Start(){
StartCoroutine(Timer());
}
IEnumerator Timer(){ //run every second, randomly generates a vector and float for use in navigation and rng
do{
RaycastHit hit;
Vector3 groundview = transform.TransformDirection(Vector3.down);
float newyaw;
if (transform.position.y < 8 || Physics.Raycast(transform.position, groundview, out hit, 20)){ //too close to ground
newyaw = -10.0f;
}
else if (transform.position.y > 80){ // too high
newyaw = 5.0f;
}
else{
newyaw = Random.Range(-5.0f, 5.0f);
}
FlyingDirection = new Vector3(newyaw, Random.Range(0, 360),0);
RNG = Random.Range(0, 100); //used for percent chance
yield return new WaitForSeconds(1);
} while (1==1);
}
void FixedUpdate(){
if (flying){
Speed = 10;
if (RNG > 90 && transform.position.y > 20 && Vector3.Distance(transform.position, player.position) > 20){ //randomly choose a landing point, if the timing is correct, you arnt near the player, and you are high enough in the sky
FindLandingPoint();
GetComponent<animator>().Play("Armature|Wing Flap");
}
//Flying maths
Vector3 NewAngle = new Vector3(Mathf.LerpAngle(transform.eulerAngles.x, FlyingDirection.x, Time.deltaTime * PitchSpeed), Mathf.LerpAngle(transform.eulerAngles.y, FlyingDirection.y, Time.deltaTime * YawSpeed), 0);
transform.eulerAngles = NewAngle;
transform.Translate(Vector3.forward * Time.deltaTime * Speed);
}
else if (landing){
Speed = 8;
if (Vector3.Distance(transform.position, landingPoint) > 0.1f){ //rotate and fly towards desired landing position while you are not close enough to land
Vector3 Target = landingPoint - transform.position;
Quaternion ToRotation = Quaternion.FromToRotation(Vector3.forward, Target);
transform.rotation = Quaternion.Lerp(transform.rotation, ToRotation, Time.deltaTime * 1f);
transform.Translate(Vector3.forward * Time.deltaTime * Speed);
}
else{ //stick to the ground where you wanted to land
GetComponent<animator>().Play("Armature|land");
transform.eulerAngles = LandingRot;
transform.position = landingPoint;
if (RNG > 95 || Vector3.Distance(transform.position, player.position) < 10){ //wait to takeoff, can be intrupted by a player "shooing" you away
GetTakeOffDirection();
landing = false;
}
}
}
else{ //take off
Speed = 10;
if (Vector3.Distance(transform.position, landingPoint) < 20){
transform.rotation = Quaternion.LookRotation(TakeoffDirection);
transform.Translate(Vector3.forward * Time.deltaTime * Speed);
}
else{
flying = true;
landing = false;
}
}
}
void FindLandingPoint(){ //search for a landing point
Vector3 desiredLandingPoint;
int Distance= 50;
RaycastHit Hit3;
desiredLandingPoint = new Vector3(Random.Range(transform.position.x - Distance, transform.position.x + Distance), transform.position.y, Random.Range(transform.position.z - Distance, transform.position.z + Distance));
Debug.DrawRay (desiredLandingPoint, Vector3.down * 100, Color.blue);
if (Physics.Raycast(desiredLandingPoint, Vector3.down, out Hit3, 100)){
if (Hit3.transform.tag != "UnderWater" && Hit3.transform.tag != "Water" && Hit3.transform.tag != "Boat" && Hit3.transform.tag != "PickUp" && Hit3.transform.tag != "Untagged"){
landingPoint = Hit3.point;
LandingRot = Hit3.normal;
flying = false;
landing = true;
return;
}
}
return;
}
void GetTakeOffDirection(){ //find a direction that is free to take off
RaycastHit hit;
TakeoffDirection = transform.TransformDirection(Vector3.forward);
TakeoffDirection.y += 0.5f;
Vector3 Above = transform.position;
Above.y += 1;
int timesTried = 0;
do {
Debug.DrawRay (Above, TakeoffDirection * 50, Color.red);
if (Physics.Raycast(Above, TakeoffDirection, out hit, 50)){
TakeoffDirection = Quaternion.Euler(0, -10, 0) * TakeoffDirection;
}
else{
GetComponent<animator>().Play("Armature|Wing Flap");
flying = false;
landing = false;
return;
}
timesTried++;
} while (timesTried < 100);
print(name + " is stuck!");
Destroy(gameObject);
return;
}
}
</animator></animator></animator></pre>
Nick Barberhttp://www.blogger.com/profile/09854363891328959129noreply@blogger.com0tag:blogger.com,1999:blog-4333167199818042343.post-31375589581907060732017-11-30T16:37:00.001-08:002017-12-15T02:18:16.224-08:00Inventory<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLo00zQoyQIzKL6GpIagORhCj__c_T0nb8Kg_-qPmW4Ky5Y3xbA4gDd8vyzoC6wpwYFa-EvPbKXTsiwiqb3yxocxO8_3LDPbVeu0oZFadOG_2MdHckmVU4EN418_VTbC09zefg3vDa3TQ/s1600/invdemo1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="635" data-original-width="854" height="237" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLo00zQoyQIzKL6GpIagORhCj__c_T0nb8Kg_-qPmW4Ky5Y3xbA4gDd8vyzoC6wpwYFa-EvPbKXTsiwiqb3yxocxO8_3LDPbVeu0oZFadOG_2MdHckmVU4EN418_VTbC09zefg3vDa3TQ/s320/invdemo1.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div style="text-align: center;">
<div style="text-align: left;">
<a href="https://studentpages.scad.edu/~nbarbe21/files/ComplexInvetory.unitypackage" target="_blank">Download This Package</a></div>
</div>
<div class="separator" style="clear: both;">
</div>
<div style="text-align: center;">
</div>
<br />
<div style="-webkit-text-stroke-width: 0px; color: black; font-family: "Times New Roman"; font-size: medium; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: center; text-decoration-color: initial; text-decoration-style: initial; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
<div style="margin: 0px; text-align: left;">
<a href="https://studentpages.scad.edu/~nbarbe21/files/Inventory.cs" target="_blank">Link to code</a></div>
</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Here is a inventory system i've made. It is inspired by systems like the one in resident evil 4</div>
and focuses on items taking up physical space and shape, and requiring the player to manage their inventory space. For example, high value items could take up larger space, or be a strange shape, thus making it more difficult to carry. Note that objects can be rotated.<br />
<div class="separator" style="clear: both; text-align: left;">
</div>
<a name='more'></a><br />
<br />
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
I tried to write my code in a very modular fashion, allowing for it to be built upon, so if someone wanted to add stacking items or more attributes they easily could. More importantly, it is very easy to add more containers, i only created two separate containers for the sake of demonstration, but its possible to make as many containers as you want.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Here are more configurations i've made:</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpcNFsd2EdmU-IbI2vM7jYG4LvnZ-Wuhf96jjmCXRRztjvJZwePCCdqtBaoHf1tX5ZMzNCJe-W8IE8MfSDk2f3gkSVgBHM7GGcGZtHsrw0b8Z-z2af7BlEPAHV-tDvEa5n2O_92y9279w/s1600/invdemo3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="635" data-original-width="854" height="237" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpcNFsd2EdmU-IbI2vM7jYG4LvnZ-Wuhf96jjmCXRRztjvJZwePCCdqtBaoHf1tX5ZMzNCJe-W8IE8MfSDk2f3gkSVgBHM7GGcGZtHsrw0b8Z-z2af7BlEPAHV-tDvEa5n2O_92y9279w/s320/invdemo3.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9MJTqkvzJ_PZZCmHTm4_k9g6MmtCky48y4MLNqZYK8QjTQoB7ZvrmgmRhpCdwJ7i3mELXH2Tm1lSbiT5eHo18NyEEOgVsRg5gk2RK7NqrX9yCs9gN5U-PWWceYPDPA4q7l6i7oFOr4xs/s1600/invdemo2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="635" data-original-width="854" height="237" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9MJTqkvzJ_PZZCmHTm4_k9g6MmtCky48y4MLNqZYK8QjTQoB7ZvrmgmRhpCdwJ7i3mELXH2Tm1lSbiT5eHo18NyEEOgVsRg5gk2RK7NqrX9yCs9gN5U-PWWceYPDPA4q7l6i7oFOr4xs/s320/invdemo2.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Now I'll quickly go over some of my code:</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<img border="0" height="170" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2lPHDBTMprlRr9ZGywptHACyREG4ksF5ix1D0JJbWVTb_jmW_DvVs_YjTdyF5YbE_YGEEbyYukBdTRYA2gDtEMC6S7SBQDdqeX3TGBlEQ_1TCOqixupMkiTzIEjRSas2GLpUH8rkGBT8/s320/Untitled-3.png" width="320" /></div>
<div class="separator" style="clear: both; text-align: left;">
Firstly, the Items class. This is an array that describes how an item should function. If a developer wanted to add a new item to the game, they could do so through unity's ui, rather than editing the code.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
At the moment, i only have two elements, being Name and Parts. Parts is an array of each part of an inventory object, its variables contain the sprites and offsets in order to construct a complete item.</div>
<div class="separator" style="clear: both; text-align: left;">
Any more attributes of an item, such as world mesh, action, etc. can be added into this class.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<pre class="brush: csharp">
[System.Serializable]
public class Item
{
public string ItemName;
public ComplexItemPart[] Parts;
}
[System.Serializable]
public class ComplexItemPart{
public Vector2 ItemPosition;
public Sprite ComplexPartIcon;
}
</pre>
The Container Architecture is a bit verbose for what i have here, but like I've said i really wanted to keep this code easily expandable. This makes it easy to have separate containers, as you can see above in the demonstration I've created two, but its easy to make more. This way, containers can be held on separate objects, making things like chests, or trading between players online, very easy.<br />
<br />
<pre class="brush: csharp">
[System.Serializable]
public class Container
{
public InventoryItems[,] ContainingItems;
public int columns = 5;
public int row = 5;
public Image[,] SlotImgs;
}
public class InventoryItems
{
public int ItemID;
public Vector2 ParentSlot= new Vector2(-1,-1);
public bool SlotRot;
}
public Container PlayerInventory;
public Container OtherContainer;
</pre>
Each container is generated based on the specifications written here, So the public variables PlayerInvetory and OtherContainer are used to "setup" those containers.<br />
<br />
The cursor is fairly self explanatory:<br />
<pre class="brush: csharp"> void UpdateCursor(){ //create a new cursor
foreach (Image cursorsimgs in CursorParts){
Destroy(cursorsimgs.gameObject);
}
if (Holding.InHandID!=0){
CursorParts = new Image[ItemList[Holding.InHandID - 1].Parts.Length];
for (int i = 0; i < ItemList[Holding.InHandID - 1].Parts.Length; i++) {
GameObject CreatedCursorElement = Instantiate(CursorObj, Cursor.position, Quaternion.identity);
CursorParts[i] = CreatedCursorElement.GetComponent<image>();
CursorParts[i].transform.parent = Cursor;
CursorParts[i].sprite = ItemList[Holding.InHandID - 1].Parts[i].ComplexPartIcon;
}
RotateCursor();
}
else{
CursorParts = new Image[0];
}
}
</image></pre>
The cursor is build and destroyed in sections for each item, i could have made items one large image, but i wanted to be able to mix and match parts (if you're familiar with tilesheets this makes more sense). And as an added bonus, i can fit all my items onto a single sprite sheet.<br />
<br />
<br />
I'll skip over slot generation for the sake of brevity.<br />
<br />
<br />
Finally, the most complex segment of the code, slotting items in and out of slots.<br />
Note that there is no reference to the players inventory, as this function works with whatever container you throw at it. I think i could have done a better job by defining some temporary variables just for the sake of readability, as i do repeat long lines a few times.<br />
<pre class="brush: csharp">
public void ClickSlot(Vector2 slotclicked, Container C) { // the player has clicked on an item slot
Vector2 Parent = C.ContainingItems[(int)slotclicked.x, (int)slotclicked.y].ParentSlot;
///////////////////Pick Up///////////////////////////
if (Parent!= new Vector2(-1,-1) && Holding.InHandID == C.ContainingItems[(int)Parent.x, (int)Parent.y].ItemID|| Holding.InHandID ==0) { // hands are empty or the player has the same item in their hand, so you should pick it up
if (C.ContainingItems[(int)slotclicked.x, (int)slotclicked.y].ItemID != 0){ //slot is not empty
Holding.InHandID = C.ContainingItems[(int)Parent.x, (int)Parent.y].ItemID;
C.ContainingItems[(int)Parent.x, (int)Parent.y].ParentSlot = new Vector2(-1,-1);
foreach (ComplexItemPart parts in ItemList[Holding.InHandID - 1].Parts){ //Remove all complex parts of the item
Vector2 parttoSlot;
if(C.ContainingItems[(int)Parent.x, (int)Parent.y].SlotRot) parttoSlot= Parent + parts.ItemPosition;
else parttoSlot = Parent + new Vector2(-parts.ItemPosition.y, parts.ItemPosition.x);
C.ContainingItems[(int)parttoSlot.x, (int)parttoSlot.y].ItemID = 0;
C.ContainingItems[(int)parttoSlot.x, (int)parttoSlot.y].ParentSlot = new Vector2(-1, -1);
C.SlotImgs[(int)parttoSlot.x, (int)parttoSlot.y].sprite= EmptySlot;
}
UpdateCursor(); //clear the cursor
return;
}
}
///////////////////Put Down///////////////////////////
else if (Holding.InHandID != 0){ // the player has an item in their hand
bool canfit = true;
Vector2 parttoSlot;
foreach (ComplexItemPart parts in ItemList[Holding.InHandID-1].Parts) { //can this part fit into the players inventory?
if (rot) parttoSlot = slotclicked + parts.ItemPosition;
else parttoSlot = slotclicked + new Vector2(-parts.ItemPosition.y, parts.ItemPosition.x);
if (parttoSlot.x<=-1||parttoSlot.x >= C.columns ||parttoSlot.y <= -1 || parttoSlot.y >= C.row){ //overflows
canfit = false;
break;
}
if (C.ContainingItems[(int)parttoSlot.x, (int)parttoSlot.y].ItemID!=0){ //collides with other item
canfit = false;
break;
}
}
if (canfit){ //item can fit, slot it in
foreach (ComplexItemPart parts in ItemList[Holding.InHandID - 1].Parts){ //put all complex parts into correct slots
if (rot){ //check for rotation
parttoSlot = slotclicked + parts.ItemPosition;
C.SlotImgs[(int)parttoSlot.x, (int)parttoSlot.y].transform.eulerAngles = new Vector3(0, 0, 0);
}
else{
parttoSlot = slotclicked + new Vector2(-parts.ItemPosition.y, parts.ItemPosition.x);
C.SlotImgs[(int)parttoSlot.x, (int)parttoSlot.y].transform.eulerAngles = new Vector3(0, 0, -90);
}
C.ContainingItems[(int)parttoSlot.x, (int)parttoSlot.y].ItemID = Holding.InHandID;
C.ContainingItems[(int)parttoSlot.x, (int)parttoSlot.y].ParentSlot = slotclicked;
C.ContainingItems[(int)parttoSlot.x, (int)parttoSlot.y].SlotRot = rot;
C.SlotImgs[(int)parttoSlot.x, (int)parttoSlot.y].sprite = parts.ComplexPartIcon;
}
Holding.InHandID = 0;
UpdateCursor();//generate a new cursor
}
return;
}
}
</pre>
<br />
<br />
<br />Nick Barberhttp://www.blogger.com/profile/09854363891328959129noreply@blogger.com1tag:blogger.com,1999:blog-4333167199818042343.post-60304464208948997622017-11-29T20:19:00.002-08:002017-12-15T01:25:02.064-08:00Dungeon Generator<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvBYXPpXhJAd21tYoDOBcTfAwOwUJpFRdnyHo3uDzEPTcrTm8OBVoSpkDtQ9WCX4pept6pC6nlok55kVIIYQWQjZ3J-bgzZHnGIwW-5kJaIFqgsiBiJ-XGVIuxGaIkGQcRT9xGCWKS6OU/s1600/fnidosanf.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="620" data-original-width="1217" height="163" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvBYXPpXhJAd21tYoDOBcTfAwOwUJpFRdnyHo3uDzEPTcrTm8OBVoSpkDtQ9WCX4pept6pC6nlok55kVIIYQWQjZ3J-bgzZHnGIwW-5kJaIFqgsiBiJ-XGVIuxGaIkGQcRT9xGCWKS6OU/s320/fnidosanf.png" width="320" /></a></div>
<div style="text-align: center;">
<div style="text-align: left;">
<a href="https://studentpages.scad.edu/~nbarbe21/files/roomgen.unitypackage" target="_blank">Download This Package</a></div>
</div>
<div style="text-align: center;">
<div style="text-align: left;">
<a href="https://studentpages.scad.edu/~nbarbe21/files/RoomGenerator.cs" target="_blank">Link to code</a></div>
</div>
<div style="text-align: center;">
<div style="text-align: left;">
<br /></div>
<a name='more'></a><div style="text-align: left;">
<br /></div>
</div>
<div style="text-align: left;">
Here is a fairly simple dungeon generator, this script would be good for a randomly generated top-down game like binding of Issac. I only have several rooms in the example, but the system is fully expandable.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
I've ensured that the exact amount of rooms is always created, and there are never inaccessible areas. if there were specific rooms required in each dungeon, they could simply be slotted into the code (for instance: boss rooms in binding of Issac)</div>
Nick Barberhttp://www.blogger.com/profile/09854363891328959129noreply@blogger.com0tag:blogger.com,1999:blog-4333167199818042343.post-72532295159582173782017-11-29T19:05:00.004-08:002017-11-29T21:24:56.935-08:00VR Experiments<div style="clear: both; text-align: center;">
Here is a collection of vr experiments i have created, i will be updating this post as i do more work</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<a name='more'></a><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/GXTa_roaVzQ/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/GXTa_roaVzQ?feature=player_embedded" width="320"></iframe></div>
<div class="separator" style="clear: both; text-align: left;">
This is a working concept for a bag of holding, the the player can put an infinite amount of items into a bag, and their only way of retrieving items is to flip the bag over and pour out everything inside of the bag.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/EmPpji15zjQ/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/EmPpji15zjQ?feature=player_embedded" width="320"></iframe></div>
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/ZNgOsehbQsg/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/ZNgOsehbQsg?feature=player_embedded" width="320"></iframe></div>
<div class="separator" style="clear: both; text-align: left;">
Here is some footage of a vr tank idea i played around with, i plan on returning to the idea, but with a more solid vision and development process behind it.</div>
<br />Nick Barberhttp://www.blogger.com/profile/09854363891328959129noreply@blogger.com0tag:blogger.com,1999:blog-4333167199818042343.post-43872412884182228552017-11-29T18:45:00.003-08:002019-02-07T19:13:47.919-08:00Drone<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/c6TNBQ59G6Y/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/c6TNBQ59G6Y?feature=player_embedded" width="320"></iframe></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: -.75pt; margin-right: 8.4pt; margin-top: 0in; text-indent: 36.05pt;">
<br />
<a name='more'></a><br />
<br />
This project
represents my first usage of the Unreal Engine to create gameplay. Before this,
I mainly used unity engine to make similar projects, and have become very
accustomed to the systems it uses. The transition into unreal engine was rocky
at first, but after some practice with the blueprint system, I was more
confident, and could properly scope my project. </div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyyfGCYXyLuWwFXy8RST-DMr8aw1r7QfsSmrfyac3aTjlnp1_Sxhgin-lyf5kQuKH_5bDdGaXj6XcB5blRvY1CmLjtjnAAtYKGR7QvJnFNvEMBtyw4BozqEJtAALWript55e02dZy7_Wo/s1600/image002.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="188" data-original-width="391" height="191" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyyfGCYXyLuWwFXy8RST-DMr8aw1r7QfsSmrfyac3aTjlnp1_Sxhgin-lyf5kQuKH_5bDdGaXj6XcB5blRvY1CmLjtjnAAtYKGR7QvJnFNvEMBtyw4BozqEJtAALWript55e02dZy7_Wo/s400/image002.jpg" width="400" /></a></div>
<div class="MsoNormal" style="margin-bottom: 7.8pt; margin-left: -.25pt; margin-right: 8.4pt; margin-top: 0in;">
Speaking of scope, the end product is
very similar to what I had in mind when starting the project, though lacking a
few minute details which I will go over later. I can though, say I am happy with
the outcome, considering the circumstances that it was made under. <o:p></o:p></div>
<div class="MsoNormal" style="line-height: 107%; margin-bottom: .0001pt; margin: 0in; text-indent: 0in;">
<br /></div>
<h1 style="margin-bottom: 8.75pt; margin-left: -.25pt; margin-right: 0in; margin-top: 0in;">
Features <o:p></o:p></h1>
<div class="MsoNormal" style="margin-bottom: 5.25pt; margin-left: -.25pt; margin-right: 8.4pt; margin-top: 0in;">
The main aspect I wanted to implement
was a sprawling world, which the player could freely explore. I found a
good-looking asset set for sand dunes and desert rocks, and these serve as a
base for the open world. The first feature I needed to implement was a vehicle
that the player could use to navigate the terrain.<span style="font-size: 11pt; text-indent: 0in;"> </span><span style="text-indent: 0in;"> </span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfm3fwTse4ffRJCEP5N5bX56iXtBeoL74sf-aJ_GD-N5SpM5646O4QkSBDHTO20uI3XQDS0Tt9Q9U8EM8YBa-q4JkrCTn-i8_9fYBVRM6x-XmrTnoA15i4p3W89PerZr3kHOLV58b4ZOM/s1600/image006.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="305" data-original-width="565" height="215" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfm3fwTse4ffRJCEP5N5bX56iXtBeoL74sf-aJ_GD-N5SpM5646O4QkSBDHTO20uI3XQDS0Tt9Q9U8EM8YBa-q4JkrCTn-i8_9fYBVRM6x-XmrTnoA15i4p3W89PerZr3kHOLV58b4ZOM/s400/image006.jpg" width="400" /></a></div>
<div class="MsoNormal" style="margin-bottom: 5.25pt; margin-left: -.25pt; margin-right: 8.4pt; margin-top: 0in;">
<span style="text-indent: 0in;"><br /></span></div>
<o:p></o:p><br />
<div class="MsoNormal" style="margin-bottom: 7.8pt; margin-left: -.25pt; margin-right: 8.4pt; margin-top: 0in;">
This turned out to be easier than
expected, as the unreal engine has blueprints set up for wheeled vehicles, but
getting the model I wanted to use to work with the system took some work. I
also needed to heavily edit its properties so the vehicle wouldn’t constantly
spin out. <o:p></o:p></div>
<div class="MsoNormal" style="margin-bottom: 7.8pt; margin-left: -.25pt; margin-right: 8.4pt; margin-top: 0in;">
For global variables, I followed my
usual strategy and made an invisible actor which would hold the scripting for
managing the game, I also hold the player’s health in this actor, as it is
shared by both the hoverbike and the firstperson controller.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxsghWSMa9sfWR1a9m6rnLPCt5w6tMdFOAA4krHpP3AFs3fwyjF8xM7a361tFQllyQQVDK5y-tw0MIX7YwY1GZXDjAyF8nG4qh6F7yLGEBukPeZbPkGR9igCRpNz82LNlWBggNEq77H6E/s1600/image008.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="314" data-original-width="584" height="215" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxsghWSMa9sfWR1a9m6rnLPCt5w6tMdFOAA4krHpP3AFs3fwyjF8xM7a361tFQllyQQVDK5y-tw0MIX7YwY1GZXDjAyF8nG4qh6F7yLGEBukPeZbPkGR9igCRpNz82LNlWBggNEq77H6E/s400/image008.jpg" width="400" /></a></div>
<div class="MsoNormal" style="margin-bottom: 7.8pt; margin-left: -.25pt; margin-right: 8.4pt; margin-top: 0in;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 7.8pt; margin-left: -.25pt; margin-right: 8.4pt; margin-top: 0in;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 1.3pt; margin-left: -.25pt; margin-right: 8.4pt; margin-top: 0in;">
Ui was a major part of this game. I
wanted a system to target nearby hazards and show up on the hud, terminator
style. But this wasn’t easily achieved with unreal UI. I ended up creating a
custom function and triggering it on the players update, which isn’t desirable,
but it was the easiest way I could get constant reliable updates on the ui,
even when its not being rendered or is off screen. The rest of the ui is fairly
simple, checking global variables like player’s health to decide which
animation to play.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgotLqWS2XwGYMOoNxFE15s-70GQp5nheJlk3kpDzH7sOQYaenJinrz0m7YhZzD0F6Y__EQ2xnYtogXwD7DzX1CM3GUhFZ3gmCKH-znJ5MsbY-MhzmLWPlBbyQFJU7lrVUfquFdMg14KQc/s1600/image010.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="264" data-original-width="571" height="183" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgotLqWS2XwGYMOoNxFE15s-70GQp5nheJlk3kpDzH7sOQYaenJinrz0m7YhZzD0F6Y__EQ2xnYtogXwD7DzX1CM3GUhFZ3gmCKH-znJ5MsbY-MhzmLWPlBbyQFJU7lrVUfquFdMg14KQc/s400/image010.jpg" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: -.25pt; margin-right: 8.4pt; margin-top: 0in;">
When
the player takes enough damage, the screen will appear broken, this is a custom
post processing effect that is based on the vhs effect found in the unreal
tutorials. I used a red channel image to offset the screen to give an effect of
a broken and glitch screen. This image was created in photoshop.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_a9dk4md_mLHoNIYwwybLcmewSd8U99xzSHmrkD6_W42ECweiRGiu0cRveysmgN8QWwmnPLNBpI_V3eYIEQB5kXJajJOhDqHIS3D75hz261wXkFJDHHVeMr0sDY4ruXhwEujULY8CAUg/s1600/image012.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="356" data-original-width="620" height="228" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_a9dk4md_mLHoNIYwwybLcmewSd8U99xzSHmrkD6_W42ECweiRGiu0cRveysmgN8QWwmnPLNBpI_V3eYIEQB5kXJajJOhDqHIS3D75hz261wXkFJDHHVeMr0sDY4ruXhwEujULY8CAUg/s400/image012.jpg" width="400" /></a></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: -.25pt; margin-right: 8.4pt; margin-top: 0in;">
<br /></div>
<div align="right" class="MsoNormal" style="line-height: 107%; margin-bottom: 3.95pt; margin-left: 0in; margin-right: 8.4pt; margin-top: 0in; text-align: right; text-indent: 0in;">
<o:p></o:p></div>
<div class="MsoNormal" style="line-height: 107%; margin-bottom: 7.8pt; margin-left: 0in; margin-right: 0in; margin-top: 0in; text-indent: 0in;">
<br /></div>
<div class="MsoNormal" style="line-height: 107%; margin-bottom: 7.8pt; margin-left: 0in; margin-right: 0in; margin-top: 0in; text-indent: 0in;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 7.8pt; margin-left: -.75pt; margin-right: 8.4pt; margin-top: 0in; text-indent: 36.05pt;">
The majority of work on this project
was on ai, I didn’t want to use any of unreal default ai scripts, and instead
created the blueprints myself. These are more or less similar to ai that ive
written before, having multiple states or modes that it transitions through,
and moving towards a target that’s either randomly selected by raycast or
players position. <o:p></o:p></div>
<div class="MsoNormal" style="margin-bottom: 7.8pt; margin-left: -.25pt; margin-right: 8.4pt; margin-top: 0in;">
I wanted the dialog system to be
fully customizable, usually I would use a custom class. In blueprint, I
achieved more or less the same effect with several arrays, the system only ever
supports two responses, but is fairly customizable.<b style="text-indent: 0in;"> </b></div>
<h1 style="margin-bottom: 7.8pt; margin-left: -.25pt; margin-right: 0in; margin-top: 0in;">
Cut Features <o:p></o:p></h1>
<div class="MsoNormal" style="margin-bottom: 7.8pt; margin-left: -.75pt; margin-right: 8.4pt; margin-top: 0in; text-indent: 36.05pt;">
Due to some health issues, I was set
back about two weeks, and had to cut some content. I originally wanted a boss
fight at the end of the game, and had created some animations and blueprints
for it, but didn’t have time to fully implement them. <o:p></o:p></div>
<div class="MsoNormal" style="margin-bottom: 7.8pt; margin-left: -.75pt; margin-right: 8.4pt; margin-top: 0in; text-indent: 36.05pt;">
I also wanted a few more cinematic
moments. The scanner drones were meant to follow the player into the ARK at the
end of the game, and recognize the human skeletons as a “Threat”. <o:p></o:p></div>
<div class="MsoNormal" style="margin-bottom: 7.8pt; margin-left: -.75pt; margin-right: 8.4pt; margin-top: 0in; text-indent: 36.05pt;">
Im<span style="text-indent: 48.0667px;"> </span><span style="text-indent: 48.0667px;">had also planned more character ani</span><span style="text-indent: 36.05pt;">ations, especially on the players arm and gun. I had the arm fully rigged,
but never got to implementing any animation. I had also meant to make the
players pistol overheat if used to fast, and a small animation would play with
the player being unable to use their gun for a brief moment.</span><br />
<o:p></o:p></div>
<div class="MsoNormal" style="line-height: 107%; margin-bottom: 8.3pt; margin-left: 0in; margin-right: 0in; margin-top: 0in; text-indent: 0in;">
<o:p></o:p></div>
<h1 style="margin-bottom: 8.75pt; margin-left: -.25pt; margin-right: 0in; margin-top: 0in;">
Conclusion <o:p></o:p></h1>
<br />
<div class="MsoNormal" style="margin-bottom: 7.8pt; margin-left: -.25pt; margin-right: 8.4pt; margin-top: 0in;">
<b> </b>I
had a lot of fun working on this project. In the future, I would like to not have
to model and texture as much as I did, but I just wouldn’t feel proud having a
project constructed of bought content. I will look further into scripting for unreal, as the blueprint
system just doesn’t work for me. I would have liked for this project to be more
interesting visually, but I can take a lot of value out of learning unreal,
maya, and substance painter. <o:p></o:p></div>
Nick Barberhttp://www.blogger.com/profile/09854363891328959129noreply@blogger.com0tag:blogger.com,1999:blog-4333167199818042343.post-58963698160129984772017-11-29T18:45:00.000-08:002017-11-29T22:15:13.796-08:00Occult<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/zg6SyaKqLxo/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/zg6SyaKqLxo?feature=player_embedded" width="320"></iframe></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://studentpages.scad.edu/~nbarbe21/files/Occult_Build%201.1.3.zip" target="_blank">Download Game</a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<a name='more'></a><div style="text-align: center;">
<a href="https://studentpages.scad.edu/~nbarbe21/files/Occult%20GDD.pdf" target="_blank">Game Design Document</a></div>
<div style="text-align: center;">
<a href="https://studentpages.scad.edu/~nbarbe21/files/Occult_ArtBible.pdf" target="_blank">Art Bible</a><br />
<br />
<div style="text-align: left;">
Occult is a game concept that i created during fall 2016. All assets, except sound effects and music, were created by me. From start to finish, the game was created in 9 weeks. The game takes roughly 5-10 minutes to play, has a boss fight, secret areas, collectibles, and a handful of easter eggs. </div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
The game concept was inspired by games like Hotline Miami. I wanted a game that allowed for fast-pased gameplay and more dynamic movement than most other games.</div>
<div style="text-align: left;">
<br /></div>
<h3 style="text-align: left;">
The Movement System</h3>
<div style="text-align: left;">
The movement system goes for a "Fun gameplay over realizim" approach. The player is able to climb and hang on to every surface in the game indefinitely, this allows the player a lot more freedom than in other conventional 2D platformers. The movement system also allows for a much more verticality to the levels, as the player can easily move in any direction.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
One of the major challenges was to get the system working, as of now it works using box collision to to determine what action the player is preforming ( latching on to a ceiling, landing on a wall, or landing on the ground). If i were to revisit this project i would make the collision more complex, to make it easier to deal with diagonal surfaces (they are in the game, but are limited because of the complexities the bring up). </div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
My favorite feature of the movement system is the grappling hook, as it a very simple addition to the system i had in place, yet extremely fun.<br />
<br /></div>
<h3 style="text-align: left;">
Animation</h3>
<div style="text-align: left;">
The animation in this game is something that i am extremely proud of, not only for the end product, but for the execution also. I wanted to make my game in pixel art, as its a style i am fond of and comfortable with. This brought up a problem though, when it comes to animation, id like to say that im not terrible, however i find frame-by-frame animation extremely difficult, and more importantly, boring. </div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEit3uYDV_MdpKdVKQxYDV3obn_ahyEqTh3gZZcFuIAAWgqxO17CVrCTUPipPJ-kC6SzAf8u9IoRC_vvFfVGIM41NoKybtuhiKM9WeOw0ytQhDZ-acqa1kescWVIS3nPwjYFa3ZeiUiAZMM/s1600/GUY3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="33" data-original-width="74" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEit3uYDV_MdpKdVKQxYDV3obn_ahyEqTh3gZZcFuIAAWgqxO17CVrCTUPipPJ-kC6SzAf8u9IoRC_vvFfVGIM41NoKybtuhiKM9WeOw0ytQhDZ-acqa1kescWVIS3nPwjYFa3ZeiUiAZMM/s1600/GUY3.png" /></a></div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
So inorder to solve this problem, i created my characters by segmenting them into parts, then animated them limb by limb similar to bone animation. </div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
This resulted in extremely fluid animation, and a smoother(at least for me) workflow. I was also able to add detail that wouldn't be able to be created in frame by frame, such as the slides of guns moving back when fired, and reload animations with clips being removed and replaced.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Animation is an important factor in this game as it adds to the fluidity of the movement, never making the player feel like the momentum of the game has stalled.<br />
<br /></div>
<h3 style="text-align: left;">
Environment</h3>
</div>
<div style="text-align: left;">
The environmental art of Occult took up the majority of its development, and while i'm first and foremost a programmer and designer, i got to really exercise my artistic skills with this project. I tried my best to adhere to a color scheme and style. For the foreground i used unity tilemap feature, and for environmental assets i created prefabricated assets such as houses, churches, and trees, and placed these onto parallax layers, in all there are 5 different parallax layers.</div>
<br />
<br />Nick Barberhttp://www.blogger.com/profile/09854363891328959129noreply@blogger.com0tag:blogger.com,1999:blog-4333167199818042343.post-69186227263415985772017-11-25T08:48:00.001-08:002017-11-29T22:19:07.671-08:00The terrible events that took place at 139 Stone Church road (Revamp)<br />
<div style="text-align: center;">
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/VEMT3jR7Eiw/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/VEMT3jR7Eiw?feature=player_embedded" width="320"></iframe></div>
<a name='more'></a><br />
<div style="text-align: left;">
<br />
I went back to an older school project from spring '17, and added some polish to it for fun.The class required a static scene built in unreal engine, so i used it for an excuse to practice visual storytelling, i tried to show a narrative with trails of blood, damaged and moved furniture, and the chair facing the open door, as if someone had been waiting for someone or something to come for them. I had some free time, so I fixed up some older uvs, added a grime layer, and more blood. After that i spent more time working on the post processing effects, as those were the weakest part of my original project.</div>
</div>
<div style="text-align: center;">
<img border="0" data-original-height="825" data-original-width="1600" height="164" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfItfndsu6JfYZHQMinYN5UnOgd57M1xqm7aj7lsj0I1zLdfQOc03gkqaK9-I_mGyIB0TdH-jzhWARy6XsL3G4Tc12WupBE6AJ09sIKnxd68mHE1yj7M9iuZ1Da6M81O0gCxhfqNIaHdI/s320/PortfolioImg16.png" width="320" /><img border="0" data-original-height="825" data-original-width="1600" height="164" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSAQPuY3-sKipGUFsETEV0fJGVottSpDiQ7_XWb2YguTTX0sH_fnR2q-lsx2WKQzcSst42gJsXJ4PEkW__uAP-0lNm3f-j-OkYrxJH-MciuFUv6WAqqQV-1urwsm562-tKYrMBsOeZe9E/s320/PortfolioImg17.png" width="320" /></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<img border="0" data-original-height="825" data-original-width="1600" height="164" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2_cWLyviXLIrWIoYAfKXwdkK_UCGBtc2bGafjAe2n2KGGAm2gVyhEElpAnAfLFiGQG09p-61BinY3QIAoR08tuhFqw_8cf_2aq4JFp5mWzG-yCkfNnjSPtOjge1YZTYGSc7ZWdw6OIzA/s320/PortfolioImg18.png" width="320" /><img border="0" data-original-height="825" data-original-width="1600" height="164" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5oOxy8L9J_R98zUZjJiYbYhIwnZfTenpGD8gucf7SLkx1wjbA_1uVJWxUKBWM3MxLUdI4vfp4yrqdDbkJp4yhcJN9ydzH855jwP7-zR_2Fb6wTxyfQ3MNhabO5SXejDzzU4hZsqiNXXc/s320/PortfolioImg19.png" width="320" /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
Nick Barberhttp://www.blogger.com/profile/09854363891328959129noreply@blogger.com0