Skocz do zawartości

Utrata energii i utrata życia bohatera,kiedy skoczy z wysokiej odległości


Cygnus

Rekomendowane odpowiedzi

Witam wszystkich.

 

Myślę jak zrobić żeby bohater w momencie jak zeskakuje z dość dużej odległości,to odejmie mu energię,a jak jest już naprawdę wysoko to odejmie mu jedno życie.

 

w Create bohatera mam tak:

 

GML
//////////////////////////////

///////ZMIENNE STALE//////////

/////////////////////////////

///Ustawienia

event_inherited();

hp = 100;

maxHp = 100;

attClock = 0;

curAttack = 0;

hurtClock = 0;

swimDir = 0;

drawAngle = 0;

jumpStr = 0;

jumpTimes = 0;

climbing = false;

 

//Moce specjalne

pwrupSpd = 0;

pwrupStr = 0;

pwrupJmp = 0;

//Pozycja odrodzenia Bohatera i skrypt widoku centralnego

spawnX = x;

spawnY = y;

centerViewOnMe();

 

//zachowanie pozycji gracza przy checkpointach

if (global.checkpointR == room)

{

x = global.checkpointx;

y = global.checkpointy;

}

start_x = x;

start_y = y;

 

Game Maker Studio Pro posiadam.

Odnośnik do komentarza
Udostępnij na innych stronach

Myślę że jak wykryje że spada to na początku zapisać początkową wysokość bohatera, potem gdy już będzie na ziemi to zapisać do drugiej zmiennej końcową wysokość bohatera. Potem odjąć drugą zmienną od pierwszej i z tą różnicą działać.

GML
if(roznica > coś){

energia-=1;

}else if(roznica > większe coś){

zycie-=1;

}

Myślę że wszystko jasno wytłumaczyłem.

Odnośnik do komentarza
Udostępnij na innych stronach

A,więc zrobiłem tak w stepie bohatera swojego dałem tak:

 

 

GML
if(100 > 70){

hp -=1;

}else if(100 > 90){

global.life -=1;

}

 

 

Coś robie nie tak,bo jak włącze teraz gre,to nawet nie skacząc energia mi od razu ucieka i zaraz ginę,a ma być tak,że jak skoczę z danej wysokości,to zabierze mi energie ileś tam procent tej energi,a jak za wysoko skoczę,to od razu życie mi odejmie...

Odnośnik do komentarza
Udostępnij na innych stronach

A,więc zrobiłem tak w stepie bohatera swojego dałem tak:

 

 

GMLif(100 > 70){

hp -=1;

}else if(100 > 90){

global.life -=1;

}

 

 

Coś robie nie tak,bo jak włącze teraz gre,to nawet nie skacząc energia mi od razu ucieka i zaraz ginę,a ma być tak,że jak skoczę z danej wysokości,to zabierze mi energie ileś tam procent tej energi,a jak za wysoko skoczę,to od razu życie mi odejmie...

 

100 jest zawsze większe od 70 i 90. zamiast 100 wstawiasz jakąś zmienną a nie liczbę :D Chyba od niedawna używasz GMa, mam rację? :D

Odnośnik do komentarza
Udostępnij na innych stronach

Mateusz,a nie jest to zmienna liczbowa? kurcze..to jakiej użyć? bo się pogubiłem,ja z doskoku działam w GMS dobrze,że mój człowiek nie długo wraca;)Tak to jest jak grafik zajmuje się programowaniem,coś tam wychodzi ,ale zawodowcem nie jestem;)

Odnośnik do komentarza
Udostępnij na innych stronach

Mateusz,a nie jest to zmienna liczbowa? kurcze..to jakiej użyć? bo się pogubiłem,ja z doskoku działam w GMS dobrze,że mój człowiek nie długo wraca;)Tak to jest jak grafik zajmuje się programowaniem,coś tam wychodzi ,ale zawodowcem nie jestem;)

Zmienna liczbowa a liczba to nie to samo. roznica to miała być zmienna liczbowa.

 

Ja też zawodowcem nie jestem. Proste operacje na zmiennych to podstawa. Jak nie masz takich podstaw ogarniętych to za co ty się bierzesz. https://gmclan.org/index.php?wiki tutaj masz link do dokumentacji.

