asteroids | gml
Type | Desc | |
---|---|---|
lengthdir_x(how_far, in_direction_angle) | function | finds the distance straight 'across' to a point that is diagonally away |
lengthdir_y(how_far, in_direction_angle) | function | finds the distance straight 'up' to a point that is diagonally away |
move_wrap(horizontal?, vertical?, margin) | function | 'wraps' an instance around the room borders |
motion_add(direction, speed) | function | just like motion_set but this function is cumulative (it will add or subtract from previous direction / speed) |
point_in_rectangle(pointX, pointY, ... rectangle coords which are x1,y1,x2,y2 ...) | function | checks if a point is in a rectangle |
Sprite | Images |
---|---|
sprExplosion |
Download sprExplosion images here: asteroids-sprExplosion.zip |
sprSpaceShip | |
sprRock | |
sprLazer |
Set all sprite origins to Middle-centre. You may have to adjust the collision mask on the rock to be smaller.
Object | Sprite | Properties |
---|---|---|
objSpaceShip | sprSpaceShip | Visible |
objRock | sprRock | Visible |
objLazer | sprLazer | Visible |
objRock Create
randomize(); image_speed = 0; motion_set(random(360), irandom_range(1,3));
objRock Step
move_wrap(true, true, 0); //if rock has hit a lazer, start playing the animation: if place_meeting(x,y,objLazer){ image_speed = 1; } //once the rock animation is complete: if (image_index == sprite_get_number(sprRock) - 1) { instance_destroy(); }
objSpaceShip Step
max_speed = 10; accel_units = 0.4; switch (keyboard_key) { //rotate left or right, but dont change direction yet case vk_left: image_angle += 7; break; case vk_right: image_angle -= 7; break; case vk_up: //accumulate speed the way we are facing: motion_add(image_angle, +accel_units) //speed limiter: if (speed > max_speed) speed = max_speed; break; case vk_space: //lengthdir_x is width from origin to nose of ship: xx = x+lengthdir_x(sprite_width/2, image_angle); //lengthdir_y is height from origin to nose of ship: yy = y+lengthdir_y(sprite_height/2, image_angle); //spawn lazer at nose of ship: lazer = instance_create_depth(xx,yy,0,objLazer); lazer.image_angle = image_angle; lazer.direction = image_angle; lazer.speed = 10; break; } //wrap around room: move_wrap(true, true, 0); //if collide with asteroid we explode: if place_meeting(x,y,objRock) { sprite_index = sprExplosion; } //if we are exploding, AND the explosion is complete: if (image_index == sprite_get_number(sprExplosion) - 1) and (sprite_index == sprExplosion) { instance_destroy(); }
objLazer Step
//if lazer collides with rock: if place_meeting(x,y,objRock) { instance_destroy(); } //if lazer outside room: if (!point_in_rectangle(x, y, 0, 0, room_width, room_height)) { instance_destroy(); }
Add:
- score
- time
- lives
- health