Skocz do zawartości
pankracy

poziomy trudności w grze

Rekomendowane odpowiedzi

Cześć wszystkim,

 

Zastanawiam się nad stworzeniem poziomu trudności

czyli:

 

- łatwy

- normalny

- trudny

 

jak to najlepiej zrobić? użyć zmiennej globalnej?

 

generalnie chciałbym żeby wyglądało to tak:

uruchamiam grę pojawia się plansza osobnego roomu z wyborem trudności w tym przypadku trzy stopnie trudności

 

łatwy

z większa ilością żyć np 5 żyć z pełną energią i bardziej flegmatycznymi to ujmę pułapkami i wrogami;-) dostaje dużo broni w tym przypadku amunicji np 30

 

Normalny

czyli poziom ten co jest obecnie w grze;-) bez zmian

 

Trudny

ten poziom z połową energii lub 3/4 energii 3 życiami wrogowie są szybsi i dostaje też mniej broni amunicji 10

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Zapewne jest mnóstwo sposobów aby to zrobić. Niemniej jednak, użycie globalnej zmiennej według mnie, będzie dla Ciebie najłatwiejszym (ale możliwe, że najbardziej pracochłonnym) sposobem. Przy każdej akcji, która ma kilka wariantów (łatwy, średni, wysoki - poziom), daj if'a, który będzie odpowiedzialny, jaka wariacja się wykona, np.

 

[Object Enemy1]
///Create

/// ------------------------------------------------------------------------ SPOSOB 1
//Deafult values //Zabezpieczenie, na wypadek gdyby zaden wariant sie nie wykonal, to wtedy mob dostanie ponizsze wartosci
max_hp = 100;
attack_damage = 5;
movement_speed = 3;

//Gdy poziom bedzie ustawiony na latwy
if(global.difficult  == "easy")
{
	max_hp = 80;
	attack_damage = 3;
	movement_speed = 2;
}

//Gdy poziom bedzie ustawiony na sredni
if(global.difficult  == "medium")
{
	max_hp = 100;
	attack_damage = 5;
	movement_speed = 3;
}

//Gdy poziom bedzie ustawiony na trudny
if(global.difficult  == "hard")
{
	max_hp = 120;
	attack_damage = 7;
	movement_speed = 4;
}


/// ------------------------------------------------------------------------ SPOSOB 2
//Albo mozesz to zrobic na switch'u, wtedy bedzie bardziel klarownie
switch(global.difficult)
{
	case "easy":
		max_hp = 80;
		attack_damage = 3;
		movement_speed = 2;
	break;

	case "medium":
		max_hp = 100;
		attack_damage = 5;
		movement_speed = 3;
	break;

	case "hard":
		max_hp = 120;
		attack_damage = 7;
		movement_speed = 4;
	break;

	deafult:
		max_hp = 100;
		attack_damage = 5;
		movement_speed = 3;	
	break;
}

 


Pewnie bardziej doświadczeni, będą mieli inne sposoby :thumbsup:
 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Zamiast stringów lepiej używać constantow/macro, kompiler wykryje błędy i podpowiadanie składni zadziała

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Globalna zmienna, tak jak to opisuje @SimianVirus7, jest jak najbardziej spoko opcją, ale dodatkowo zrobiłbym to jak @gnysek proponuje, wystarczy dodać stałe do projektu difficult_easy, difficult_medium i difficult_hard. Ale zrezygnowałbym ze switchy, są mega brzydkie :P 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Dzięki Chłopaki;-) będę operował na globalnej zmiennej:-)

I teraz tak:

Mam menu gry zbudowane w taki sposób jak poniżej:

Teraz chciałbym po wybraniu New Game przejść do pokoju z wyborem trudności poziomu ok to oczywiste,ale czy mam w tym pokoju użyć funkcji ds_list_create?

Jak to ma wyglądać?

 

Przechodzę z New Game do pokoju,gdzie wybieram poziom trudności następnie po wybraniu pokoju trudności przechodzę już do samej gry.

 