Odnośnik do komentarza
Udostępnij na innych stronach

Zrobiłem tak w stepie gracza dałem

 

GML
if(vspeed > 70){

hp -=1;

}else if(vspeed > 90){

global.life -=1;

}

 

 

No niestety nic to nie daje:/ nic się nie dzieje...bohater skacze z dużej odległości i nic mu nie jest energia się nie zmniejsza ani życie...

Odnośnik do komentarza
Udostępnij na innych stronach

wszystkie moje obiekty,żeby nie ustawiać wszędzie solidów na platformach są parent z obj_wall

 

no i teraz tam dałem w tym obj_wall co dziedziczy z wszystkimi platformami solidy w kolizji z obj_gracz

 

GML
if(vspeed > 2){

global.life -=1;

}

else

if(vspeed > 1){

hp -=1;

}

też nic to nie daje nadal bohater sobie skaczę i nie traci życia,ani energii..

Odnośnik do komentarza
Udostępnij na innych stronach

  • Filar Społeczności
A,więc zrobiłem tak w stepie bohatera swojego dałem tak:

 

 

GML
if(100 > 70){

hp -=1;

}else if(100 > 90){

global.life -=1;

}

 

 

Coś robie nie tak,bo jak włącze teraz gre,to nawet nie skacząc energia mi od razu ucieka i zaraz ginę,a ma być tak,że jak skoczę z danej wysokości,to zabierze mi energie ileś tam procent tej energi,a jak za wysoko skoczę,to od razu życie mi odejmie...

 

skwaśniałem ostro xDD

Odnośnik do komentarza
Udostępnij na innych stronach

Nie w step tylko w kolizji z tym obiektem (ale w obiekcie gracza).

I wtedy usuń wszystkie wystąpienia

GML
other.

Dokładnie to tak:

1.Klikasz na obiekt gracza;

2.Klikasz add event->collision with (i tu ten obiekt co z nim kolizja)

3.Wklejasz

GML
if(vspeed > 2){

global.life -=1;

}

else

if(vspeed > 1){

hp -=1;

}

Odnośnik do komentarza
Udostępnij na innych stronach

Zrobiłem tak jak napisałeś kt1117 nic to nie daje...:/

 

wszystkie moje obiekty,po których chodzą dziedziczą z obj_wall ,bo tam mam ustawiony solid dla wszystkich tych platform,po których bohater chodzi..ustawiłem tak jak napisałeś nic to nie daje..próbuje z tym walczyć no i nic nie wychodzi...

Odnośnik do komentarza
Udostępnij na innych stronach

a,więc tak tu kod mojego bohatera

 

STEP

 

GML
//Poruszające sie tlo za bohaterem gora dol

background_x[0] = view_xview[view_current]*1.00;

background_y[0] = view_yview[view_current]*0.8;

 

///Sterowanie

