Skocz do zawartości

Bohater jak zginie za szybko pokazany jest wynik w highscore


pankracy

Rekomendowane odpowiedzi

Cześć wszystkim,

 

Mam taki nietypowy problem.

Otóż..w momencie,kiedy mój bohater ginie i kończy się gra następuje zapis do tabeli wyników(gra sprawdza czy wynik nadaje się do top 10),ale dziwnie to wygląda,bo gra się kończy bohater ginie i od razu następuje zapis do tabeli wyników.

Jest to za szybko..chciałbym to wydłużyć chociaż o 2-3 sekundy.

 

Czyli bohater ginie kończy się gra...mijają 2 sekundy i pojawia się tabela wyników..

 

podejrzewam,że tu trzeba chyba użyć room_speed ale już mi się pierdzieli.

I jeszcze jedna sprawa jak zrobić żeby był spełniony taki warunek,że musi być zebrane 5000 score żeby nastąpił zapis i od tego liczone top 10 wyników,bo teraz co chwile mi zapisuje wyniki top 10 bez względu ile mam zebranych punktów...niech jest jakaś minimalna granica

 

obj_game_controller

 

step

 

///kontroler odpowiedzialny za giniecie bohatera
if (global.life=0) 
{
game_end();

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 );
} else {
    room_goto( rm_game_over );
}
}

obj_Player

 

Step

 

///Zycia i dopalacze dodatkowo zabieranie zyc za upadek z bardzo duzej wysokosci


//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)/ 3//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
}

Z góry dziękuje za pomoc;-)

 

Odnośnik do komentarza
Udostępnij na innych stronach

No na te dwa problemy są bardzo proste rady. 

1. Żeby od razu nie przechodził do tablicy wyników, stwórz alarm 2-3 sekundowy, który będzie robił za pause.

"If (global.life == 0 and alarm[0] = -1) {//kod}". Przed tym sprawdzeniem musisz dać gdzieś alarm[0] = 3*room_speed.

 

2. A tutaj sam sobie odpowiedziałeś w pytaniu. Skoro ma być spełniony warunek, że od 5000 scoruf ma się dodawać wynik, no to daj ten warunek gdzieś. Warunki to if'y. If(score >= 5000) 

Odnośnik do komentarza
Udostępnij na innych stronach

W drugim przypadku zrobiłem tak dałem warunek przed przejściem do pokoju highscore,ale raz to działa lub wywala mnie całkiem z gry(zbiorę 5000pkt i następuje zapis wyniku lub nie zbiorę tych punktów i pojawia się plansza game over)

Miało to być tak,że wyniki do top 10 mają zaczynać się od 5000 punktów

 

obj_game_controller

 

step

 

///kontroler odpowiedzialny za giniecie bohatera
if (global.life=0)
{
game_end();


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)  {
if(global.pScore >= 5000) 
    room_goto( rm_save_score );
} else {
    room_goto( rm_game_over );
}
}

 

Jeśli chodzi o pierwszy przypadek odnośnie tzw pauzy na 2-3 sekundy za nim przejdzie do pokoju highscore i pokoju game over to alarm[0] = 3*room_speed.  mam dać w Create? czy w stepie?

Odnośnik do komentarza
Udostępnij na innych stronach

Raczej coś takiego:

obj_player_ginie
Create:
obj_game_controller.alarm[0] = 3*room_speed; //Nastaw alarm dla obj_game_controller

obj_game_controller
Create:
alarm[0] = -1;

Alarm[0]:
//Jestem komentarzem w kodzie, aby alarm zostal aktywny

Step:

///kontroler odpowiedzialny za giniecie bohatera
if (global.life==0 and alarm[0] = -1) // wlacz kontroler gdy alarm[0] wylaczy sie (przedtem nastaw go, na odliczanie)
{
game_end();

if(global.pScore >= 5000) //Sprawdz czy wynik nadaje sie do highscore
{
  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 );
  } 
  else //jesli nie kwalifikuje sie na top 10
  {
      room_goto( rm_game_over );
  }
}
else //jesli nie kwalifikuje sie do highscore
{
	room_goto( rm_game_over );
}

 

Odnośnik do komentarza
Udostępnij na innych stronach

Simianie ten twój sposób na wydłużenie tzw pauzy za nim pojawi się pokój highscore lub game over nie działa..

 

