Skocz do zawartości

Bohater jak zginie za szybko pokazany jest wynik w highscore


pankracy

Rekomendowane odpowiedzi

  • Administratorzy

bo ja nie wiem gdzie Ty masz ten kod, musisz się zastanowić chwilę co robisz... myślalem, że to w jakimś evencie kolizji czy coś, gdzie bohater umiera. Jak w stepie to oczywiste, że co klatkę obrazu się wykona wiec po 3 klatkach koniec gry.

Dostostuj go zatem do swojego kodu którego nie znam. Tylko nie wklejaj go całego.

Odnośnik do komentarza
Udostępnij na innych stronach

Gnysku Mam to w stepie. w kolizjach z wrogami i przeszkodami mam tylko kod na obrażenia jakie zadają bohaterowi.

Kurcze to tak jak mówisz...dlatego mi się od razu wykonuje.

chociaż spojrzałem w necie na kilka silników gry i widziałem np,że global.hp jest wrzucany do stepa obiektu..

 

w kolizjach z moim bohaterem mam tak:

 

obj_player kolizja z par_hazzard (jak spadnie na obiekty które od razu zabierają mu życia np kolce)

tu jest global.life -=1 :-) było od początku

 

///smierc natychniastowa po dotknieciu obiektu hazard
instance_destroy();
instance_create(x,y,obj_player_ginie)
with (instance_create(x,y,obj_entity_die)) {
 sprite_index = spr_player_die02;
 image_xscale = other.image_xscale;
 respawn = true;
 respawnObject = obj_player;
 respawnX = spawnX;
 respawnY = spawnY;
 physics = false;
 health=-100; 
 image_speed=(image_number/room_speed)/ 2//Czas zanim anatol sie odrodzi
 global.life -=1;
 audio_play_sound(dzwiek_anatol_ginie, 1, false);
 image_alpha=0
}

 

obj_player kolizja z par_obrazenia

 

///Obrazenia

if other.owner == par_enemy && zegarObrazen == 0 {
 global.hp -= other.sila;
 zegarObrazen = room_speed/2;
 }

 

obj_player kolizja z par_enity który dziedziczy z par_enemy

 

///poziom trudnosci i obeazenia jakie zadaje Wrog bohaterowi na danym poziomie trudnosci


if(global.difficulty == "easy")
if global.zegarObrazen<0 
{
global.hp-=17
global.zegarObrazen=room_speed*2
}
if(global.difficulty == "medium")
if global.zegarObrazen<0 
{
global.hp-=25
global.zegarObrazen=room_speed*2
}

if(global.difficulty == "hard")
if global.zegarObrazen<0 
{
global.hp-=34
global.zegarObrazen=room_speed*2
}

 

obj_player

Step

 

global.zegarObrazen-=1
if global.zegarObrazen>0 || global.hit=1 image_alpha=0.7+lengthdir_x(0.3,current_time)
else image_alpha=1;





if (global.hp <= 0)
{
global.life--

 instance_destroy();
 instance_create(x,y,obj_player_ginie)
 with (instance_create(x,y,obj_entity_die)) {
  sprite_index = spr_player_die01;
  image_speed=(image_number/room_speed)/ 2//Czas zanim bohater sie odrodzi
  image_xscale = other.image_xscale;
  respawnObject = obj_player;
  respawnX = spawnX;
  respawnY = spawnY;
  physics = true;
  respawn = true; 
  image_alpha=0
  

 }
 audio_play_sound(dzwiek_anatol_ginie, 1, false); //odtwarzamy dzwiek gdy bohater ginie
}

No i to co wyżej obj_game_controler gdzie w stepie jest ten kod

 

if (global.life > 0) 
{
global.life -=1;
} else {
    if (can_finish == false) 
{ 
if (alarm[0] == -1) { // zacznij tylko gdy jeszcze się nie odlicza
        alarm[0] = 60; // 150 to 5 sekund
}
    } else {
        if (global.pScore >= 500) //Sprawdz czy wynik nadaje sie do highscore,ale musi zostac spelniony warunek punktowy
        {
            var s=highscores[| ds_list_size(highscores) - 1];
            //Czy punkty kwalifikuja sie na top 10
            if (ds_list_size(highscores) < 10 || s[?"score"] <= global.pScore) {
                    room_goto(rm_save_score);
                    exit; // zakoncz wykonywanie eventu step w tej klatce
            }
        }
        room_goto(rm_game_over);
    }
}

teraz tak jak wspomniałeś..musiałbym to wrzucić,gdzieś do kolizji jakiegoś obiektu rodzica pod którym są podpięte obiekty dziedziczące jak wrogowie pułapki itp.

 

 

Odnośnik do komentarza
Udostępnij na innych stronach