Teraz tak ten kod wyżej powinien znajdować się we wrogu? czy może on być jako odrębny obiekt umieszczony na mapie gry?

 

 

Obj_menu

 

CREATE

 

options=ds_list_create()
options[|0]=gmt("New game")
options[|1]=gmt("Load game")
options[|2]=gmt("Highscore")
options[|3]=gmt("Options")
options[|4]=gmt("Credits")
options[|5]=gmt("Exit")

selected=0

gp_up=false
gup_down=false
gp_left=false
gp_right=false

//Używane do animacji menu
animation_speed=room_speed/4
for(var i=0; i<ds_list_size(options); i++) {
    animation[i]=0
}

STEP

 

if(abs(gamepad_axis_value(0,gp_axislv))<0.3 && !keyboard_check(vk_anykey))
    {
    gp_up=0
    gp_down=0
    }
    
if(abs(gamepad_axis_value(0,gp_axislh))<0.3 && !keyboard_check(vk_anykey))
    {
    gp_left=0
    gp_right=0
    }  

if(keyboard_check_pressed(vk_down) || gamepad_button_check_pressed(0,gp_padd) || (gamepad_axis_value(0,gp_axislv)>0.7 && !gp_up)) {
    selected++
    if(selected>=ds_list_size(options)) {
        selected=ds_list_size(options)-1
    }
    gp_up=true
}

if(keyboard_check_pressed(vk_up) || gamepad_button_check_pressed(0,gp_padu) || (gamepad_axis_value(0,gp_axislv)<-0.7 && !gp_down)) {
    selected--
    if(selected<0) {
        selected=0
    }
    gp_down=true
}

if(keyboard_check_pressed(vk_enter) || gamepad_button_check_pressed(0,gp_face1)) {
    if(selected=0) {
        room_goto(inicjacja)
    } else if(selected=1) {
        if(file_exists("save.dat")){
            game_load( "Save.dat" );
        } else {
            show_message("Cannot find save.dat file. Please start a new game.");//tu daj po angielsku info,że nie znaleziono pliku
        }
        audio_stop_sound (dzwiek_menu_glowne_gry);
    } else if(selected=2) {
        room_goto(rm_highscore)
    } else if(selected=3) {
        room_goto(rm_options)
    } else if(selected=4) {
        room_goto(rm_credits)
    } else if(selected=5) {
        game_end()
    }
}

DRAW

 

draw_set_valign(1)
draw_set_halign(1)
draw_set_font(fontIntro)

var line_height=ceil(string_height("M")*1.1)

for(var i=0; i<ds_list_size(options); i++) {
    if(i=selected) {
        //Wybrana opcja
        animation[i]=clamp(animation[i]+(1/animation_speed),0,1)
    } else {
        animation[i]=clamp(animation[i]-(1/animation_speed),0,1)
    }
    var color=merge_colour(c_black,c_red,animation[i])
    draw_text_transformed_color(x,y+(line_height*i),options[|i],1+animation[i]/5,1+animation[i]/5,0,color,color,color,color,1)
}

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Kod powinien znajdować sie tam, gdzie go potrzebujesz. Nie wiem jak tworzysz przeciwników, czy stawiasz ich w roomie, czy tworzy ich jakiś obiekt-nadzorca. Musisz sobie sam odpowiedzieć na swoje pytanie bo to Ty wiesz jak robisz grę i co w niej jest, my nie będziemy zgadywać, a ściany kodu nie pomagają. Trzeba zawsze minimalizować problem, a nie po prostu wklejać kod który nic nie mówi, albo nie jest potrzebny.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Przeciwników stawiam w danym roomie..scenerii.

Właśnie kod potrzebuje żeby był jako odrębny obiekt umieszczony na mapie tam gdzie są wrogowie..

Stąd też moje pytanie było zadane w taki sposób;-)

 

 

Jasne bez sensu jest wklejać kod który nic nie mówi zgadzam się z tą tezą...

 

 

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Coś mnie olśniło...

 

