Skocz do zawartości

Hi-score w menu


PanciK

Rekomendowane odpowiedzi

Najlepiej chyba ini z szyfrowaniem, no nie??? albo zmienne globalne a po kliknięciu "Exit" save do pliku i przy kolejnym uruchamianiu load -> Ja takie metody stosuję jak chce, żeby dane przetrwały >1 uruchomienie, ew. jeszcze można za pomocą rejestru, ale to odradzam.

Odnośnik do komentarza
Udostępnij na innych stronach

Miałem bajerowy przykład zrobić, ale nie mam ochoty i przez to kolejny zbędny post...

 

Dodanie wyniku:

GML
_max = 10;

_nick = get_string( "Podaj nick:", "Pental" );

highscore_add( _nick, global._score );

Wyświetlanie:

GML
for ( _i = 0; _i < _max; _i += 1; )

{

draw_set_color( c_blue );

draw_set_halign( fa_left );

draw_text( x, y + 20 * _i, highscore_name( _i ) );

draw_set_halign( fa_right );

draw_text( x + 250, y + 20 * _i, highscore_value( _i ) );

}

Raczej działa ;) .

 

Można by było to nieco zoptymalizować, np. najpierw wyświetlanie wyniku, potem nicku, to by uniknęło potem ciągłego używania tej funkcji. I sprawdzanie czy wynik ostatni (używając zmiennej _max) nie jest większy od zmiennej, to by uniknęło ciągłego dodawania wyników :P .

 

@Up: Najlepiej na gotowych funkcjach, same gdzieś to zapisują i nie trzeba pisać własnego systemu dodawania wyniku, a to wcale takie proste nie jest, jeśli ma być jeszcze sortowanie wg. daty, pierwszej litery, itp.

Odnośnik do komentarza
Udostępnij na innych stronach

No Pental niezle :). Tylko, ze pkt dodaje od drugiego miejsca w tabeli wiec wyglada to tak:

nobody 0

Gracz 5

nobody 0

etc.

Wyskakuje tez błąd

ERROR in

action number 1

of Create Event

for object object0:

 

Error in code at line 3:

highscore_add( _nick, global._score );

 

at position 31: Unknown variable _score

Odnośnik do komentarza
Udostępnij na innych stronach

O jedną wartość w tył :/ . Zaraz poprawię, pracuję nad nową wersją.

 

@Edit: Nowa wersja gotowa, jeszcze tylko zapis do pliku i odczyt :P .

 

GML
// tworzenie tabeli

global._max = 5;

 

global.l[0] = 5;

global.l[1] = 4;

global.l[2] = 3;

global.l[3] = 2;

global.l[4] = 1;

 

global.n[0] = "try";

global.n[1] = "ytgf";

global.n[2] = "gffgdg";

global.n[3] = "gfdf";

global.n[4] = "gggg";

 

// punkty

global._score = round( random( 10 ) );

 

// podawanie nicka

_nick = get_string( "Podaj nick:", "Pental" );

 

// dodawanie wyniku (skomplikowana sprawa;P)

if ( global._score ) && ( global._score > global.l[global._max - 1] )

{

for( _i = global._max - 1; _i >= 0; _i -= 1; )

{

if ( global._score <= global.l[_i] )

{

for( _j = 0; _j < _i; _j += 1; )

{

global.l[_j] = global.l[_j + 1];

global.n[_j] = global.n[_j + 1];

}

 

global.n[_i] = _nick;

global.l[_i] = global._score;

 

// koniec petli

break;

}

 

}

}

Wyświetlanie bez zmian, musisz troszkę zaczekać.

Odnośnik do komentarza
Udostępnij na innych stronach

Create:

GML
// tworzenie tabeli

global._max = 5;

_sx = "ile";

_sy = "nick";

 

if ( !file_exists( 'high.txt' ) )

{

ini_open( 'high.txt' );

 

for( _i = global._max - 1; _i >= 0; _i -= 1; )

ini_write_string( _sx, string( _i ), "0" );

for( _i = global._max - 1; _i >= 0; _i -= 1; )

ini_write_string( _sy, string( _i ), "brak" );

 

ini_close();

}

 