if !place_meeting(x,y,obj_water) {

//Ruch normalny

if climbing == false {

if keyboard_check_pressed(kJump) && inAir == false {

vspd = -10-sign(pwrupJmp*3);

jumpStr = 3;

//Schodzenie

if keyboard_check(kDown) && place_meeting(x,y+1,par_solid_ghost) {

y += 4;

vspd = 0;

jumpStr = 0;

jumpTimes = 0;

}

} else if keyboard_check(kJump) && jumpStr > 0 {

vspd -= 2+sign(pwrupJmp);

jumpStr--;

} else {

if keyboard_check_released(kJump) && jumpStr > 2 {

vspd += 2+sign(pwrupJmp);

}

jumpStr = 0;

}

if jumpTimes > 0 && keyboard_check_pressed(kJump) && inAir == true {

vspd = -10-sign(pwrupJmp*3);

jumpStr = 0;

jumpTimes--;

}

 

if keyboard_check(kAction) && attClock == false {

if keyboard_check(kDown) {

attClock = 12;

curAttack = 1;

with instance_create(x,y-16,obj_projectile) {

hspd = other.image_xscale*10;

vspd = -4;

g = .2;

owner = par_player;

strength = 0;

explode = true;

explosionRadius = 30;

explosionStrength = 2+(sign(other.pwrupStr)*8);

image_blend = c_lime;

}

} else {

attClock = 18;

curAttack = 0;

with instance_create(x,y,par_attack) {

sprite_index = mask_player_attack;

image_xscale = other.image_xscale;

owner = par_player;

strength = 1+(sign(other.pwrupStr)*4);

}

}

}

if keyboard_check(kRight) && !keyboard_check(kLeft) {

if hspd < 10+(sign(pwrupSpd)*5) {

hspd = min(hspd+(2+(sign(pwrupSpd)*2))*multiF,10+(sign(pwrupSpd)*5));

}

image_xscale = 1;

}

if keyboard_check(kLeft) && !keyboard_check(kRight) {

if hspd > -10-(sign(pwrupSpd)*5) {

hspd = max(hspd-(2+(sign(pwrupSpd)*2))*multiF,-10-(sign(pwrupSpd)*5));

}

image_xscale = -1;

}

//Wspinanie

if place_meeting(x,y,par_climbable) && place_meeting(x,y-32,par_climbable) && place_meeting(x,y+32,par_climbable) && attClock <= 0 && (keyboard_check(kUp) || keyboard_check(kDown)) {

climbing = true;

vspd = 0;

hspd = 0;

}

}

//Wspinaczka

if climbing == true {

var __hsign = keyboard_check(vk_right)-keyboard_check(vk_left);

var __vsign = keyboard_check(vk_down)-keyboard_check(vk_up);

 

hspd = min(max(hspd+__hsign,-2),2);

vspd = min(max(vspd+__vsign*2,-4),4);

 

if __vsign == -1 && !place_meeting(x,y-32,par_climbable) {

climbing = false;

vspd = -10;

}

 

if __hsign != 0 {

image_xscale = __hsign;

}

 

if !place_meeting(x,y,par_climbable) || !place_meeting(x,y+32,par_climbable) {

climbing = false;

}

}

} else {

//Plywanie

swimDir = point_direction(0,0,keyboard_check(kRight)-keyboard_check(kLeft),keyboard_check(kDown)-keyboard_check(kUp));

if abs(keyboard_check(kRight)-keyboard_check(kLeft))+abs(keyboard_check(kDown)-keyboard_check(kUp)) != 0 {

hspd += lengthdir_x(.5,swimDir);

if !(swimDir > 0 && swimDir < 180) || place_meeting(x,y-sprite_height/3-1,obj_water) {

vspd += lengthdir_y(.5,swimDir);

}

}

if keyboard_check(kUp) && !place_meeting(x,y-sprite_height/1.5,obj_water) && vspd <= 0 {

vspd = -12;

}

}

 

CREATE

 

GML
//////////////////////////////

///////ZMIENNE STALE//////////

/////////////////////////////

///Ustawienia

event_inherited();

hp = 100;

maxHp = 100;

attClock = 0;

curAttack = 0;

hurtClock = 0;

swimDir = 0;

drawAngle = 0;

jumpStr = 0;

jumpTimes = 0;

climbing = false;

vsp = 0;

 

//Moce specjalne

pwrupSpd = 0;

pwrupStr = 0;

pwrupJmp = 0;

//Pozycja odrodzenia Klarka i skrypt widoku centralnego

spawnX = x;

spawnY = y;

centerViewOnMe();

 

//zachowanie pozycji gracza przy checkpointach

if (global.checkpointR == room)

{

x = global.checkpointx;

y = global.checkpointy;

}

start_x = x;

start_y = y;

 

a tu w obj_player kod z kolizji z obj_wall ten co dziedziczy solidy z wszystkimi obiektami po których chodzi mój bohater

 

GML
if(vspeed > 2){

global.life -=1;

}

else

if(vspeed > 1){

hp -=1;

}

Odnośnik do komentarza
Udostępnij na innych stronach

Dziwisz się, że nie działa, skoro nie używasz tutaj żadnej grawitacji. Ani nigdzie nie ma vspeed...

To jest cały kod? Nawet nie widzę gdzie zmieniasz pozycję y, ale z tego co jest tu napisane, to zamień po prostu vspeed na vspd i powinno działać.

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...