w roomie osobnym,gdzie ustawie wybór poziomu trudności za nim rozpocznę grę mogę użyć taki kod;:

korzystając z tablicy

ds_list_create()

 

„global.difficulty = 0” dla easy, 
„global.difficulty = 1” dla medium 
„global.difficulty = 2” dla hard.

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

ds_list to nie tablica i nie kasuje sie automatycznie, więc memory leak jak nic.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Kurcze...fakt...

 

Dobra jak to najprościej zrobić..tworze pokój a w nim obiekt np o nazwie obj_poziomtrudnosci

i teraz tak...

 

po wyborze z listy poziomu trudności,czy to easy,normal lub hard uruchomi się gra na danym poziomie..

ja myślę żeby użyć tych zmiennych globalnych

 

„global.difficulty = 0” dla easy, 
„global.difficulty = 1” dla medium 
„global.difficulty = 2” dla hard.

Tylko teraz patrze funkcji

ds_list_create()

nie można użyć...

 

Co mam użyć żeby stworzyć menu poziomu trudności(nie mylić ze zwykłym menu)

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

w obj_poziomtrudnosci w nowym roomie (nie rób w tym samym pokoju, gdzie masz obj_menu, czy cokolwiek co Ci rysuje menu)

 


///Create
(nie mam pojęcia co robi gmt, jak nie zadziała, to spróbuj usunąć ten wyraz sprzed nawiasu)

options_difficulty=ds_list_create()
options_difficulty[|0]=gmt("Łatwy")
options_difficulty[|1]=gmt("Normalny")
options_difficulty[|2]=gmt("Wysoki")

selected=0

gp_up=false
gup_down=false
gp_left=false
gp_right=false

//Używane do animacji menu
animation_speed=room_speed/4
for(var i=0; i<ds_list_size(options_difficulty); i++) {
    animation[i]=0
}


///Step

if(abs(gamepad_axis_value(0,gp_axislv))<0.3 && !keyboard_check(vk_anykey))
    {
    gp_up=0
    gp_down=0
    }
    
if(abs(gamepad_axis_value(0,gp_axislh))<0.3 && !keyboard_check(vk_anykey))
    {
    gp_left=0
    gp_right=0
    }  

if(keyboard_check_pressed(vk_down) || gamepad_button_check_pressed(0,gp_padd) || (gamepad_axis_value(0,gp_axislv)>0.7 && !gp_up)) {
    selected++
    if(selected>=ds_list_size(options_difficulty)) {
        selected=ds_list_size(options_difficulty)-1
    }
    gp_up=true
}

if(keyboard_check_pressed(vk_up) || gamepad_button_check_pressed(0,gp_padu) || (gamepad_axis_value(0,gp_axislv)<-0.7 && !gp_down)) {
    selected--
    if(selected<0) {
        selected=0
    }
    gp_down=true
}

if(keyboard_check_pressed(vk_enter) || gamepad_button_check_pressed(0,gp_face1)) 
{
    if(selected == 0) then global.difficulty = 0; //ustaw latwy
    if(selected == 1) then global.difficulty = 1; //ustaw sredni
    if(selected == 2) then global.difficulty = 2; //ustaw trudny
}

 

///Draw

draw_set_valign(1)
draw_set_halign(1)
draw_set_font(fontIntro)

var line_height=ceil(string_height("M")*1.1)

for(var i=0; i<ds_list_size(options_difficulty); i++) {
    if(i=selected) {
        //Wybrana opcja
        animation[i]=clamp(animation[i]+(1/animation_speed),0,1)
    } else {
        animation[i]=clamp(animation[i]-(1/animation_speed),0,1)
    }
    var color=merge_colour(c_black,c_red,animation[i])
    draw_text_transformed_color(x,y+(line_height*i),options_difficulty[|i],1+animation[i]/5,1+animation[i]/5,0,color,color,color,color,1)
}


 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

dzięki

SimianVirus7;-)

 

gmt-to jest akurat funkcja ktora odwołuje się do skryptu odpowiedzialnego za tłumaczenia.Akurat nie ma problemu,bo do słownika dodałem tłumaczenie;-)

 