ini_open( 'high.txt' );

 

for( _i = global._max - 1; _i >= 0; _i -= 1; )

global.l[_i] = real( ini_read_string( _sx, string( _i ), "0" ) );

for( _i = global._max - 1; _i >= 0; _i -= 1; )

global.n[_i] = ini_read_string( _sy, string( _i ), "brak" );

 

ini_close();

 

// punkty

global._score = round( random( 10 ) );

 

// podawanie nicka

_nick = get_string( "Podaj nick:", "Pental" );

 

// dodawanie wyniku

if ( global._score ) && ( global._score > global.l[global._max - 1] )

{

for( _i = global._max - 1; _i >= 0; _i -= 1; )

{

if ( global._score <= global.l[_i] ) || ( _i == 0 )

{

for( _j = 0; _j < _i; _j += 1; )

{

global.l[_j] = global.l[_j + 1];

global.n[_j] = global.n[_j + 1];

}

 

global.n[_i] = _nick;

global.l[_i] = global._score;

 

// koniec petli

break;

}

}

}

Draw tak samo jak na początku. Są bugi. Jutro poprawię ;p .

Odnośnik do komentarza
Udostępnij na innych stronach

Ok, wszystko naprawione.

 

Create:

// tworzenie tabeli

// maksymalna ilosc wynikow
global._max = 7;
_sx = "ile";
_sy = "nick";

if ( !file_exists( 'high.txt' ) )
{
    ini_open( 'high.txt' );

    for( _i = global._max - 1; _i >= 0; _i -= 1; )
        ini_write_string( _sx, string( _i ), "0" );
    for( _i = global._max - 1; _i >= 0; _i -= 1; )
        ini_write_string( _sy, string( _i ), "brak" );

    ini_close();
}

ini_open( 'high.txt' );

for( _i = global._max - 1; _i >= 0; _i -= 1; )
    global.l[_i] = real( ini_read_string( _sx, string( _i ), "0" ) );
for( _i = global._max - 1; _i >= 0; _i -= 1; )
    global.n[_i] = ini_read_string( _sy, string( _i ), "brak" );

ini_close();

// punkty
global._score = floor( random( 100 ) );

// podawanie nicka
_nick = get_string( "Podaj nick:", "Pental" );

// dodawanie wyniku
if ( global._score ) && ( global._score > global.l[global._max - 1] )
{
    for( _i = global._max - 2; _i >= 0; _i -= 1; )
    {
        if ( global.l[_i] >= global._score ) || ( !_i && global._score >= global.l[0] )
        {
            if ( _i ) || ( !_i && global._score <= global.l[0] )
                _i += 1;
                
            for( _j = global._max - 1; _j > _i; _j -= 1; )
            {
                global.l[_j] = global.l[_j - 1];
                global.n[_j] = global.n[_j - 1];
            }
            
            global.l[_i] = global._score;
            global.n[_i] = _nick;
            
            break;
        }
    }
}

// zapis tabelki
ini_open( 'high.txt' );

for( _i = global._max - 1; _i >= 0; _i -= 1; )
    ini_write_string( _sx, string( _i ), string( global.l[_i] ) );
for( _i = global._max - 1; _i >= 0; _i -= 1; )
    ini_write_string( _sy, string( _i ), global.n[_i] );
    
ini_close();

Draw:

for ( _i = 0; _i < global._max; _i += 1; )
{
    draw_set_color( c_blue );
    draw_set_halign( fa_right );
    draw_text( x + 250, y + 20 * _i, global.l[_i] );
    draw_set_halign( fa_left );
    draw_text( x, y + 20 * _i, global.n[_i] );
}

 

By wyczyścić "ręcznie" tabelę, usuń plik high.txt . Zrobię jeszcze kodowanie, bo zaraz Tymon się przyczepi :P .

Odnośnik do komentarza
Udostępnij na innych stronach

