Войти
ПрограммированиеФорумФизика

Game Maker Studio 2 (нужна небольшая помощь)

Страницы: 1 2 Следующая »
#0
(Правка: 21:26) 21:25, 30 апр. 2019

Взялся учить её по урокам.

Готовая часть:

Step:
var right_move = (keyboard_check(vk_right) || keyboard_check(ord("D")));
var left_move = (keyboard_check(vk_left) ||  keyboard_check(ord("A")));
var up_move = (keyboard_check(vk_up) ||  keyboard_check(ord("W")));
var down_move = (keyboard_check(vk_down) ||  keyboard_check(ord("S")));

if (right_move) {
  phy_position_x += speed_player;
  sprite_index = Sprite_Right;
  image_speed = 4;
}

if (left_move) {
  phy_position_x -= speed_player;
  sprite_index = Sprite_Left;
  image_speed = 4;
}

if (up_move) {
  phy_position_y -= speed_player;
  sprite_index = Sprite_Up;
  image_speed = 4;
}

if (down_move) {
  phy_position_y += speed_player;
  sprite_index = Sprite_Down;
  image_speed = 4;
}

if (!right_move and !left_move and !up_move and !down_move) {
  image_speed = 1;
  image_index = 0;
}

Застрял на желании добавить анимированные спрайты в состоянии покоя для каждой стороны.
Понял только, что нужно что-то писать в End Step (Execute Code).


#1
(Правка: 1:40) 1:39, 1 мая 2019

Нет возможности затестить то, что я сейчас напишу. Надеюсь, разберёшься.
Вобщем, при нажатии стрелок нужно запоминать направление, в котором двигался персонаж. Например, будет переменная dir, которую нужно завести при создании объекта
Step:
var right_move = (keyboard_check(vk_right) || keyboard_check(ord("D")));
var left_move = (keyboard_check(vk_left) ||  keyboard_check(ord("A")));
var up_move = (keyboard_check(vk_up) ||  keyboard_check(ord("W")));
var down_move = (keyboard_check(vk_down) ||  keyboard_check(ord("S")));

if (right_move) {
  phy_position_x += speed_player;
  sprite_index = Sprite_Right;
  image_speed = 4;
  dir = "right";
}

if (left_move) {
  phy_position_x -= speed_player;
  sprite_index = Sprite_Left;
  image_speed = 4;
  dir = "left";
}

if (up_move) {
  phy_position_y -= speed_player;
  sprite_index = Sprite_Up;
  image_speed = 4;
  dir = "up";
}

if (down_move) {
  phy_position_y += speed_player;
  sprite_index = Sprite_Down;
  image_speed = 4;
  dir = "down";
}

if (!right_move and !left_move and !up_move and !down_move) {
  if (dir == "right") {
    sprite_index = Sprite_Stay_Right;
    image_speed = 4;
  }

  if (dir == "left") {
    sprite_index = Sprite_Stay_Left;
    image_speed = 4;
  }

  if (dir == "up") {
    sprite_index = Sprite_Stay_Up;
    image_speed = 4;
  }

  if (dir == "down") {
    sprite_index = Sprite_Stay_Down;
    image_speed = 4;
  }
}

#2
(Правка: 3:14) 2:35, 1 мая 2019

Спасибо за помощь!

Такая ошибка:

Variable Player.dir(100003, -2147483648) not set before reading it.
at gml_Object_Player_Step_0 (line 39) -  if (dir == "right") {

Вторые сутки не сплю, завтра уже буду смотреть.

var dir = (direction); дописал - перестало вырубать но и работать - анимации работают на постоянку, я пока до использования переменных не дошел.

#3
(Правка: 9:08) 9:07, 1 мая 2019

> анимации работают на постоянку.
В первопосте написано, что нужны анимации для состояния покоя. То есть, если всё правильно, то анимация будет всегда, когда персонаж идет будет анимация передвижения (спрайты Sprite_Right, Sprite_Left, Sprite_Up и Sprite_Down), когда персонаж стоит будет анимация бездействия (спрайты Sprite_Stay_Right, Sprite_Stay_Left, Sprite_Stay_Up, Sprite_Stay_Down)

Вот это надо в событии Create сделать:
var dir = "down";

Вот это убрать оттуда, где оно сейчас стоит:
var dir = (direction);

Насколько помню, direction - это значение в градусах. Если dir нужно в градусах, тогда надо все "left", "right" и т. д. в моём коде заменить на числа 0, 90, 180 и 270. 0 - это лево, 90 - верх и далее против часовой стрелки, но может оно и не так, надо проверять.

#4
10:43, 1 мая 2019

Да, все работает!

#5
15:17, 2 мая 2019

Закончил с гайдами, но возник один баг:

Когда я атакую монстра, он отлетает и получает урон, я урон не получаю от своей атаки, как и монстр от своей атаки.
Однако, когда монстр должен меня бить и я должен отлетать, вылетает ошибка:

FATAL ERROR in
action number 1
of  Step Eventobj_player
for object obj_enemy:

Variable obj_enemy.stop_atack(100015, -2147483648) not set before reading it.
 at gml_Object_obj_enemy_Collision_87118a30_6fd9_4892_b183_2bdb9e078a83 (line 5) - if (!stop_atack) {
############################################################################################
--------------------------------------------------------------------------------------------
#6
17:59, 2 мая 2019

У тебя выше была такая же ошибка с переменной dir объекта Player. Проблему решили создав переменную dir в событии Create объекта Player.

Когда вылезают ошибки, попробуй понять, что написано в тексте ошибки.
Если плохо с английским, то поможет translate.google.com (это временно, на 10-й раз ты запомнишь, что значат те или иные непонятные слова)

+ Показать

Если всё-равно не понятно, то можно взять текст, который не зависит от имён объектов и загуглить. В твоём случае это текст "Variable not set before reading it"

Предлагаю овладеть навыками гугления и разбора ошибок, так как после гайдов придётся много разбираться самому.

#7
0:17, 7 мая 2019

это чего платформер пишите или раннер?

#8
(Правка: 9 мая 2019, 8:03) 1:18, 7 мая 2019

ApuoH
Пока только учусь.
Методы движения, анимации.

#9
(Правка: 18:12) 18:12, 12 мая 2019

Добавил динамические тени, но возникло несколько проблем:
Draw:

if(!surface_exists(shadowSurface)){
  shadowSurface = surface_create(384, 216);
}

var viewX = camera_get_view_x(view_camera[0]);
var viewY = camera_get_view_y(view_camera[0]);

surface_set_target(shadowSurface);
draw_clear_alpha(c_black,0);

var sx = skewX;
var sy = shadowHeight;

gpu_set_fog(true, c_black, 0, 1);
with(obj_parent){

draw_sprite_pos(sprite_index, image_index, 
    x-(sprite_width/2)-viewX-sx,
    y-viewY-sy, 
    x+(sprite_width/2)-viewX-sx, 
    y-viewY-sy, 
    x+(sprite_width/2)-viewX, 
    y-viewY, 
    x-(sprite_width/2)-viewX, 
    y-viewY, 
    1);
}

gpu_set_fog(false, c_white, 0, 0);

surface_reset_target();

draw_set_alpha(0.5);
draw_surface(shadowSurface, viewX, viewY);
draw_set_alpha(1);

Create:

shadowSurface = surface_create(320, 180);
skewX = 12;
shadowHeight = 40;

Собственно проблемы:
1) Тени отрисовываются над тайлом пола даже через стены, как прописать затирание или блок отрисовки через стены?
2) Края теней привязаны, поэтому, если у объекта подвижная верхняя часть, то у тени вместо неё дёргается вся тень по области отрисовки.

#10
21:00, 16 мая 2019

Тут живые есть вообще?

#11
7:23, 17 мая 2019
Я регулярно захожу. Про тени ничего не знаю.
#12
14:55, 17 мая 2019

нужно изображение. про тени не знаю, могут ли тени проходить через альфу?

#13
0:59, 18 мая 2019

#14
17:55, 19 мая 2019

Похоже это настолько сложно, что никто не способен решить.

Страницы: 1 2 Следующая »
ПрограммированиеФорумФизика