Jednak dalej coś robię nie tak:

 

wrzuciłem kod do create bohatera...

założenia sa na razie takie(potem dodam więcej założeń)

gracz wybierając poziom easy(łatwy) dostaje żyć 7 i energie ma 100%

na poziomie normalnym ma energii też 100% ale żyć już 5 oraz poziom trudy hard energia 50% żyć 3

 

używam zmiennych globalnych

global.live = 5;

global.hp = 100;

 

i wygląda to tak:

 

obj_bohater

 

Create

 

/// Glowne deklaracje zmiennych Anatola
                     
                     //////////////////////////////
                    ///////ZMIENNE STALE//////////
                    /////////////////////////////
///Ustawienia
event_inherited();
zbieranie=true;
eksplozja = false;
zasiegEksplozji = 22;
silaEksplozji = 10;

global.damage=0; //zmiena 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;


///poziomy trudnosci

global.difficulty = 0; //ustaw latwy
global.difficulty = 1; //ustaw sredni
global.difficulty = 2; //ustaw trudny


//easy difficult
if(global.difficulty  == "easy")
{
   global.hp = 100;
   global.live = 7;
}

//medium difficult
if(global.difficulty  == "medium")
{
   global.hp = 80;
   global.live = 5;
}

//hard difficult
if(global.difficulty  == "hard")
{
    global.hp = 50;
    global.live = 3;
    
   
}

teraz obj_poziomy (
on jest w odrębnym pokoju)

 

CREATE

 

options_difficulty=ds_list_create()
options_difficulty[|0]=("Easy")
options_difficulty[|1]=("Medium")
options_difficulty[|2]=("hard")

selected=0

gp_up=false
gup_down=false
gp_left=false
gp_right=false

//Używane do animacji menu
animation_speed=room_speed/4
for(var i=0; i<ds_list_size(options_difficulty); i++) {
    animation[i]=0
}

STEP

 

if(abs(gamepad_axis_value(0,gp_axislv))<0.3 && !keyboard_check(vk_anykey))
    {
    gp_up=0
    gp_down=0
    }
    
if(abs(gamepad_axis_value(0,gp_axislh))<0.3 && !keyboard_check(vk_anykey))
    {
    gp_left=0
    gp_right=0
    }  

if(keyboard_check_pressed(vk_down) || gamepad_button_check_pressed(0,gp_padd) || (gamepad_axis_value(0,gp_axislv)>0.7 && !gp_up)) {
    selected++
    if(selected>=ds_list_size(options_difficulty)) {
        selected=ds_list_size(options_difficulty)-1
    }
    gp_up=true
}

if(keyboard_check_pressed(vk_up) || gamepad_button_check_pressed(0,gp_padu) || (gamepad_axis_value(0,gp_axislv)<-0.7 && !gp_down)) {
    selected--
    if(selected<0) {
        selected=0
    }
    gp_down=true
}

if(keyboard_check_pressed(vk_enter) || gamepad_button_check_pressed(0,gp_face1)) 
{
    if(selected == 0) then global.difficulty = 0; //ustaw latwy
    room_goto(inicjacja)
    if(selected == 1) then global.difficulty = 1; //ustaw sredni
    room_goto(inicjacja)
    if(selected == 2) then global.difficulty = 2; //ustaw trudny
    room_goto(inicjacja)
}

DRAW

 

draw_set_valign(1)
draw_set_halign(1)
draw_set_font(fontIntro)

var line_height=ceil(string_height("M")*1.1)

for(var i=0; i<ds_list_size(options_difficulty); i++) {
    if(i=selected) {
        //Wybrana opcja
        animation[i]=clamp(animation[i]+(1/animation_speed),0,1)
    } else {
        animation[i]=clamp(animation[i]-(1/animation_speed),0,1)
    }
    var color=merge_colour(c_black,c_red,animation[i])
    draw_text_transformed_color(x,y+(line_height*i),options_difficulty[|i],1+animation[i]/5,1+animation[i]/5,0,color,color,color,color,1)
}