Ehhh cos mi nie dziala :P nie wiem moze ja cos zle robie :P

Przy podawaniu nick'a dodaje mi ilosc pkt z przedzialu 1-100 (nawet jesli mialem 0 pkt) a rzeczywista ilosc pkt traci sie nie wiadomo gdzie :P

Bylbym Ci jeszcze bardziej wdzieczny gdybys mogl mi dac gotowy przyklad :P

Odnośnik do komentarza
Udostępnij na innych stronach

  • 7 lat później...

Cześć wszystkim posłużyłem się tutaj przykładem kolegów odnośnie wyświetlania tabelki w menu:

I mam takie pytania do tego tematu:

 

Wchodzę do menu,gdzie umieściłem sobie obiekt tabelka_highscore,wpisuje imię i jest pusto.

Rozumiem,że to oczywiste,no bo przecież trzeba jeszcze zmienną utworzyć w obiekcie,gdzie mam życia,punkty,hud itp,i wtedy domyślam się,że się wyświetli lista wyników w menu gry po ukończeniu planszy,czy utracie żyć..

Dokładnie chciałbym tak,że jak uzyskam już jakieś tam punkty w grze no i np zginę,to żeby wyświetlił mi się możliwość wpisu swojego imienia i ta tabelka co w menu,ale to musiałaby się wyświetlić przed planszą game over,no chyba,że wpis najlepszych 7 graczy będzie zapełniony,a mój wynik będzie zbyt mały żeby dokonać wpisu to się nie wyświetli i nie dokona się wpis.

 

kod na tą tabelkę w menu,gdzie wchodzę i wyświetlać ma się lista najlepszych graczy

 

obj_tabelka_highscore

Create

 

 

GML
// tworzenie tabelki z wynikami

// ilosc wynikow

global._max = 7;

_sx = "ile";

_sy = "nick";

 

if ( !file_exists( 'high.txt' ) )

{

ini_open( 'high.txt' );

 

for( _i = global._max - 1; _i >= 0; _i -= 1; )

ini_write_string( _sx, string( _i ), "0" );

for( _i = global._max - 1; _i >= 0; _i -= 1; )

ini_write_string( _sy, string( _i ), "brak" );

 

ini_close();

}

 

ini_open( 'high.txt' );

 

for( _i = global._max - 1; _i >= 0; _i -= 1; )

global.l[_i] = real( ini_read_string( _sx, string( _i ), "0" ) );

for( _i = global._max - 1; _i >= 0; _i -= 1; )

global.n[_i] = ini_read_string( _sy, string( _i ), "brak" );

 

ini_close();

 

// punkty

global.pScore = score;

 

// podawanie nicka

_nick = get_string( "Podaj nick:", "Pioter" );

 

// dodawanie wyniku

if ( global.pScore ) && ( global.pScore > global.l[global._max - 1] )

{

for( _i = global._max - 2; _i >= 0; _i -= 1; )

{

if ( global.l[_i] >= global.pScore ) || ( !_i && global.pScore >= global.l[0] )

{

if ( _i ) || ( !_i && global.pScore <= global.l[0] )

_i += 1;

 

for( _j = global._max - 1; _j > _i; _j -= 1; )

{

global.l[_j] = global.l[_j - 1];

global.n[_j] = global.n[_j - 1];

}

 

global.l[_i] = global.pScore;

global.n[_i] = _nick;

 

break;

}

}

}

 

// zapis tabelki

ini_open( 'high.txt' );

 

for( _i = global._max - 1; _i >= 0; _i -= 1; )

ini_write_string( _sx, string( _i ), string( global.l[_i] ) );

for( _i = global._max - 1; _i >= 0; _i -= 1; )

ini_write_string( _sy, string( _i ), global.n[_i] );

 

ini_close();

 

 

Draw

 

GML
for ( _i = 0; _i < global._max; _i += 1; )