2 godziny temu, gnysek napisał:

Tylko nie wklejaj go całego.

No i wkleił xD 

Ogólnie, jeśli ten kod:

if (global.life > 0) 
{
global.life -=1;
} else {
    if (can_finish == false) 
{ 
if (alarm[0] == -1) { // zacznij tylko gdy jeszcze się nie odlicza
        alarm[0] = 60; // 150 to 5 sekund
}
    } else {
        if (global.pScore >= 500) //Sprawdz czy wynik nadaje sie do highscore,ale musi zostac spelniony warunek punktowy
        {
            var s=highscores[| ds_list_size(highscores) - 1];
            //Czy punkty kwalifikuja sie na top 10
            if (ds_list_size(highscores) < 10 || s[?"score"] <= global.pScore) {
                    room_goto(rm_save_score);
                    exit; // zakoncz wykonywanie eventu step w tej klatce
            }
        }
        room_goto(rm_game_over);
    }
}

Masz w stepie, to Gnysek ma rację. Twój główny if "if (global.life > 0)" wykonuje się co jedną klatkę gry - bardzo bardzo szybko - dlatego musisz go zaimplementować tak, aby był sprawdzany TYLKO RAZ na jedną śmierć w rundzie. Albo daj coś takiego, chociaż wydaje mi się, że może to wprowadzić mały galimatias:

obj_game_controler
Create:
SprawdzTylkoRaz = true;

Step:
 

if (global.life > 0 and SprawdzTylkoRaz == true) 
{
global.life -=1;
SprawdzTylkoRaz = false;
} else {
	SprawdzTylkoRaz = false;
    if (can_finish == false) 
{ 
if (alarm[0] == -1) { // zacznij tylko gdy jeszcze się nie odlicza
alarm[0] = 60; // 150 to 5 sekund
SprawdzTylkoRaz = false;
}
    } else {
		SprawdzTylkoRaz = false;
        if (global.pScore >= 500) //Sprawdz czy wynik nadaje sie do highscore,ale musi zostac spelniony warunek punktowy
        {
		SprawdzTylkoRaz = false;
            var s=highscores[| ds_list_size(highscores) - 1];
            //Czy punkty kwalifikuja sie na top 10
            if (ds_list_size(highscores) < 10 || s[?"score"] <= global.pScore) {
                    room_goto(rm_save_score);
                    exit; // zakoncz wykonywanie eventu step w tej klatce
            }
        }
    	SprawdzTylkoRaz = false;
        room_goto(rm_game_over);

    }
}

(Masz tak bardzo nieczytelny kod, że nie wiem, czy we wszystkich miejscach w if'ach dałem "SprawdzTylkoRaz = false;"

PS: To jest jak na razie moja najbardziej wyczekiwana gra tego roku :D

Odnośnik do komentarza
Udostępnij na innych stronach

Hehe jest to samo zaraz wychodzi z gry i pojawia się plansza game over;-)

Coś Ty cały kod gry by się tu nie zmieścił;D

 

Kurcze mówicie,że global.life wykonuje się co jedna klatkę gry...

 

znalazłem kod w grze naszego kolegi Top Hat i podobnie jak ja ma w stepie bohatera takie rozwiązanie:

 

obj_player z gry Top Hat

 

step

 

global.czasniezniszczalnosci-=1
if global.czasniezniszczalnosci>0 image_alpha=0.7+lengthdir_x(0.3,current_time)
else image_alpha=1
//dead
if global.graczhp<0 
{
instance_destroy()
instance_create(x+0,y+0,obj_graczdead)
global.zycia-=1
}
//dead2
if global.graczhp=0 
{
instance_destroy()
instance_create(x+0,y+0,obj_graczdead)
global.zycia-=1
}

a w kolizji z wrogami obj_player Top hat ma tak

 

if global.czasniezniszczalnosci<0 
{
global.graczhp-=1
global.czasniezniszczalnosci=room_speed*2
instance_create(x+0,y+0,obj_oberwalefekt);
sound_play(snd_oberwal)
}

i na końcu w Create bohatera Top Hat jest tak

 

grav = 0;
vspd = 0;
hspd = 0;
st=1
time=0
//�ycie i co� tam
drabina=0
koniec=0
skok=false
nadrabinie=false
//bronie
global.graczpistol=1
global.graczshotgun=0
global.graczshotgunma=0
global.czasniezniszczalnosci=0

Dlatego teraz zgłupiałem skoro w stepie tak ma i to działa

Odnośnik do komentarza
Udostępnij na innych stronach