Gra się uruchamia wybieram poziom łatwy normalny i trudny i nadal jest jak było..jakikolwiek poziom bym wybrał to mam pełną energię i tyle żyć ile miałem cały czas na początku gry.

Coś źle robię chłopaki..

 

A może też zamiast wrzucać ten kod do bohatera to stworzyć odrębny obiekt nazwać go np obiekt_poziomytrudnosci i w nim wrzucić kod z bohatera i od razu kod z wrogów? no sam nie wiem  z tym pomyślę..tylko teraz mam problem,że to nie działa.

 

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

O Matko Boska Elektryczna, coś Ty za młyn tam narobił. Wybieranie Ci nic nie da, skoro za każdym tworzeniem bohatera, ustawiasz global.difficulty = 2; W obiekcie bohatera, masz mieć skrypty tylko z kodem, który sprawdza jaki jest poziom trudności. Do tego w większości używasz if'a. Żadnych global.difficulty = cokolwiek!

Przed rozpoczęciem gry (a przynajmniej tak mi się wydaje, że taki masz zamiar) gracz ma określić jaki ma być poziom trudności, a później dopiero ma się zacząć gra. Czyli:
Menu gry -> wybierane trudności -> rozgrywka (pojawienie się bohatera)

Ten cały kod który Ci napisałem (a raczej przerobiłem twój), masz dać do innego obiektu, choćby obiekt_poziomytrudnosci. Pamiętaj, że kod wybierania trudności gry, ma być przed pierwszym pojawieniem się bohatera w grze, bo inaczej wywali błąd. Oczywiście możesz się przed tym zabezpieczyć.

///Create bohatera - kod na sprawdzanie poziomu gry
 

///poziomy trudnosci

/*tutaj wyrzuciłem Ci to, co przeszkadzało*/

//Ustaw domyślne wartości życia i szans, gdyby nie wyszukało jaki jest poziom trudności
global.hp = 100;
global.live = 7;

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

//easy difficult
if(global.difficulty  == "easy")
{
   global.hp = 100;
   global.live = 7;
}

//medium difficult
if(global.difficulty  == "medium")
{
   global.hp = 80;
   global.live = 5;
}

//hard difficult
if(global.difficulty  == "hard")
{
    global.hp = 50;
    global.live = 3;
    
   
}


 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

hit miesiaca, ustawiać w kodzie po kolei każdy poziom trudności tak, że ustawi się zawsze ostatni. Pomyśl na spokojnie co tam piszesz, linijka po linijce mów na głos - to jest dokładnie to co gra zrobi w jedną klatkę obrazu.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Właśnie widze jaki numer odwaliłem kurcze

W swoim kodzie resetowałem zmienne w obj_bohater a to cofało prace wykonaną przez obj_poziomtrudnosci..

 

Wywaliłem to z obj_bohater

 

global.difficulty = 0; //ustaw latwy
global.difficulty = 1; //ustaw sredni 
global.difficulty = 2; //ustaw trudny

 

Niemniej poprawiłem to w taki sposób jaki mi pokazaliście i nadal to samo..bez względu jaki wybiore na nowej planszy poziom gry to i tak gra uruchamia Mi się w normalny sposób czyli z taką samą ilością żyć i energii jak było wcześniej..

Macie rację

I tak właśnie jest

Menu gry -> wybierane trudności -> rozgrywka (pojawienie się bohatera)
I osobny obiekt w pokoju do wyboru poziomu trudnosci...

obj_poziomtrudnosci zreszta byl wczesniej pod nazwa obj_poziomy zmienilem tylko nazwe ale to szczegol.

 

 

 

obj_bohater

 

Create

 

/// Glowne deklaracje zmiennych Anatola
                     
                     //////////////////////////////
                    ///////ZMIENNE STALE//////////
                    /////////////////////////////
///Ustawienia
event_inherited();
zbieranie=true;
eksplozja = false;
zasiegEksplozji = 22;
silaEksplozji = 10;

