PixelChipCode

Warp drive style animation in GameMaker

Oct 17th, 2024
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
JavaScript 5.57 KB | Source Code | 0 0
  1. //Warp drive style animation by oliver @pixelchipcode
  2. // Create Event
  3. num_boxes = 300
  4. boxes = array_create(num_boxes);
  5. for (var i = 0; i < num_boxes; i++) {
  6.     boxes[i] = {
  7.         x3d: random_range(-1000, 1000),
  8.         y3d: random_range(-1000, 1000),
  9.         z3d: random_range(500, 5000),
  10.         size3d: random_range(20, 100)
  11.     };
  12. }
  13. screen_center_x = room_width / 2;
  14. screen_center_y = room_height / 2;
  15. scale_factor = 10
  16. vanishing_point_y = room_height * 0.55; // Slightly below center
  17. min_z = 10; // Reduced minimum Z distance
  18.  
  19. current_value = 3;
  20. target_value = 100;
  21. ease_duration = 60; // duration in steps
  22. ease_time = 0;
  23. is_easing = false;
  24. shake_magnitude = 1.5; // The magnitude of the position shake
  25. angle_magnitude = 0.005; // The magnitude of the angle shake (very subtle)
  26. shake_x = 0; // To store shake offsets
  27. shake_y = 0; // To store shake offsets
  28. shake_angle = 0; // To store the angle shake
  29.  
  30. // Camera-related variables
  31. camera = view_camera[0];
  32. // Get the current camera
  33. original_cam_x = camera_get_view_x(camera); // Store original camera X position
  34. original_cam_y = camera_get_view_y(camera); // Store original camera Y position
  35. original_cam_angle = 0; // Store original camera angle (no rotation) (no rotation)m_y = camera_get_view_y(camera); // Store original camera Y position
  36.  
  37. // EaseInQuad function
  38. function EaseInQuad(time, start, dest, duration) {
  39.     time /= duration;
  40.     return dest * time * time + start;
  41. }
  42.  
  43. // Step Event
  44. scale_factor = current_value
  45.  
  46. for (var i = 0; i < num_boxes; i++) {
  47.     boxes[i].z3d -= 10;
  48.     if (boxes[i].z3d <= min_z) {
  49.         boxes[i].z3d = random_range(4000, 5000);
  50.         boxes[i].x3d = random_range(-1000, 1000);
  51.         boxes[i].y3d = random_range(-1000, 1000);
  52.         boxes[i].size3d = random_range(20, 100);
  53.     }
  54.    
  55.     // Limit box size based on distance
  56.     var max_size = boxes[i].z3d / 5; // Adjusted for larger boxes when close
  57.     boxes[i].size3d = min(boxes[i].size3d, max_size);
  58. }
  59.  
  60. // Sort boxes by z-depth (descending order)
  61. array_sort(boxes, function(a, b) {
  62.     return b.z3d - a.z3d;
  63. });
  64.  
  65.  
  66. if (keyboard_check_pressed(vk_space)) {
  67.     if (current_value == 3) {
  68.         target_value = 100;
  69.     } else {
  70.         target_value = 3;
  71.     }
  72.     ease_time = 0;
  73.     is_easing = true;
  74. }
  75.  
  76. if (is_easing) {
  77.     ease_time += 1;
  78.  
  79.     if (ease_time >= ease_duration) {
  80.         ease_time = ease_duration;
  81.         is_easing = false;
  82.     }
  83.  
  84.     // Apply the EaseInQuad function
  85.     current_value = EaseInQuad(ease_time, current_value, target_value - current_value, ease_duration);
  86. }
  87.  
  88. // Check if the value is around 10 or less and apply subtle camera shake
  89. if (current_value <= 10) {
  90.     // Random position shake
  91.     shake_x = random_range(-shake_magnitude, shake_magnitude);
  92.     shake_y = random_range(-shake_magnitude, shake_magnitude);
  93.  
  94.     // Random angle shake (very subtle)
  95.     shake_angle = random_range(-angle_magnitude, angle_magnitude);
  96.  
  97.     // Apply the shake to the camera's position
  98.     camera_set_view_pos(camera, original_cam_x + shake_x, original_cam_y + shake_y);
  99.  
  100.     // Apply the shake to the camera's angle (keeping it very subtle)
  101.     camera_set_view_angle(camera, original_cam_angle + radtodeg(shake_angle)); // Apply angle in degrees
  102. } else {
  103.     // Reset camera position and angle when not shaking
  104.     camera_set_view_pos(camera, original_cam_x, original_cam_y);
  105.     camera_set_view_angle(camera, original_cam_angle);
  106. }
  107.  
  108. // Draw Event
  109. draw_set_color(c_white);
  110. gpu_set_blendmode(bm_add);
  111. for (var i = 0; i < num_boxes; i++) {
  112.     var box = boxes[i];
  113.    
  114.     // Skip boxes that are too far
  115.     if (box.z3d > 5000) continue;
  116.    
  117.     var half_size = box.size3d / 2;
  118.     var vertices_3d = [
  119.         [box.x3d - half_size, box.y3d - half_size, box.z3d - half_size],
  120.         [box.x3d + half_size, box.y3d - half_size, box.z3d - half_size],
  121.         [box.x3d + half_size, box.y3d + half_size, box.z3d - half_size],
  122.         [box.x3d - half_size, box.y3d + half_size, box.z3d - half_size],
  123.         [box.x3d - half_size, box.y3d - half_size, box.z3d + half_size],
  124.         [box.x3d + half_size, box.y3d - half_size, box.z3d + half_size],
  125.         [box.x3d + half_size, box.y3d + half_size, box.z3d + half_size],
  126.         [box.x3d - half_size, box.y3d + half_size, box.z3d + half_size]
  127.     ];
  128.    
  129.     var vertices_2d = [];
  130.     var is_visible = true;
  131.     for (var j = 0; j < 8; j++) {
  132.         var vx = vertices_3d[j][0];
  133.         var vy = vertices_3d[j][1];
  134.         var vz = max(vertices_3d[j][2], min_z); // Prevent division by zero
  135.        
  136.         var screen_x = (vx / vz) * scale_factor + screen_center_x;
  137.         var screen_y = (vy / vz) * scale_factor + vanishing_point_y;
  138.        
  139.         vertices_2d[j] = [screen_x, screen_y];
  140.     }
  141.    
  142.     // Calculate alpha based on distance and position
  143.     var dist_factor = clamp((box.z3d - min_z) / (5000 - min_z), 0, 1);
  144.     var edge_factor = min(
  145.         abs(screen_center_x - vertices_2d[0][0]) / screen_center_x,
  146.         abs(screen_center_y - vertices_2d[0][1]) / screen_center_y
  147.     );
  148.     var alpha = 1 - (dist_factor * 0.7 + edge_factor * 0.3);
  149.     draw_set_alpha(alpha);
  150.    
  151.     // Draw the box
  152.     for (var j = 0; j < 4; j++) {
  153.         draw_line(vertices_2d[j][0], vertices_2d[j][1], vertices_2d[(j+1) % 4][0], vertices_2d[(j+1) % 4][1]);
  154.         draw_line(vertices_2d[j+4][0], vertices_2d[j+4][1], vertices_2d[4 + ((j+1) % 4)][0], vertices_2d[4 + ((j+1) % 4)][1]);
  155.         draw_line(vertices_2d[j][0], vertices_2d[j][1], vertices_2d[j+4][0], vertices_2d[j+4][1]);
  156.     }
  157. }
  158. draw_set_alpha(1);
  159. gpu_set_blendmode(bm_normal)
Tags: gml gameMaker
Advertisement
Add Comment
Please, Sign In to add comment