Bezmyślne kopiowanie kodu jest Twoim największym wrogiem teraz :P Postaraj się, powoli ale do przodu, zrozumieć jak działa Twój kod i dlaczego on tam w ogóle jest. Sprawdź każdy skrypt, każde wywołanie funkcji, gdzie masz przechodzenie do następnego poziomu room_goto, prześledź, co i dlaczego Ci wykonuje ten skrypt. Ja tu widzę dwa główne problemy:

 

1. W obj_game_controler w evencie Step masz taką linijkę:

if (global.life > 0) 
{
global.life -=1;
}
// (...)

Czy to Cię nie niepokoi? Przecież co Step tracisz życie, czyli 60x na sekundę tracisz życie. Czy na pewno tak to powinno wyglądać?

 

2. Nie trzymasz żadnego formatowania kodu, co dzieląc się kodem tutaj z nami na forum, to kompletnie nie mam ochoty tego czytać, ale pewnie inni też tak mają :P Szanuj nas i nasz czas w zrozumieniu Twojego kodu, jeżeli Ty nie możesz tego zrobić/nie chcesz, to tym bardziej komuś się nie będzie chciało.

Odnośnik do komentarza
Udostępnij na innych stronach

A spróbuj wywalić ten kod na kończenie gry. Daj jakiś warunek, który nigdy się nie spełni albo po prostu zakomentuj to wszystko. Jeśli nadal będzie ten błąd to masz coś zdublowane. Skoro te wszystkie przykłady, które Ci dajemy nie działają to musisz się pobawić w debugowanie. O! I jeszcze możesz spróbować dać:
 

if (global.life > 0) 
{
global.life -=1;
show_debug_message("Sie wykonalem"); // Dodaj wpis do konsoli, w celu debugowania
} else {
    if (can_finish == false) 
{ 
if (alarm[0] == -1) { // zacznij tylko gdy jeszcze się nie odlicza
        alarm[0] = 60; // 150 to 5 sekund
}
    } else {
        if (global.pScore >= 500) //Sprawdz czy wynik nadaje sie do highscore,ale musi zostac spelniony warunek punktowy
        {
            var s=highscores[| ds_list_size(highscores) - 1];
            //Czy punkty kwalifikuja sie na top 10
            if (ds_list_size(highscores) < 10 || s[?"score"] <= global.pScore) {
                    room_goto(rm_save_score);
                    exit; // zakoncz wykonywanie eventu step w tej klatce
            }
        }
        room_goto(rm_game_over);
    }
}

I zależnie ile masz ustawionych global.life tyle razy powinieneś dostać w konsoli tekst o treści "Sie wykonalem"

Odnośnik do komentarza
Udostępnij na innych stronach

Konrad,

 

Nie mam w stepie takiej linijki,bo Gnysek Mi to już wyjaśnił,że ten kod nie może być użyty w stepie tylko w kolizji z obiektem czyli np z wrogiem lub dowolny obiekt ,który daje mi obrażenia..

Musiałbym stworzyć jakiegoś parenta dla wszystkich obiektów,które dają obrażenia bohaterowi i tam użyć tego rozwiązania

Chłopaki ja wam bardzo dziękuje za pomoc;-) wiem,że staracie się Mi pomóc...naprawdę to doceniam...:):)

if (global.life > 0) 
{
global.life -=1;
}
Odnośnik do komentarza
Udostępnij na innych stronach

9 minut temu, pankracy napisał:

ten kod nie może być użyty w stepie tylko w kolizji z obiektem czyli np z wrogiem lub dowolny obiekt ,który daje mi obrażenia.

Ale jeżeli dotkniesz jakiś obiekt, to Collision Event też wykonuje się co Step. Z obiektami obj_hazzard np. kolce to z tego co widzę robisz instance_destroy, to ok, wykona się tylko raz. Ale jak przerzucisz to do obj_enemy to tutaj musisz jeszcze sprawdzać, czy global.hp jest mniejsze równe 0 i też dopiero usunąć obiekt instance_destroy.

Odnośnik do komentarza
Udostępnij na innych stronach

 

Przepraszam...muszę trochę kodu wkleić;-) żeby to objaśnić;-)

Kolizje z obj_Player mam następujące:

 

par_hazzard -To obiekt który po zetknięciu bohatera z tym obiektem powoduje automatycznie śmierć...(np kolce itp)

Jest on ustawiony w kolizji z moim bohaterem czyli obj_player

 

obj_player kolizja z par_hazzard

 

///smierc natychniastowa po dotknieciu obiektu hazard
instance_destroy();
instance_create(x,y,obj_player_ginie)
with (instance_create(x,y,obj_entity_die)) {
 sprite_index = spr_player_die02;
 image_xscale = other.image_xscale;
 respawn = true;
 respawnObject = obj_player;
 respawnX = spawnX;
 respawnY = spawnY;
 physics = false;
 health=-100; 
 image_speed=(image_number/room_speed)/ 2//Czas zanim anatol sie odrodzi
 global.life -=1;
 audio_play_sound(dzwiek_anatol_ginie, 1, false);
 image_alpha=0
}

 