global.damage=0; //zmiena 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;

///poziomy trudnosci

//Ustaw domyślne wartości życia i szans, gdyby nie wyszukało jaki jest poziom trudności
global.hp = 100;
global.live = 7;

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

//easy difficult
if(global.difficulty  == "easy")
{
   global.hp = 100;
   global.live = 7;
}

//medium difficult
if(global.difficulty  == "medium")
{
   global.hp = 80;
   global.live = 5;
}

//hard difficult
if(global.difficulty  == "hard")
{
    global.hp = 50;
    global.live = 3;
    
   
}

 

obj_poziomtrudnosci (jest umieszczony w osobnym roomie)

 

CREATE

 

options_difficulty=ds_list_create()
options_difficulty[|0]=("Easy")
options_difficulty[|1]=("Medium")
options_difficulty[|2]=("hard")

selected=0

gp_up=false
gup_down=false
gp_left=false
gp_right=false

//Używane do animacji menu
animation_speed=room_speed/4
for(var i=0; i<ds_list_size(options_difficulty); i++) {
    animation[i]=0
}

 

STEP

 

if(abs(gamepad_axis_value(0,gp_axislv))<0.3 && !keyboard_check(vk_anykey))
    {
    gp_up=0
    gp_down=0
    }
    
if(abs(gamepad_axis_value(0,gp_axislh))<0.3 && !keyboard_check(vk_anykey))
    {
    gp_left=0
    gp_right=0
    }  

if(keyboard_check_pressed(vk_down) || gamepad_button_check_pressed(0,gp_padd) || (gamepad_axis_value(0,gp_axislv)>0.7 && !gp_up)) {
    selected++
    if(selected>=ds_list_size(options_difficulty)) {
        selected=ds_list_size(options_difficulty)-1
    }
    gp_up=true
}

if(keyboard_check_pressed(vk_up) || gamepad_button_check_pressed(0,gp_padu) || (gamepad_axis_value(0,gp_axislv)<-0.7 && !gp_down)) {
    selected--
    if(selected<0) {
        selected=0
    }
    gp_down=true
}

if(keyboard_check_pressed(vk_enter) || gamepad_button_check_pressed(0,gp_face1)) 
{
    if(selected == 0) then global.difficulty = 0; //ustaw latwy
    room_goto(inicjacja)
    if(selected == 1) then global.difficulty = 1; //ustaw sredni
    room_goto(inicjacja)
    if(selected == 2) then global.difficulty = 2; //ustaw trudny
    room_goto(inicjacja)
}

 

DRAW

 

draw_set_valign(1)
draw_set_halign(1)
draw_set_font(fontIntro)

var line_height=ceil(string_height("M")*1.1)

for(var i=0; i<ds_list_size(options_difficulty); i++) {
    if(i=selected) {
        //Wybrana opcja
        animation[i]=clamp(animation[i]+(1/animation_speed),0,1)
    } else {
        animation[i]=clamp(animation[i]-(1/animation_speed),0,1)
    }
    var color=merge_colour(c_black,c_red,animation[i])
    draw_text_transformed_color(x,y+(line_height*i),options_difficulty[|i],1+animation[i]/5,1+animation[i]/5,0,color,color,color,color,1)
}

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Dobrze, błąd widać od razu, ale teraz dam Ci pogłówkować, tak minimalnie.

Zobacz sobie, co przypisujesz do zmiennej global.difficulty w obj_poziomtrudnosci, a co sprawdzasz w obj_bohater.

ps: i może rzeczywiście, tak jak mistrzu Gnysek napisał, powiedz to sobie głośno. Ja tak też czasami muszę robić, kiedy nie mogę znaleźć błędu.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

hmmmm...:-)

 

w bohaterze jest np:

 

global.difficulty  == "easy"

a w obj_poziomtrudnosci jest np:

 

global.difficulty = 0;

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

No to chyba logiczne, co robisz źle :) tu cyfry, tu tekst

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Chłopaki działa teraz elegancko;-) Gamoń dał radę:-)