Próbowałem też zrobić tak jak niżej,ale to samo się dzieje co u Ciebie..

jest objaw,że życia się kończą i gra się nie kończy;-)tylko pokazuje przy ilości żyć x-1 itd..

 

obj_game_controller

 

Create

 

czas=0;

 

 

step

 

///kontroler odpowiedzialny za giniecie bohatera


if (global.life==0 and czas>=2*10)
{
game_end();


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 );
  } 
  else //jesli nie kwalifikuje sie na top 10
  {
      room_goto( rm_game_over );
  }
}
else //jesli nie kwalifikuje sie do highscore
{
room_goto( rm_game_over );
}
}

 

Odnośnik do komentarza
Udostępnij na innych stronach

Może źle użyłeś alarmu, albo nadpisałeś jakiś. Jak chcesz zrobić po swojemu, czyli zmiennymi, to zrób tak:

Create:
czas = 3*room_speed; //mnożenie wartości przez room_speed daje Ci sekundy

Step:
 

///kontroler odpowiedzialny za giniecie bohatera


if (global.life==0 and czas==0)
{
game_end();


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 );
  } 
  else //jesli nie kwalifikuje sie na top 10
  {
      room_goto( rm_game_over );
  }
}
else //jesli nie kwalifikuje sie do highscore
{
room_goto( rm_game_over );
}
}

czas = max(0, czas-1); //odliczaj do zera


I rozumiem, że obj_game_controller jest cały czas aktywny, tak? no, bo jeśli nie, to odliczanie też nie jest aktywne, wtedy musisz to zrobić w innym, aktywnym obiekcie

Odnośnik do komentarza
Udostępnij na innych stronach

Tak jest umieszczony zawsze na scenerii...nie mam żadnych alarmów w tym obiekcie..

 

image.png.eb579b21751da3b3c2a5c3583ab4b6cf.png

 

Kurcze nadal nie działa..co prawda nie ma teraz żadnych błędów,ale dalej jest,że od razu przechodzi Mi do planszy highscore lub game over..kurcze co jest nie tak:/

 

 

Obj_game_controller

 

CREATE

 

czas = 3*room_speed; //mnożenie wartości przez room_speed

///Ustawienia globalne

image_speed = 0;
global.editPlayerSlot = -1;
zebraniu ich odpowiedniej ilosci


// zmienne ponizej sa dodane do creation code pokojow
global.pScore = 0;
global.coins = 0;
global.Saved = true;
globalvar spawnX, spawnY;


global.Zabitych[0]=0; //Pierwszy typ npc
global.Zabitych[1]=0; //Drugi typ npc
global.Zabitych[2]=0; //Trzeci typ npc
global.Zabitych[3]=0; //Czwarty typ npc


///Widok
globalvar gvX, gvY, gvW, gvH, gvObj, gvOffX, gvOffY;
gvX = view_xview[0];
gvY = view_yview[0];
gvW = view_wview[0];
gvH = view_hview[0];
gvObj = view_object[0];
gvOffX = 0;
gvOffY = 0;

///HUD
hpHUD = 0;
maxHpHUD = 0;

/// Wyszukaj poziom trudności i ustaw odpowiednio życie i szanse 

//easy difficult
if global.difficulty  = "easy"
{
   global.hp = 100;
   
   global.life = 7;
}

//medium difficult
if global.difficulty  = "medium"
{
   global.hp = 100;
  
   global.life = 5;
}

//hard difficult
if global.difficulty  = "hard"
{

    global.hp = 100;

    global.life = 3;
    

}

Obj_game_controller

 

STEP

 

///kontroler odpowiedzialny za giniecie bohatera


if (global.life==0 and czas==0)
{
game_end();


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 );
  } 
  else //jesli nie kwalifikuje sie na top 10
  {
      room_goto( rm_game_over );
  }
}
else //jesli nie kwalifikuje sie do highscore
{
room_goto( rm_game_over );
}
}

czas = max(0, czas-1); //odliczaj do zera

obj_player

 

CREATE

 

/// Glowne deklaracje zmiennych Bohatera
                     
                     //////////////////////////////
                    ///////ZMIENNE STALE//////////
                    /////////////////////////////
///Ustawienia
event_inherited();
zbieranie=true;
eksplozja = false;
zasiegEksplozji = 22;
silaEksplozji = 10;
//czas = 3*room_speed; //mnożenie wartości przez room_speed daje Ci sekundy

