Trusted By Industry Leaders

πŸ”₯ Coming Soon

Build a Complete Shoot 'Em Up Game

Learn game dev with theory-driven tutorials. Build a portfolio-ready SHMUP that actually feels fun to play, not just a basic implementation that "works".

SHMUP Course Preview

What You'll Build

  • βœ“ Complete game from menu to game over
  • βœ“ Smooth player controls & collision systems
  • βœ“ Enemy AI with multiple behavior patterns
  • βœ“ Power-ups, weapons & upgrade systems
  • βœ“ Epic boss battles with attack phases
47K+ YouTube Subscribers
2.1M+ Video Views
95% Positive Reviews
150+ Videos Published
Ziimple Profile

Hi, I'm Rob

I've been in the games industry for over 10 years, working with Epic and Microsoft on everything from mobile to VR/AR. My mission: help you build portfolio-ready games that actually feel fun to play, not just "work".

Too many tutorials teach basic implementations that feel lackluster. I focus on game design theory and quality code that takes your projects from beginner exercises to something you're actually proud of.

Recent Updates

New Project
SkyPop SHMUP Template
Recently
Course Preview
SHMUP Mastery Course Landing Page
This Month
Game Release
Patreon Paradise Interactive Experience
Live Now
Achievement
Lamp Lighter - Epic Mega Jam Winner
2023
// ========================================== // EASY CONTENT MANAGEMENT - UPDATE HERE MONTHLY // ========================================== const carouselSlides = [ // Slide 1 - FEATURED: SHMUP Course (YOUR PRIORITY) { badge: { icon: "πŸ”₯", text: "Coming Soon", type: "primary" }, title: "Build a Complete SHMUP Game
in UE5", description: "Learn game dev with theory-driven tutorials. Build a portfolio-ready SHMUP that feels fun to play, not just a basic implementation.", primaryCTA: { text: "Get Early Access", link: "pages/shmup-landing.html" }, secondaryCTA: { text: "See Projects", link: "pages/projects.html" }, mediaIcon: "πŸš€", mediaImage: "assets/images/projects/SHMUP_Course.jpg", alt: "SHMUP Course Preview" }, // Slide 2 - SkyPop SHMUP Template { badge: { icon: "πŸ“¦", text: "Patreon Source", type: "secondary" }, title: "SkyPop SHMUP Template
Complete UE5 Project", description: "A bite-sized SHMUP built as both a playable game and learning resource. Full source access with blueprints, assets, and structureβ€”yours to study and rebuild. (Source exclusive to Patreon supporters)", primaryCTA: { text: "Join on Patreon", link: "#patreon-placeholder" }, secondaryCTA: { text: "Play Free Demo", link: "#itchio-placeholder" }, mediaIcon: "πŸš€", mediaImage: "assets/images/projects/SkyPop.jpg", mediaImageLink: "https://ziimple.itch.io/sky-pop", alt: "SkyPop SHMUP Template - Complete UE5 source project" }, // Slide 3 - Patreon Paradise Project { badge: { icon: "✨", text: "Now Live", type: "secondary" }, title: "Patreon Paradise
Living Thank-You World", description: "Not quite a game, not just a toy. A playable UE5 experiment where supporters become avatars in an ever-expanding world featured in every tutorial.", primaryCTA: { text: "Join on Patreon", link: "#patreon-placeholder" }, secondaryCTA: { text: "Play Experience", link: "#itchio-placeholder" }, mediaIcon: "🌴", mediaImage: "assets/images/projects/PatreonParadise.jpg", mediaImageLink: "https://ziimple.itch.io/patreon-garden", alt: "Patreon Paradise - Living supporter world" } // TO ADD NEW SLIDES: Copy the structure above and modify the content // The first slide gets the most visibility - keep SHMUP course there until launch ]; // ========================================== // CAROUSEL SYSTEM - DON'T MODIFY BELOW // ========================================== let currentSlide = 0; let slides = []; let indicators = []; // Generate carousel HTML from data function generateCarousel() { const container = document.getElementById('carousel-container'); // Generate slides HTML const slidesHTML = carouselSlides.map((slide, index) => { const activeClass = index === 0 ? 'active' : ''; let mediaContent; if (slide.mediaImage) { if (slide.mediaImageLink) { mediaContent = `${slide.alt}`; } else { mediaContent = `${slide.alt}`; } } else { mediaContent = ``; } return ` `; }).join(''); // Generate indicators HTML const indicatorsHTML = carouselSlides.map((_, index) => { const activeClass = index === 0 ? 'active' : ''; return ``; }).join(''); // Insert HTML into container container.innerHTML = slidesHTML; // Add indicators after the container const indicatorsContainer = document.createElement('div'); indicatorsContainer.className = 'carousel-indicators'; indicatorsContainer.innerHTML = indicatorsHTML; container.parentElement.appendChild(indicatorsContainer); // Update global references slides = document.querySelectorAll('.carousel-slide'); indicators = document.querySelectorAll('.carousel-indicator'); } function showSlide(index) { // Remove active class from all slides and indicators slides.forEach(slide => slide.classList.remove('active')); indicators.forEach(indicator => indicator.classList.remove('active')); // Add active class to current slide and indicator slides[index].classList.add('active'); indicators[index].classList.add('active'); currentSlide = index; // Track carousel interaction const slideTitle = carouselSlides[index]?.title?.replace(/<[^>]*>/g, '') || `Slide ${index + 1}`; if (typeof trackCarouselInteraction === 'function') { trackCarouselInteraction(index, slideTitle, 'view'); } } function changeSlide(direction) { currentSlide += direction; // Wrap around if (currentSlide >= slides.length) { currentSlide = 0; } else if (currentSlide < 0) { currentSlide = slides.length - 1; } showSlide(currentSlide); } // Auto-advance carousel every 12 seconds (slower for readability) setInterval(() => { changeSlide(1); }, 12000); // Pause auto-advance on hover const carousel = document.querySelector('.hero-carousel'); let autoAdvance = true; carousel.addEventListener('mouseenter', () => { autoAdvance = false; }); carousel.addEventListener('mouseleave', () => { autoAdvance = true; }); // Keyboard navigation document.addEventListener('keydown', (e) => { if (e.key === 'ArrowLeft') { changeSlide(-1); } else if (e.key === 'ArrowRight') { changeSlide(1); } }); // Sticky nav with glassmorphism effect is now handled by nav.js // Intersection Observer for animations const observerOptions = { threshold: 0.1, rootMargin: '0px 0px -50px 0px' }; const observer = new IntersectionObserver((entries) => { entries.forEach(entry => { if (entry.isIntersecting) { entry.target.style.animationPlayState = 'running'; } }); }, observerOptions); // Initialize everything when DOM is loaded document.addEventListener('DOMContentLoaded', () => { // Generate carousel from data generateCarousel(); // Replace placeholder URLs with actual GlobalLinks if (window.GlobalLinks) { // Update JSON-LD schema URLs const jsonLdScript = document.querySelector('script[type="application/ld+json"]'); if (jsonLdScript) { let jsonContent = jsonLdScript.textContent; jsonContent = jsonContent.replace('#youtube-placeholder', window.GlobalLinks.youtube); jsonContent = jsonContent.replace('#patreon-placeholder', window.GlobalLinks.patreon); jsonLdScript.textContent = jsonContent; } // Update carousel placeholder URLs document.querySelectorAll('a[href="#patreon-placeholder"]').forEach(link => { link.href = window.GlobalLinks.patreon; }); document.querySelectorAll('a[href="#itchio-placeholder"]').forEach(link => { link.href = window.GlobalLinks.itchio; }); // Update social media links const youtubeSocial = document.querySelector('a.social-link.youtube'); if (youtubeSocial) youtubeSocial.href = window.GlobalLinks.youtube; const patreonSocial = document.getElementById('patreon-social'); if (patreonSocial) patreonSocial.href = window.GlobalLinks.patreon; const discordSocial = document.querySelector('a.social-link.discord'); if (discordSocial) discordSocial.href = window.GlobalLinks.discord; const twitterSocial = document.querySelector('a.social-link.twitter'); if (twitterSocial) twitterSocial.href = window.GlobalLinks.twitter; const blueskySocial = document.querySelector('a.social-link.bluesky'); if (blueskySocial) blueskySocial.href = window.GlobalLinks.bluesky; const twitchSocial = document.querySelector('a.social-link.twitch'); if (twitchSocial) twitchSocial.href = window.GlobalLinks.twitch; const instagramSocial = document.querySelector('a.social-link.instagram'); if (instagramSocial) instagramSocial.href = window.GlobalLinks.instagram; const itchioSocial = document.querySelector('a.social-link.itch'); if (itchioSocial) itchioSocial.href = window.GlobalLinks.itchio; } // Set up animations document.querySelectorAll('.fade-in').forEach(el => { el.style.animationPlayState = 'paused'; observer.observe(el); }); }); // Floating navigation is now handled by centralized nav.js system