ustawiłem sobie nawet na danym poziomie w w create wroga żeby mu więcej lub mniej hp zabierało;-)

Utkwiłem na problemie związanym może błahostka,ale walczę z tym od kilku godzin z szybkością jaką poruszają się wrogowie..

używałem image_speed oraz hspeed,speed i niestety nie mogę przyspieszyć wroga.

A założenie mam takie że np na poziomie easy wróg chodzi tak jak chodził na poziomie normal wróg przyspieszy np o 2 razy więcej niż na poziomie easy i na poziomie hard o 4 razy szybciej niż na poziomie easy.

 

I druga sprawa...to  chciałbym aby wrogowie na poziomie normal i hard zabierali mi wiecej energii...

Obecnie jest tak,że bohater jest na 6 strzałów;-) chciałbym żeby na poziomie normalnym był na 4 strzały,a na poziomie trudnym na 3 strzały..

Kod bohatera nie będę wklejał,bo jest ten co wyżej tylko poprawiony o te zmienne;-)

 

przykładowy kod wroga

 

obj_bandyta

 

CREATE

 

///Ustawienia
event_inherited();

pointvalue=choose(10,20,30,40,50,60,70,80,90,100);//dodaje nam losowa ilosc pkt
dead=false;
follow=0

hp = 10;
maxHp = 10;
global.zegarObrazenWroga = 0;
at=1

st=1

//pozycje powrotu wroga po restarcie mapy
start_x = x; 
start_y = y;

enum stan {
    patrol,
    wait,
    follow
}
action=stan.patrol




///poziomy trudnosci


//easy difficult
if global.difficulty  = "easy"
{
   hp = 10;
}

//medium difficult
if global.difficulty  = "medium"
{
   hp = 15;
}

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

    hp = 20;
    

}

 

 

STEP

 

if(instance_exists(obj_player) && action!=stan.patrol && collision_line(x,y,obj_player.x,obj_player.y,obj_niewidzialny,0,1)) {
    if(follow>room_speed/2) {
        follow=0
    }
    image_speed=0
    image_index=0
    action=stan.wait
} else if (instance_exists(obj_player) && distance_to_object(obj_player)<=250 && abs(y-obj_player.y)<64 && follow>=room_speed/2 && image_xscale-sign(obj_player.x-x)=0 && !collision_line(x,y,obj_player.x,obj_player.y-12,obj_niewidzialny,0,1)) {
    action=stan.follow
    follow=30
} 

if(action=stan.wait) {
    image_speed=0
    image_index=0
    follow++
    if(follow>room_speed/2) {
        action=stan.patrol
        follow=0
    }
} else {
    image_speed=0.3
}

if(action=stan.patrol) {
    follow++
}

if (place_free(x,y+1))
{gravity = 0.5}
else
{gravity = 0}

if at=1
{
at=2
speed=4
}

if at=2 {
    if (hspeed<0) {
        image_xscale = -1;
        if (!place_meeting(x-30,y+10,par_solid ) or place_meeting(x-1,y,par_solid )) {
            speed*=-1
            st=1
            if(action=stan.follow) {
                action=stan.wait
            }
        }
    } else if (hspeed>0) {
        image_xscale = 1;
        if (!place_meeting(x+30,y+10,par_solid ) or place_meeting(x+1,y,par_solid )) {
            speed*=-1
            st=2
            if(action=stan.follow) {
                action=stan.wait
            }
        }
    }
}

//Podazanie za graczem
if(action=stan.follow && follow>0) {
    follow=max(0,follow-1)
    if(instance_exists(obj_player) && distance_to_object(obj_player)>3) {
        move_towards_point(obj_player.x,y,min(5,abs(obj_player.x-x)));
    }
} else if(action=stan.patrol && distance_to_point(xstart,ystart)>2) {
    speed=4
} else if(action=stan.wait) {
    speed=0
}

//ginie wrog
if hp<0
{
instance_destroy()
}


//Gdy wrog zostaje atakowany mruga
if global.zegarObrazenWroga > 0 {
 visible = !visible;
 global.zegarObrazenWroga -= 1;
} else {
 visible = true;
}