global.damage=0; //zmienna odzpowiedzialna za obrazenia zadawane po upadku z duzej wysokosci
global.hp = 100;
global.hit=0; //zmienna odpowiada za obrazenia kuli i miganie 
maxHp = 100;
zegarAtaku = 0;
odejmij = 0; //zmienna potrzebna do przesuwanie skrzynki w end step 
atakBierzacy = 0;
global.zegarObrazen = 0;
kierunekPlywania = 0;
wysKierunek = 0;
silaSkoku = 0;
czasSkoku = 0;
drabina = false;
rs_timer = 0; //licznik czasowy w grze
tlen=10;//ilosc tlenu

//Moce specjalne
pwrupSpd = 0;
pwrupStr = 0;
pwrupJmp = 0;

//Pozycja odrodzenia Anatola i wywolanie skryptu widoku centralnego na graczu
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;
//funkcja dodaje HUD gracza na planszach bossowych
if instance_exists(obj_game_controller)
obj_game_controller.visible=1
else instance_create(0,0,obj_game_controller);


//zamrazanie bohatera
zamroz = false;
zamroz_x = x;
zamroz_y = y;



playerSlot = 1; //ustalamy slot dla gracza numer 1
kierunekPlywaniaGamepad = 0;




    
    
    
    
    


  



obj_player

 

STEP

 

///Zycia i dopalacze dodatkowo zabieranie zyc za upadek z bardzo duzej wysokosci


//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
}


//Dopalacze
if pwrupSpd > 0 {
 //Efekty
 if pwrupSpd mod 2 == 0 {
  if image_xscale > 0 {
   part_type_orientation(pArrow,0,0,0,0,0);
   part_type_direction(pArrow,0,0,0,0);
  } else {
   part_type_orientation(pArrow,180,180,0,0,0);
   part_type_direction(pArrow,180,180,0,0);
  }
  part_type_colour1(pArrow,c_lime);
  part_particles_create(partSystem,x-image_xscale*16,y-irandom(70),pArrow,1);
 }
 //Odliczanie do konca mocy specjalnej
 pwrupSpd -= 1;
}
if pwrupStr > 0 {
 //Efekty
 image_blend = merge_colour(image_blend,c_red,0.11);
 //Odliczanie
 pwrupStr -= 1;
}
if pwrupJmp > 0 {
 //Efekty
 if pwrupJmp mod 2 == 0 {
  part_type_orientation(pArrow,90,90,0,0,0);
  part_type_direction(pArrow,90,90,0,0);
  part_type_colour1(pArrow,c_yellow);
  part_particles_create(partSystem,x-16+irandom(32),y,pArrow,1);
 }
 //Odliczanie
 pwrupJmp -= 1;
}


obj_player_ginie

 

CREATE

 

vspeed = -10
gravity = 0.5 

 

Odnośnik do komentarza
Udostępnij na innych stronach

Próbowałem też to w klockach zrobić alarm i nic..

Albo jest jak jest mimo zastosowania alarmu bohater ginie i od razu pokazuje sie albo plansza highscore albo plansza game over..

Nie wiem w czym jest problem..przecież obiekt jest aktywny na mapie kurcze...

Próbowałem to samo zrobić w stepie bohatera i efekt ten sam...

Prosta wydawałaby się rzecz,a jednak nie do końca..

Odnośnik do komentarza
Udostępnij na innych stronach

Przejrzałem...nie mam nigdzie zdublowanego kodu w innym obiekcie od Highscore

 

tylko w global_game_controller

 

w Stepie mam nigdzie więcej

 

///kontroler odpowiedzialny za giniecie bohatera


if (global.life=0)

{
game_end(); 



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 );
  } 
  else //jesli nie kwalifikuje sie na top 10
  {
      room_goto( rm_game_over );
  }
}
else //jesli nie kwalifikuje sie do highscore
{
room_goto( rm_game_over );
}
}


///monety zebranie 100sztuk doda 1 zycie bohaterowi,oraz zerowanie monet
if (global.coins=100)
{
global.coins=0;
global.life+=1;
}
//
if (global.coins>100)
{
global.coins=0;
global.life+=1;
audio_play_sound(dzwiek_anatol_zbiera_przedmiot, 1, false);   //odtwarzamy dzwiek po zdobyciu zycia
}

 