{

draw_set_color( c_blue );

draw_set_halign( fa_right );

draw_text( x + 250, y + 20 * _i, global.l[_i] );

draw_set_halign( fa_left );

draw_text( x, y + 20 * _i, global.n[_i] );

}

 

no i teraz tak obiekt w którym mam zmienne punkty,życia itp ,oraz hud.

 

obj_game_controller

 

Create

 

GML
//Ustawienia globalne

image_speed = 0;

 

global.watch = 0; //ustawiamy globalnie na 0 w celu ich dalszego sumowaniu umozliwjajacego przejscie do nastepnej planszy po zebraniu ich odpowiedniej ilosci

global.pScore = 0;

global.life = 5;

global.coins = 0;

global.Saved = true;

globalvar spawnX, spawnY;

 

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

 

 

tu step mojego bohatera

 

GML
if(instance_number(obj_napis_plansz)=0)// zatrzymuje sprita bohatera na czas wyswietlenia napisu Stage

{

 

 

 

if (vspd > 25) //Jesli predkosc spadania jest szybsza niz 25 (Mozna dowolnie zmieniac ta wartosc.)

{global.damage+=4} //Zwiekszenie obrazen o wartosc 1. (Zmienienie liczby na wieksza zwiekszy zadawane obrazenia po upadku.)

if not place_free(x,y+1) //Jesli w poblizu nas jest jakis obiekt rowniez zostana zadane obrazenia

{

other.hp-=global.damage //Odejmujemy punkty zycia od wartosci zadanych obrazen.

global.damage=0 //Resetujemy zadawanie obrazen po uderzeniu w ziemie by nie zabieralo go wiecej

}

else if (vspd >35)

{

other.hp = -100; //natychniastowa smierc po upadku z ogromnej wysokosci

}

 

 

//Upadek z ogromnej wysokosci zabiora zycie,gdy energia osiagnie wartosc zero

if( hp <= 0 )

{

hp = 100;

global.life -= 1;

audio_play_sound(dzwiek_bohater_ginie, 1, false);

x = start_x;

y = start_y;

}

 

if( global.life <= 0 )

{

room_goto(rm_game_over); //pokoj,gdzie ma sie akcja gry przeniesc po koncu gry

}

 

///Kontrola

if !place_meeting(x,y,obj_water) {

//Normalny ruch

if climbing == false {

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

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

jumpStr = 3;

//Zeskakiwanie w dol

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 {

audio_play_sound(dzwiek_skoku_bohatera, 1, false); //odtwarzamy dzwiek przy skakaniu

vspd -= 2+sign(pwrupJmp);

jumpStr--;

 

} else {

if keyboard_check_released(kJump) && jumpStr > 2 {

vspd += 2+sign(pwrupJmp);

 

}

jumpStr = 0;

}

 

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

if keyboard_check(kDown) {

attClock = 16;

curAttack = 1;

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

hspd = other.image_xscale*10;

vspd = 0; //lekko do gory -4 //mocno do gory

g = .0; //0.2 tor lotu paraboliczny

owner = par_player;

strength = 0;

explode = true;

explosionRadius = 30;

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

//image_blend = c_black; //kolor lotu pocisku

audio_play_sound(dzwiek_bohater_strzela, 1, false); //odtwarzamy dzwiek przy strzelaniu

}

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

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;

}

}

//Wspinanie sie

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 { //plywanie do gory

vspd = -12;

}

}

}

 

 

a tu kod kolizji gracza z przykładowym wrogiem..

 

obj_wrog

 

GML
///Obrazenia jakie wrog zadaje bohaterowi

if !vspd > 0 && hurtClock == 0 && other.hurtClock == 0 && sign(x-other.x) == other.image_xscale {

hp -= 15;

hurtClock = room_speed;

vspd = -8;

hspd = sign(x-other.x)*16;

}

 

if( hp <= 0 )

{

hp = 100;

global.life -= 1;

x = start_x;

y = start_y;

}

 

if( global.life <= 0 )

{

room_goto( rm_game_over ); //pokoj,gdzie ma sie akcja gry przeniesc po koncu gry

}

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