Skocz do zawartości
  • 0
Cygnus

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

Pytanie

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.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

37 odpowiedzi na to pytanie

Rekomendowane odpowiedzi

  • 0

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.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

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...

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
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

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

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;)

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
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.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

mam zwykłą grawitacje a nie fizykę.

 

w stepie gracza swojego dałem

 

GML
if(vspeed > 10){

hp -=1;

}else if(vspeed > 20){

global.life -=1;

}

 

 

No,ale nic to nie daje...nic się nie dzieje...

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

To daj mniejsze liczby. Zamiast 10 i 20 daj 1 i 2.

No i to musi być w kolizji z podłogą nie w step

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

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...

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

Ale miałeś zmniejszyć.

GML
if(vspeed > 2){

global.life -=1;

}

else

if(vspeed > 1){

hp -=1;

}

I dać w kolizji z podłożem.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

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..

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

GML
if(other.vspeed > 2){

global.life -=1;

}

else

if(other.vspeed > 1){

other.hp -=1;

}

Daj tak

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
GML
if(other.vspeed > 2){

global.life -=1;

}

else

if(other.vspeed > 1){

other.hp -=1;

}

Daj tak

 

 

Ok jak tylko dopadne sie do komputera,to sprawdze,moze w koncu to pomoze;-)?

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

Mialem to wyslac godzine temu ale jakos zapomnialem:

Bo zapewne gracz zeruje vspeed zanim wall go sprawdzi. Zrob sprawdzenie vspeeda po stronie gracza

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
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

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

kt1117 no jest to samo

 

Ok spróbuje w stepie bohatera to zrobić...może to coś pomoże..

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

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;

}

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

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...

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

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;

}

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

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ć.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

Dodaj na początku eventu kolizji

GML
show_message(string(vspd))

Poskacz trochę i podaj co wyskakuje

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

k117 dodałem w bohaterze do kolizji z obj_wall

 

GML
show_message(string(vspd))

if(vspd > 2){

global.life -=1;

}

else

if(vspd > 1){

hp -=1;

}

 

 

 

Podskakuje graczem,ale nic nie wyskakuje...

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

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

Tylko 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ę tutaj.

Zaloguj się tutaj

  • Przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników, przeglądających tę stronę.

×