if hp <= 0  {
 
 instance_destroy();
 
 dead = true; //wywolujemy alarm gdy wrog jest martwy
 
  
 //tworzymy losowa ilosc punktow po zabiciu wroga,oraz napis,ktory sie nad nim wyswietla z iloscia punktow losowych 
  z = instance_create(x,y-10,obj_floating_txt);
  global.pScore+=pointvalue
  z.txt = "$" + string(pointvalue);
  z.yspeed = -4;
  
  
  
  //instance_create(x,y-50,choose(obj_coin,obj_diamencik,obj_trzy_poduszki,obj_serducho,obj_motyl,obj_gwiazdka,obj_ksiezyc)) // daje losowy item np monety albo jabłuszka
  with instance_create(x,y,obj_entity_die) with instance_create(x,y,obj_bandyta_ginie)  {
  //sprite_index = sprWrogGinie;  //sprite do poruszania sie wroga
  image_xscale = other.image_xscale;
  image_yscale = other.image_yscale;
  hspd = other.hspd;
  vspd = other.vspd;
    audio_play_sound(dzwiek_wrog_ginie, 1, false); //odtwarzamy dzwiek przy smierci wroga
 }
}

// czasowy respawn wrogow troche pomeczyles sie ale dziala jak trzeba :)
if (dead == true)
{
 //obj_spawn.dead = true; //respawn zabitego wroga jak nie bedzie dzialac to wtedy dead=true i wpisac instance_create(x,y,obj_spawn)
 
 instance_create(x,y,obj_spawn_bandyta);

}

 

 

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

zamiast "easy" itp. możesz też enuma zrobić. Bo potem łatwo o literówkę, a tak kompilator/sprawdzanie składni wykrywa błąd.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

 

image_speed,speed,hspd,hspeed

 

 

Nie działa:-/ coś źle robię...

Wróg nie chce przyspieszyć na poziomie medium i hard.

 

Druga sprawa:

Żeby wróg zabierał mi energię w takiej ilości zależne od poziomu trudności gry to rozumiem,że mam użyć zmiennej global.hp od bohatera tylko to ma się znajdować w CREATE wroga? 

 

Poziom easy zostaje bez zmian po 6 spotkaniach z wrogiem  lub strzałach tracę życie

 

Poziom medium bohater po 4 spotkaniach z wrogiem lub strzałach traci życie

 

Poziom hard bohater po 3 spotkaniach z wrogiem lub strzałach traci życie

 

 

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Global oznacza , że taka zmienną jest jedna współdzielona na całą grę. Jak ja dasz w przeciwnikach, to wszystkim na raz zmienisz, to bez sensu.

 A hspeed czy vspeed są zależne od speed i direction, więc jak zmieniasz tamte zmieniają się te (albo jak jakoś kod powoduje ich zmianę). To są współbieżne zmienne - zmiana jednych zmienia drugie i vice versa.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Reasumując Gnysku Piotrze...czyli rozumiem,że jak chcę osiągnąć wyżej zamierzony efekt to używam zmiennych w CREATE bohatera.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Może być. Ja akurat takie zmienne definuję wcześniej, na początku gry, to wtedy można je przenosić pomiędzy poziomami.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Create - wszystko co tam napiszesz jest wykonywane przy pojawieniu się instancji (każdego obiektu na mapie nawet jeśli jest taki sam). Także hp, zmienna dla speed, energia może tam być zdefiniowana.

 

Step - kod wykonywany przy każdej klatce gry (fps). Czyli, cały kod poruszania się, zadawania obrażeń itp

Jeśli masz w kodzie napisane tak że 

"If(keyboard_check(vk_right)) 

{

     hspeed = 3

}

To musisz zrobić tam to samo sprawdzenie co przy definiowaniu hp, czyli

"

If(global.difficulty == "easy")

{

     If(keyboard_chceck(vk_right))

     {

           hspeed = 3

     }

}

"

 

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

×