kolejna kolizja:

obj_player kolizja z par_obrazenia

Tutaj jak sami widzicie poniżej w zależności od wybranego poziomu Przeciwnik w kontakcie z bohaterem zabiera mu energię HP.

 

///Poziom trudnosci i obrazenia jakie okreslone obiekty dziedziczace z tego rodzica zadaja Bohaterowi


if(global.difficulty == "easy")
if global.zegarObrazen<0 
{
global.hp-=17
global.zegarObrazen=room_speed*2
}

if(global.difficulty == "medium")
if global.zegarObrazen<0 
{
global.hp-=25
global.zegarObrazen=room_speed*2
}

if(global.difficulty == "hard")
if global.zegarObrazen<0 
{
global.hp-=34
global.zegarObrazen=room_speed*2
}

 

i ostatnia kolizja bohatera obj_player z par_attack

Ta kolizja jest przypisana do wrogów z moim bohaterem.

 

obj_player kolizja z par_attack

 

///Obrazenia

if other.owner == par_enemy && zegarObrazen == 0 {
 global.hp -= other.sila;
 zegarObrazen = room_speed/2;
}

 

 

 

Problem polega na tym,że mam w dwóch stepach w jednym

  w obj_player global.hp <= 0

oraz w global_game_controller w stepie mam global.life = 0

 

 

Gnysek wspomniał,że

 

if (global.life > 0) 
{
global.life -=1;
}

Powinien znajdować się u Bohatera w kolizji z obiektem,który ma dawać obrażenia i chyba analogicznie tak samo obiekt który ma zabierać energię a jak energia się skończy zabierać życie.

Tak was zrozumiałem zabieranie energii i odjęcie życia oraz odjęcie życia w zetknięciu z obiektem który nie zabiera energii tylko od razu życie nie może być w stepie tylko w kolizji bohatera z danym obiektem,który ma tą energię zabrać a następnie życie lub od razu życie.

Mam rozumieć,że mam wywalić jeden i drugi kod ze step z tych dwóch obiektów i wrzucić to do kolizji gracza z obiektami zadającymi obrażenia?

Bohater kiedy zginie i skończą mu się życia nie powinien się znowu odradzać na początku planszy chce to wyeliminować..naprawić to.

Gracz ma 0 żyć,to koniec gry nie odradza się i już.

Przepraszam,że tak po łebkach to wam tłumaczę,ale sam dochodzę powoli do pewnych rzeczy.Doceniam wasz wkład waszą wiedzę...nie każdy od razu zbudował Rzym:)

 


 

 tak to wygląda:

 

obj_player

 

step

//Bohater dostajac obrazenia to miga
//miganie dodane specjalnie dla kuli kiedy wartosc zmiennej globalnej hit jest rowna 1
//Bohater miga otrzymujac obrazenia okreslone w pulapce kula oraz innych elementach zadajacych obrazenia


global.zegarObrazen-=1
if global.zegarObrazen>0 || global.hit=1 image_alpha=0.7+lengthdir_x(0.3,current_time)
else image_alpha=1;


if (global.hp <= 0)
{
global.life--

 instance_destroy();
 instance_create(x,y,obj_player_ginie)
 with (instance_create(x,y,obj_entity_die)) {
  sprite_index = spr_player_die01;
  image_speed=(image_number/room_speed)/ 2//Czas zanim bohater sie odrodzi
  image_xscale = other.image_xscale;
  respawnObject = obj_player;
  respawnX = spawnX;
  respawnY = spawnY;
  physics = true;
  respawn = true; 
  image_alpha=0
  

 }
 audio_play_sound(dzwiek_anatol_ginie, 1, false); //odtwarzamy dzwiek gdy bohater ginie
}

obj_game_controller

 

Step

 

if (global.life = 0)

{
 
    if (can_finish == false) 
     { 
if (alarm[0] == -1) { // zacznij tylko gdy jeszcze się nie odlicza
        alarm[0] = 60; // 150 to 5 sekund
}

    } else {
        if (global.pScore >= 500) //Sprawdz czy wynik nadaje sie do highscore,ale musi zostac spelniony warunek punktowy
        {
            var s=highscores[| ds_list_size(highscores) - 1];
            //Czy punkty kwalifikuja sie na top 10
            if (ds_list_size(highscores) < 10 || s[?"score"] <= global.pScore) {
                    room_goto(rm_save_score);
                    exit; // zakoncz wykonywanie eventu step w tej klatce
            }
        }
        room_goto(rm_game_over);
    }
}

 

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