Odnośnik do komentarza
Udostępnij na innych stronach

Gnysku,

 

Bo usunąłem Alarm skoro nie działało to rozwiązanie,a miałem tak jak wyżej czyli;

 

obj_game_controller

 

STEP

 

///kontroler odpowiedzialny za giniecie bohatera
if (global.life==0 and alarm[0] = -1) // wlacz kontroler gdy alarm[0] wylaczy sie (przedtem nastaw go, na odliczanie)
{
game_end();

if(global.pScore >= 500) //Sprawdz czy wynik nadaje sie do highscore
{
  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 );
  } 
  else //jesli nie kwalifikuje sie na top 10
  {
      room_goto( rm_game_over );
  }
}
else //jesli nie kwalifikuje sie do highscore
{
	room_goto( rm_game_over );
}

obj_game_controller

 

CREATE

 

alarm[0] = -1;

obj_player_ginie

 

CREATE

 


obj_game_controller.alarm[0] = 3*room_speed;

 

Odnośnik do komentarza
Udostępnij na innych stronach

A w obj_game_controller dodałeś alarm[0] jako event? Bo inaczej (przynajmniej kiedyś tak było) alarm[0] jest nieaktywny. Musisz dać alarm[0] jako event, a w nim jakąś akcję np. skrypt w którym jest zamieszczona jakakolwiek linijka kodu, może być sam komentarz "//cześć jestem komentarzem i podtrzymuje alarm[0] przy życiu"

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Zanim pierwszy raz ustawisz alarm[0], to on ma już wartość -1 od początku gry, pewnie dlatego ?

 

Zrób inaczej:

 

// create

can_finish = false;

// gdzies tam gdzie konczy sie gra i ma poczekać
if (<nie zyje>) {
  if (can_finish == false) {
  	alarm[0] = 30;
  } else {
  	room_goto(<higscore>);
  }
}


// w alarm 0
can_finish = true;

Poza tym, game_end(); kończy grę, więc cały kod dalej się nie wykona.

Odnośnik do komentarza
Udostępnij na innych stronach

Simian miałem evencie tak ustawione...z tym Alarm 0

Tak alarm 0 od początku miał wartość -1

 

Nie wiem...to tak nie działa,ale pewnie coś zwaliłem

game_end() przecież nie mogę dać na koniec kodu,bo wtedy nie wyświetli mi się tabela wyników.

 

obj_game_controller

 

step

 

if (global.life=0)

{
game_end(); 

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)  
  
   if (can_finish == false) {
  alarm[0] = 30;
  } else {
  
  
      room_goto( rm_save_score );
  } 
  else //jesli nie kwalifikuje sie na top 10
  {
      room_goto( rm_game_over );
  }
}
else //jesli nie kwalifikuje sie do highscore
{
room_goto( rm_game_over );
}
}

// w alarm 0
can_finish = true;

create

 

can_finish = false;

 

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Nie musisz ustawiać alarmu na -1, on jest tak ustawiony przez GameMakera dla każdego obiektu. I żadnego game_end() gdziekolwiek bo to wyłącza całkiem grę.

//create
can_finish = false;

// w alarm 0
can_finish = true;

// step
if (global.life = 0) {
    if (can_finish == false and alarm[0] == -1) {
        alarm[0] = 30; // 1 sekunda
    } 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

Nie działa dalej to samo..od razu przechodzi do pokoju game over lub jak zbiorę 500pkt to przechodzi do pokoju game over..kurcze co jest nie tak:/

Wildze w kodzie alarm 0=-1 skoro jest już ustawiony Gnysku jak mówisz dla każdego obiektu,to po co go tu umieszczać.

 

obj_game_controller

 

step

 

///kontroler odpowiedzialny za giniecie bohatera


if (global.life = 0) {
    if (can_finish == false and alarm[0] == -1) {
        alarm[0] = 30; // 1 sekunda
    } 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);
    }
}

obj_game_controller

 

Alarm[0] ustawiony jako nowy event i w nim poniżej kod

 

image.thumb.png.ffc7ef1a6e78f804a2dcc262e4a4d92d.png

can_finish = true;

 

 

 

 

obj_game_controller

 

create

 

can_finish = false;

 

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

