Add project code
This commit is contained in:
28
objects/o_archer/Create_0.gml
Normal file
28
objects/o_archer/Create_0.gml
Normal file
@@ -0,0 +1,28 @@
|
||||
// Inherit the parent event
|
||||
event_inherited();
|
||||
|
||||
move_dir = 0;
|
||||
move_spd = 0;
|
||||
chase_spd = 0.5
|
||||
x_speed = 0;
|
||||
y_speed = 0;
|
||||
face = 1;
|
||||
|
||||
sprites[0] = s_archer_idle;
|
||||
sprites[1] = s_archer_walk;
|
||||
sprites[2] = s_archer_attack;
|
||||
sprites[3] = s_archer_hurt;
|
||||
sprites[4] = s_archer_death;
|
||||
|
||||
// State machine
|
||||
state = 0;
|
||||
shoot_timer = 0;
|
||||
charge_time = 30;
|
||||
recover_time = 60;
|
||||
cooldown_time = 5*60;
|
||||
bullet_inst = noone;
|
||||
has_started_shooting = false;
|
||||
|
||||
// Spawn
|
||||
fade_spd = 1/30;
|
||||
spawn_spd = .25;
|
||||
7
objects/o_archer/Destroy_0.gml
Normal file
7
objects/o_archer/Destroy_0.gml
Normal file
@@ -0,0 +1,7 @@
|
||||
if instance_exists(bullet_inst) && bullet_inst.state == 0 {
|
||||
bullet_inst.is_exploding = true;
|
||||
bullet_inst.sprite_index = s_arrow_destroy;
|
||||
bullet_inst.image_index = 0; // Reset animation
|
||||
bullet_inst.image_speed = 1; // Play explosion animation
|
||||
bullet_inst.bullet_spd = 0;
|
||||
}
|
||||
7
objects/o_archer/Draw_0.gml
Normal file
7
objects/o_archer/Draw_0.gml
Normal file
@@ -0,0 +1,7 @@
|
||||
draw_sprite_ext(sprite_index, image_index, x, y, face, image_yscale, image_angle, image_blend, image_alpha);
|
||||
|
||||
var _healh_pct = hp / max_hp;
|
||||
var _hp_img = _healh_pct * (sprite_get_number(s_enemy_health) - 1);
|
||||
if instance_exists(o_player) {
|
||||
draw_sprite_ext(s_enemy_health, _hp_img, x - 8, y - sprite_height / 2 - 5, image_xscale, image_yscale, image_angle, image_blend, image_alpha);
|
||||
}
|
||||
142
objects/o_archer/Step_0.gml
Normal file
142
objects/o_archer/Step_0.gml
Normal file
@@ -0,0 +1,142 @@
|
||||
// Pause
|
||||
if pause_movement() { exit; }
|
||||
|
||||
var _wall_collisions = true;
|
||||
var _get_damaged = true;
|
||||
|
||||
// State machine
|
||||
switch(state) {
|
||||
case -1:
|
||||
// Spawn from spawner
|
||||
if image_alpha < 1 {
|
||||
move_spd = 0;
|
||||
image_alpha += fade_spd;
|
||||
}
|
||||
_wall_collisions = false;
|
||||
_get_damaged = false;
|
||||
|
||||
if image_alpha >= 1 {
|
||||
move_spd = spawn_spd;
|
||||
if instance_exists(o_player) {
|
||||
move_dir = point_direction(x, y, o_player.x, o_player.y);
|
||||
}
|
||||
}
|
||||
|
||||
if !place_meeting(x, y, o_wall) {
|
||||
state = 0;
|
||||
}
|
||||
break;
|
||||
|
||||
case 0:
|
||||
if instance_exists(o_player) {
|
||||
move_dir = point_direction(x, y, o_player.x, o_player.y);
|
||||
}
|
||||
move_spd = chase_spd;
|
||||
|
||||
var _cam_left = camera_get_view_x(view_camera[0]);
|
||||
var _cam_right = _cam_left + camera_get_view_width(view_camera[0]);
|
||||
var _cam_top = camera_get_view_y(view_camera[0]);
|
||||
var _cam_bottom = _cam_top + camera_get_view_height(view_camera[0]);
|
||||
|
||||
|
||||
if bbox_right > _cam_left && bbox_left < _cam_right && bbox_bottom > _cam_top && bbox_top < _cam_bottom {
|
||||
shoot_timer++
|
||||
}
|
||||
|
||||
if shoot_timer > cooldown_time {
|
||||
state = 1;
|
||||
shoot_timer = 0;
|
||||
}
|
||||
break;
|
||||
|
||||
case 1:
|
||||
if instance_exists(o_player) {
|
||||
move_dir = point_direction(x, y, o_player.x, o_player.y);
|
||||
}
|
||||
move_spd = 0;
|
||||
|
||||
shoot_timer++;
|
||||
|
||||
if shoot_timer == 1 && hp > 0 {
|
||||
// Create arrow
|
||||
bullet_inst = instance_create_depth(x, y, depth, o_arrow);
|
||||
}
|
||||
|
||||
if shoot_timer == charge_time && instance_exists(bullet_inst) && hp > 0 {
|
||||
bullet_inst.image_angle = move_dir;
|
||||
bullet_inst.state = 1;
|
||||
}
|
||||
|
||||
if shoot_timer > charge_time + recover_time {
|
||||
state = 0;
|
||||
shoot_timer = 0;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
// Chasing
|
||||
#region
|
||||
|
||||
|
||||
x_speed = lengthdir_x(move_spd, move_dir);
|
||||
y_speed = lengthdir_y(move_spd, move_dir);
|
||||
|
||||
// Wall collisons
|
||||
if _wall_collisions == true {
|
||||
if place_meeting(x + x_speed, y, o_wall) {
|
||||
x_speed = 0;
|
||||
}
|
||||
if place_meeting(x, y + y_speed, o_wall) {
|
||||
y_speed = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if place_meeting(x + x_speed, y, o_parent_enemy) {
|
||||
x_speed = 0;
|
||||
}
|
||||
if place_meeting(x, y + y_speed, o_parent_enemy) {
|
||||
y_speed = 0;
|
||||
}
|
||||
|
||||
if (!is_stopping) {
|
||||
x += x_speed;
|
||||
y += y_speed;
|
||||
}
|
||||
|
||||
depth = -y;
|
||||
|
||||
#endregion
|
||||
|
||||
// Sprite controls
|
||||
#region
|
||||
// Check if the enemy is moving
|
||||
var is_moving = (x_speed != 0 || y_speed != 0);
|
||||
|
||||
// Update animation based on movement
|
||||
if state == 1 {
|
||||
sprite_index = sprites[2];
|
||||
} else if is_moving {
|
||||
sprite_index = sprites[1]; // Walking animation
|
||||
} else {
|
||||
sprite_index = sprites[0]; // Idle animation
|
||||
}
|
||||
|
||||
// Determine facing direction
|
||||
if x_speed != 0 {
|
||||
face = sign(x_speed);
|
||||
} else {
|
||||
if instance_exists(o_player) {
|
||||
var _player_offset_x = o_player.x - x;
|
||||
face = (_player_offset_x > 0) ? 1 : -1;
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
is_dying(sprites[4]);
|
||||
|
||||
// Inherit the parent event
|
||||
if _get_damaged {
|
||||
event_inherited();
|
||||
}
|
||||
|
||||
44
objects/o_archer/o_archer.yy
generated
Normal file
44
objects/o_archer/o_archer.yy
generated
Normal file
@@ -0,0 +1,44 @@
|
||||
{
|
||||
"$GMObject":"",
|
||||
"%Name":"o_archer",
|
||||
"eventList":[
|
||||
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":0,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
|
||||
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":3,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
|
||||
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":8,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
|
||||
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":1,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
|
||||
],
|
||||
"managed":true,
|
||||
"name":"o_archer",
|
||||
"overriddenProperties":[],
|
||||
"parent":{
|
||||
"name":"Enemies",
|
||||
"path":"folders/Enemies.yy",
|
||||
},
|
||||
"parentObjectId":{
|
||||
"name":"o_parent_enemy",
|
||||
"path":"objects/o_parent_enemy/o_parent_enemy.yy",
|
||||
},
|
||||
"persistent":false,
|
||||
"physicsAngularDamping":0.1,
|
||||
"physicsDensity":0.5,
|
||||
"physicsFriction":0.2,
|
||||
"physicsGroup":1,
|
||||
"physicsKinematic":false,
|
||||
"physicsLinearDamping":0.1,
|
||||
"physicsObject":false,
|
||||
"physicsRestitution":0.1,
|
||||
"physicsSensor":false,
|
||||
"physicsShape":1,
|
||||
"physicsShapePoints":[],
|
||||
"physicsStartAwake":true,
|
||||
"properties":[],
|
||||
"resourceType":"GMObject",
|
||||
"resourceVersion":"2.0",
|
||||
"solid":false,
|
||||
"spriteId":{
|
||||
"name":"s_archer_idle",
|
||||
"path":"sprites/s_archer_idle/s_archer_idle.yy",
|
||||
},
|
||||
"spriteMaskId":null,
|
||||
"visible":true,
|
||||
}
|
||||
Reference in New Issue
Block a user