To jest porównanie. Ale widzę mój błąd. Połączyłem dwa ify w jeden, a powinienem mieć dwa.

 

//create
can_finish = false;

// w alarm 0
can_finish = true;

// step
if (global.life = 0) {
    if (can_finish == false) {
		if (alarm[0] == -1) { // zacznij tylko gdy jeszcze się nie odlicza
        	alarm[0] = 150; // 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 żeby było widać, dałem teraz 5 sekund, bo 1 to może być za krótko ;)

Odnośnik do komentarza
Udostępnij na innych stronach

Gnysku...działa!

wielkie dzięki...

Chociaż wygląda to tak,że gracz ginie...i wracam na początku mapy mija te 5 sekund i przechodzi do pokoju game over lub highscore.

A można to ustawić że jak straci wszystkie życia i jest koniec gry,to nie przenosi się na początek planszy tylko zatrzymuje się ekran w miejscu,gdzie zginał?

 

Mam jeszcze takie pytanie do Ciebie:

Powiedz Mi..bo rozumiem,ze nie musi być game_end() w grze żeby zakończyć ją?

za to użyłeś zmiennej  can_finish?

Mógłbyś mi w skrócie to wytłumaczyć;-)

 

 

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

game_end() zamyka program. Jeśli miałeś to w pierwszej linijce tego kodu, to automatycznie po śmierci zamykała się gra na koniec obecnego stepu.

 

Co do przesuwania sie view - nie wiem jaki masz od tego kod. Jeśli masz śledzenie obiektu i po śmierci ekran się przesuwa (nie skacze), to bym winił... drugą instancję tego samego obiektu.

 

can_finish jest po prostu flagą, czy coś już zostało zrobione czy nie.

Odnośnik do komentarza
Udostępnij na innych stronach

Czyli u mnie i tak zamyka się gra i nie potrzebne jest użycie game_end()?

Flaga wszystko załatwia?

 

Mój bohater jak traci życia wiadomo odradza się i wraca na początku scenerii..(użycie  respawnX  i respawnY) tak ma być,ale kiedy skończą mu się wszystkie życia to powinien w miejscu gdzie zginie zakończyć grę.

 

ustawienia widoku mam tylko w dwóch obiektach które są cały czas na każdej planszy w grze

 

obj_global_controller  - ten sam obiekt

 

End step

 

///Wyswietlanie widoku okna gry
if (view_wport[0] != window_get_width() || view_hport[0] != window_get_height()) && window_get_width() != 0 {
 view_wport[0] = window_get_width();
 view_hport[0] = window_get_height();
 view_hview[0] = view_wview[0]/view_wport[0]*view_hport[0];
 surface_resize(application_surface,view_wview[0],view_hview[0]);
display_set_gui_size(view_wport[0],view_hport[0]); //wersja podstawowa
}

 

obj_game_controller

 

End step

 

///Widok
if view_wview[0] != gvW || view_hview[0] != gvH {
 var tempW, tempH;
 tempW = view_wview[0];
 tempH = view_hview[0];
 
 if gvW/view_wport[0] >= gvH/view_hport[0] {
  view_hview[0] = lerp(view_hview[0],gvH,.3);
  view_wview[0] = view_hview[0]/view_hport[0]*view_wport[0];
 } else {
  view_wview[0] = lerp(view_wview[0],gvW,.3);
  view_hview[0] = view_wview[0]/view_wport[0]*view_hport[0];
 }
 
 view_xview[0] -= (view_wview[0]-tempW)/2;
 view_yview[0] -= (view_hview[0]-tempH)/2;
}

if view_wview[0] > room_width {
 view_wview[0] = room_width;
 view_hview[0] = view_wview[0]/view_wport[0]*view_hport[0];
}
if view_hview[0] > room_height {
 view_hview[0] = room_height;
 view_wview[0] = view_hview[0]/view_hport[0]*view_wport[0];
}

if instance_exists(gvObj) {
 gvX = min(max(0,gvObj.x+gvOffX-view_wview[0]/2),room_width-view_wview[0]);
 gvY = min(max(0,gvObj.y+gvOffY-view_hview[0]/2),room_height-view_hview[0]);
 
 gvOffX = 0;
 gvOffY = 0;
}

view_xview[0] = round(min(max(0,lerp(view_xview[0],gvX,.15)),room_width-view_wview[0]));
view_yview[0] = round(min(max(0,lerp(view_yview[0],gvY,.15)),room_height-view_hview[0]));

gvW = gvWStart;
gvH = gvHStart;

 

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Nic z tego wyżej nie rozumiem. Strzelam jedynie, że gvX i gvY się resetują na 0.

 

Co do flagi - ona nie ma nic wspólnego z game_end(). Game End robi to samo co Alt+F4, albo zakończenie procesu w menedżerze zadań. Ja zrobiłem flagę, dzięki której albo ma się 1 raz włączyć alarm, jeśli jeszcze nie leciał, albo - jeśli już się zakończył o czym mówi właśnie ta flaga - wykonał kod przejścia do następnego roomu.

Odnośnik do komentarza
Udostępnij na innych stronach

Tak gvX i gvY resetują  się na 0.

Dobrze..czyli game_end nie jest potrzebny...

 

Wiem w czym jest problem Gnysku...

 

Mój bohater załóżmy ma te 3 życia i po każdym życiu odradza się w pozycji początkowej mapy...Natomiast kiedy kończy się ostatnie życie to bohater zamiast zatrzymać się w miejscu w którym zginał,to znowu się odradza i zaraz następuje koniec gry..Przecież jak zginał,to nie powinien się odradzać.

 

 

Teraz tak...respawn musiałby być na false rozumiem?po śmierci bohatera kiedy ilość żyć wynosi 0.

 

wystarczy dodać kolejny alarm do obj_game_controler? który wyłączy odradzanie bohatera kiedy jego życia są na zero?

 

 

obj_game_controler

 

step

 

if (global.life = 0) //czy tu nie powinien być albo warunek lub alarm ustawiony który sprawdzał by czy respawn jest wyłączony gracza???
{
    if (can_finish == false) {
		if (alarm[0] == -1) { // zacznij tylko gdy jeszcze się nie odlicza
        	alarm[0] = 150; // 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

  • Administratorzy

w respawnie daj

if global.life > 0

i po sprawie.

 

Mam wrażenie, że nie rozumiesz co robi Twój kod. Po co jakieś alarmy do respawnów, skoro to jest zmienna true/false jak mniemam ? umierasz to umierasz, wyłączasz mozliwosc respawna od razu. Możesz nawet tam, gdzie global.life pomniejszasz o 1.

 

Odnośnik do komentarza
Udostępnij na innych stronach

Staram się go analizować...ale wolno Mi idzie..

 

if global,life > 0 powoduje,że gra się włącza a za chwile ze scenerii przenosi mnie do głównego menu..

 

obj_game_controler

 

STEP

 

if (global.life > 0) 
{
    if (can_finish == false) {
		if (alarm[0] == -1) { // zacznij tylko gdy jeszcze się nie odlicza
        	alarm[0] = 150; // 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);
    }
}

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
}

 

Odnośnik do komentarza
Udostępnij na innych stronach

Pomniejszać o jedno życie..tak też robię ale jest błąd

 

global_game_controler

 

Step

 

if (global.life > 0) 
{
if global.life -=1;//tu jest blad 
    if (can_finish == false) {
		if (alarm[0] == -1) { // zacznij tylko gdy jeszcze się nie odlicza
        	alarm[0] = 150; // 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);
    }
}

Respawn mam tylko w tym miejscu

 

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
}

 

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Właśnie sie zastanawiałem, dlaczego tam jest >0 :D ale myślałem, ze tak sobie wymyśliłeś, że 0 = żyje, 1 = nie zyje. Ale ok, w takim razie:

 

if (global.life > 0) 
{
	global.life -=1;
} else {
   /// kod od highscore
}

 

Odnośnik do komentarza
Udostępnij na innych stronach

No właśnie ten znak równości mnie trochw wybił:-)

 

kurcze co robię nie tak: mam 0 żyć i mi odejmuje życia..nie działa to normalnie

 

obj_game_controler

 

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
}
global.life -=1;
    } 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

  • Administratorzy

A co ja napisałem wyżej ? :D

 

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

 

Odnośnik do komentarza
Udostępnij na innych stronach

Napisałeś żeby warunek dać przed highscore;-)

 

jednak efekt ten sam ;-) gra się włącza zaczynam grać i za momencik wywala mnie do menu głównego;-) dziwna sytuacja

 

global_game_controler

 

step

 

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

 

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