Milord
-
Postów
30 -
Dołączył
-
Ostatnia wizyta
Typ zawartości
Profile
Forum
Wydarzenia
Odpowiedzi opublikowane przez Milord
-
-
Aj,bo się zamotałem jak chłop w sądzie;)tego nie mam mam to Hmmm sumują mi się punkty w poszczególnych levelach pierwszego świata,ale mam na myśli tak jak mowie Maxiu;) że statystyka nie że się wyświetli na końcu każdego levelu,tylko dopiero na końcu 4 levelu;)
czyli muszę chyba w draw narysować tabelke z podsumowaniem wyników..że tyle mam pkt tyle zabitych wrogów tyle monet..;)
w create dałem tam tak;)
GMLglobal.Zabitych[0]=0;global.Zabitych[1]=0;
global.Zabitych[2]=0;
global.Zabitych[3]=0;
//global.pScore[1]=ilosc_punktow;// ilosc punktow wpisuje 0; ??
sa 4 plansze to żeby podsumował mi je wszystkie,ale wyświetlił je jak skończe czwartą plansze tą stytystykę
we wrogach tam gdzie giną dałem ta linijkę
obj_bandyta
GMLglobal.Zabitych[0]++;obj_nerwus
GMLglobal.Zabitych[1]++;Ps.Diamenty i inne pierdołu ja już ogarnę,na wzór przecież mam tablice z wrogami;)
Chodzi mi głównie o punkty i ilość zabitych wrogów,gdzie wyświetli mi się to na końcu 4 planszy jak już ją skończe;)
czyli coś w draw musze stworzyć taką tabelkę,gdzie w osobnym roomie wyświetli mi się ta stystyka,a potem będę mogł spokojnie przejść do świata drugiego;)
Teraz Max von Gammer rozumie mnie;D?
-
W tym samym, nie ma potrzeby tworzenia nowego ;)
W level wpisuj lepiej nr. levelu.
Np. dla level 1 teorytycznie robisz:
GMLglobal.pScore[1]
I może tak być jak wyżej, ale jeszcze lepiej jak zrobisz:
GMLglobal.pScore[0] /*0 dlatego że indeksuje się tablice od 0, więc zaczynając od 1 marnujemy cenny element.
Wyliczasz to w prosty sposób, musisz cofnąć o 1 do tyłu, czyli odejmujesz jeden.
W skrócie w nawias kwadratowy wpsujesz numer levelu-1 */
W prawdzie powinno działać także jakbyś podał nazwę roomu(bo nazwa zwraca tak na prawdę ID zasobu które jest liczbą), ale ominąłbyś prawdopodobnie wiele elementów pozostawiając je pustymi i byłby problem z wyświetlaniem(musiałbyś sprawdzać ID danego roomu). Ale to nie istotne nie chce Ci mieszać w głowie. Po prostu wpisujesz nie nazwę roomu tylko numer levelu(liczbę)-1 ;)
GMLglobal.pScore[numer_levelu-1]=ilosc_punktow;
Maxiu już mi trochę namieszałeś;) dobra próbuje to złożyć w jedną całość;) robie w create obj game controller tak;)
dodaje do istniejących zmiennych to:
create
GMLglobal.pScore[-1]//jak dam -1 to znaczy,że podsumuje mi wszystkie pkt z lewelu już skończonegoTeraz tak..to zostaje w tym obiekcie global game controller
no i tworze sobie nowy room..i teraz w nim chce żeby wyświetliło mi się podsumowanie..
Max;) czyli mi tylko chodzi,że mając 4 levele chce żeby dopiero po 4 levelu wyskoczyło info w postaci nowej planszy o ilości zabitych wrogow,zdobytych punktow i ilosci zebranych monet.
Nie musi mi co ukończona plansza pokazywać tą statystykę,tylko co ukończony każdy świat;) a światy mam podzielone na 4 plansze;)
czyli wtedy robi tak
global.pScore[-4] // o ile to dobrze zrozumiałem;)
a nazwy leveli mam takie;)
room_world1_4
room_world2_4
room_world3_4
room_world4_4
i po pokoju room_world4_4 niech pojawi się ta statystyka przed światem kolejnym czyli room_world2_1 statystyka hmmm może być w osobnym roomie.
A wrogowie nazywają się następująco
obj_bandyta
obj_nerwus
obj_czolg
obj_smok
-
No tak, robisz np. drugą tablice GMLglobal.Punkty[level]=ilość punktów;
Swoją drogą możesz zrobić to optymalniej ciut na dwumiarowej tablicy i wtedy:
GMLglobal.Podsumowanie[rodzaj, typ/level] = wartość;
I jako rodzaj podajesz sobie np.:
dla podsumowania zabitych - 0,
dla podsumowania punktów - 1;
W drugim miejscu(jako drugi wymiar) podajesz typ npc-ta/numer levelu.
Szczególnie może się przydać jak chcesz potem zrobić jeszcze podsumowanie np.: diamentów zebranych, czasu przejścia danego levela itp. i musiałbyś tworzyć kilka zmiennych jedno wymiarowych ;)
hmmm...powolutku Max von Gamming;)
a,wiec tak
w create obiektu tam,gdzie mam już definiowane zmienne wrzucam;)
GMLglobal.Zabitych[0]=0; //Pierwszy typdobra i teraz drugą tablice tworze w nowym obiekcie,czy w tym samym?
global.pScore[level]=ilość punktów;// tu wpisuje nazwę pokoju w levelu?
Tylko jak to wyświetlić w osobnym roomie;)?
-
No to dajesz tam gdzie definiujesz punkty życia itp.:
GMLglobal.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
Czyli definiujesz tablicę globalną w której będziesz zliczał zabitych npc-tów ;)
Później przy śmierci npc-ta dajesz:
GMLglobal.Zabitych[typ]++;
Czyli doliczasz zabitego i potem sobie rysujesz sobie poszczególne elementy tablicy global.Zabitych ;)
Dzięki Max to dla mnie zrozumiałe;) ok sprawa wrogów załatwiona;) analogiczie to samo robie z punktami;)?
Tak żeby w osobnym roomie po ukończeniu wszystkich 4 roomów podsumowanie mi wyskoczyło,czyli ile punktów,ile zabitych wrogów itd;)
-
Cześć wszystkim
mam świat,który składa się z 4 plansz..Ostatnia plansza,to walka z bossem,no i teraz jak unicestwię bosa i przechodzę do kolejnego świata,to za nim do kolejnego świata przejdę chciałbym zrobić podsumowanie punktów,czyli wskakuje plansza z podsumowaniem ukończonego świata informacje ile mamy zebranych punktów ile zabiliśmy wrogów,ile monet zebraliśmy o takie coś....
zmienne mam globalne czyli:
mam w create obiektu game_controller
GMLglobal.pScore = 0;global.life = 5;
global.coins = 0;
global.Saved = true;
globalvar spawnX, spawnY;
gorzej z podsumowaniem ilości zabitych wrogów;) w danym świecie
-
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
GMLfor ( _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 globalneimage_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
GMLif(instance_number(obj_napis_plansz)=0)// zatrzymuje sprita bohatera na czas wyswietlenia napisu Stageif (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 bohaterowihp -= 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
}
-
Heheh działa MaxGaming kurcze;) wyciąłem te zmienne z create..wkleiłem w setings-creacion code;) w pierwszym roomie i pięknie zlicza;) suuuuper;)Chłopie jak sie spotkamy to masz duże piwo ode mnie;)
-
Jeżeli zrobimy to "po staremu", bez persistant to:
1. Usuń(wytnij) definiowanie zmiennych z create tego obiektu który zajmuje się też HUD itp..
2. Stwórz nowy, pusty obiekt i postaw go tylko w pierwszej planszy.
3. Wklej w jego create(tego nowego obiektu) definicje zmiennych.
Lub wersja która powinna być ciut bardziej optymalna:
1. Usuń(wytnij) definiowanie zmiennych z create tego obiektu który zajmuje się też HUD itp..
2. Wejdź w room z pierwszą planszą.
3. Zakładka Settings>Creation Code
4. Wklej tam kod definicji zmiennych.
4.1. Nie powtarzaj dla innych roomów! Czyli wklejasz to w creation code tylko pierwszego levelu ;)
Persistant możesz odznaczyć, bo nie wiem jak ono wpływa na instancje. Podejrzewam, że może działać tylko wewnątrz danego roomu, jakbyś chciał do niego powrócić to instancja zachowa swoje właściwości wtedy. Ale to tylko podejrzenia, a żeby wiedzieć na pewno trzeba poczytać dokumentację ;p Dla pewności, więc odznacz lepiej, chyba że Ty wiesz jak dokładnie to działa i to wykorzystujesz..
no dobra to z tego globalnego obiektu kontroler wycinam tylko definiowanie zmiennych,a reszte zostawiam bez zmian łącznie z hud itp elementami;D?
czekaj podeśle Ci kod całego mojego obiektu kontroler
Create
GML///Ustawienia globalneglobal.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;
End step
GML///Widokvar 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;
//Tła
/*for(i=0;i<8;i++) {
if background_visible == true || background_foreground == true {
//Horizontal
if background_width != room_width {
background_x = view_xview[0]/(room_width-view_wview[0])*(room_width-background_width);
}
//Vertical
if background_height != room_height {
background_y = view_yview[0]/(room_height-view_hview[0])*(room_height-background_height);
}
}
}</span>
room start
GML///Widokglobalvar gvXStart, gvYStart, gvWStart, gvHStart, gvObjStart;
gvXStart = view_xview[0];
gvYStart = view_yview[0];
gvWStart = view_wview[0];
gvHStart = view_hview[0];
gvObjStart = view_object[0];
if instance_exists(gvObj) {
view_xview[0] = min(max(0,gvX),room_width-view_wview[0]);
view_yview[0] = min(max(0,gvY),room_height-view_hview[0]);
}
Draw GUI
GML/// Wyswietlamy HUD graczadraw_set_color(c_white);
draw_sprite(spr_mniejszy_hud,1,50,64);
var __guiW = display_get_gui_width(), __guiH = display_get_gui_height();
//punkty czyli score wysrodkowalem to na HUD
draw_set_color(c_white);
draw_set_valign(fa_middle);
draw_set_halign(fa_center);
draw_set_font(fn_punkty);
draw_sprite(spr_score,1,310,30);
draw_text(310,75,"$"+string(global.pScore));
// Zegarki rozmieszczenie spritow i liczb
draw_set_color(c_white);
draw_set_valign(fa_middle);
draw_set_halign(fa_center);
draw_set_font(fn_punkty);
draw_sprite(spr_watch,1,500,30);
draw_text(480, 75,string(" " + string(global.watch)));
// Rozmieszenie monet
draw_set_color(c_white);
draw_set_valign(fa_middle);
draw_set_halign(fa_center);
draw_set_font(fn_punkty);
draw_sprite(spr_coins,1,400,30);
draw_text(400, 75, string(" " + string(global.coins)));
//HP HUD
if instance_exists(par_player) {
hpHUD = lerp(hpHUD,par_player.hp,.5);
maxHpHUD = par_player.maxHp;
//HUD dopalaczy
with obj_player {
var _offset;
_offset = 0;
draw_set_font(fnt_pwrup);
draw_set_valign(fa_bottom);
draw_set_halign(fa_center);
draw_set_color(c_white);
draw_texture_flush();
if pwrupSpd > 0 {
draw_sprite_ext(spr_pwrup_speed,0,__guiW-26,29+35*_offset,1,1,0,c_gray,.5);
draw_text(__guiW-26,29+35*_offset,string(ceil(pwrupSpd/room_speed)));
_offset++;
}
if pwrupStr > 0 {
draw_sprite_ext(spr_pwrup_strength,0,__guiW-26,35+35*_offset,1,1,0,c_gray,.5);
draw_text(__guiW-26,35+35*_offset,string(ceil(pwrupStr/room_speed)));
_offset++;
}
if pwrupJmp > 0 {
draw_sprite_ext(spr_pwrup_jump,0,__guiW-26,28+35*_offset,1,1,0,c_gray,.5);
draw_text(__guiW-26,28+35*_offset,string(ceil(pwrupJmp/room_speed)));
_offset++;
}
}
} else {
hpHUD = lerp(hpHUD,0,.5);
}
//HUD zycia
draw_sprite_part(spr_hp_bar,1,1,0,180/maxHpHUD*hpHUD,130,90,14);
draw_set_color(c_white);
draw_set_valign(fa_middle);
draw_set_halign(fa_center);
draw_set_font(fn_punkty);
draw_text(110, 74, string("x" + string(global.life))); //rozmieszczenie wskaznika zyc
draw_sprite(spr_glowa,1,40,1); //sprite glowy bohatera przy pasku zycia</span>
teraz tak jak mówisz tworze pusty obiekt bez persistant nazywam go np global_zmienne
wycinam z create zmienne z tamtego starego obiektu,ale zostawiam tamten stary obiekt w pierwszym roomie..
No i teraz wklejam do create tego nowego obiektu bez persistant w create te zmienne..i potem wchodzę w ustawienia pokoju pierwszego i w creacion code wklejam to samo co w create w nowym obiekcie tak?;) tak to zrozumiałem
-
Obiekt zapewne masz w każdym roomie? W create jeżeli dałeś to life będzie miało z powrotem wartość 5 CO CREATE OBIEKTU, czyli przy starcie każdego roomu który ten obiekt zawiera ;) Daj to w game start, albo ew. zrób osobny obiekt który będzie tylko w pierwsze planszy ;) Kolejną opcją jest też np create code PIERWSZEGO roomu-levelu :)
@e: dobra, nie wiem do końca jak działa persistant obiektu, teraz dopiero doczytałem. To ciekawe trochę, bo niby w każdym roomie masz inną instancję tego obiektu :/
W każdym bądź razie wychodzi na to, że jestem nie douczony, bo kiedyś tylko roomy mogły być presistant, a nowości dopiero staram się nadrobić :P
Jedyne co mogę podpowiedzieć w takim razie to spróbuj zrobić to "staromodnie", bo przy persistant obiektu niestety zbyt wiele nie pomogę, bo dopiero teraz z Twojego postu się dowiedziałem, że takie coś istnieje xD Widzę, że muszę jeszcze wiele nowości nadrobić, choć z drugiej strony ja po prostu chyba wolę robić to starymi, sprawdzonymi metodami jeżeli nie wpływa to jakość specjalnie źle na optymalizację ;p
Tak wszędzie ma ten obiekt w każdym pokoju
No tak persistant,ale zawsze mogę odznaczyć;)
dobrze po kolei co mam zrobić stworzyć drugi pusty obiekt? i wrzucić go do drugiej planszy;)? ale co to da;)?
o i zauważyłem,że mam ta samą sytuacje z punktami czyli global.score z monetami global.coins tak samo jak życia..życia w nowej planszy są cały czas 5 a punkty i monety zamiast mi zliczać do kolejnej planszy,to mi je zeruje...mam na zero..no kurcze ech
MaxGaminng ratuj..mogę i twój sposób zastosować aby zadziałało..
-
Cześć wszystkim mam taki problem i teraz się przypatrzyłem.
opisze o co chodzi:
Zaczynam sobie grę plansza pierwsza z 5 życiami,bo tyle sobie ustawiłem..no i np tam stracę w tej planszy życie jedno,czy tam więcej..
przechodzę później do kolejnej planszy i zamiast mieć tą ilość żyć co w pierwszej planszy(czyli pomniejszoną o tyle ile straciłem),to ja znowu mam 5 żyć..
jak to naprawić?
mam to w tym obiekcie,co umieszczony mam na planszy tu mam i hud itp rzeczy
tu create obiektu kontroler,oczywiście ten obiekt mam ustawiony na persistent
create
GML///Ustawienia globalneglobal.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;
-
GML//optymalizacja kodu gry
instance_activate_all();
instance_deactivate_region(view_xview[0]-64,view_yview[0]-64,// początek regionu, w ktorym dezaktywujesz obiekty
view_wview[0]+64,view_hview[0]+64,false,true); // dlugosc i wysokosc regionu
instance_activate_object(obj_game_controller);
W nawiasach kwadratowych podajesz numer viewa, nie wiem czemu wpisłeś tam 64 zamiast 0. Musisz po prostu odjąć margines, a 0 w nawiasie kwadratowym pozostawiasz w spokoju :P
Ogółem ok, tylko czy np. nie zespawnuje się gracz w aktywnym spawnie(bo wyjątek) w nie aktywnym regionie? Chodzi o to by np. nie zespawnowalo go w innym obiekcie który aktualnie jest nie aktywny. Przeanalizuj kod spawnu, czy jest przygotowany na taką ewentualność ;) Bo to czy może tak zostać zależy od tego jak wygląda fizyka i spawnienie. Tak poza tym naczęściej w platformówkach solidów jest najwięcej. Nie wiem jak jest u Ciebie, ale pomyśl czy na pewno chcesz je wykluczyć z dezaktywacji?
Dzięki teraz już rozumiem z tym view;) kurcze,bo zakręciłem się na maksa;)
z spawn jest wszystko w porządku sprawdzałem..co do solidów,no to jak ci pisałem mam scenerie zbudowaną jako jedną całość...i na nią nałożony jeden niewidzialny solid w małych różnych kawałkach;)
działa bardzo ładnie teraz;) kurcze,aż w szoku jestem;)
Dzięki jeszcze raz;)
-
Ale za wielkość viewa odpowida już view_width i height ;) Margines to dodatkowy obszar przeciw bugom.
Marignes np. ustal na 32, czy 64px, chyba że wymaga więcej... a możesz i bez, ale panuje taka zasada, że dla bezpieczeństwa się zostawia jakiś margines.
A chodzi mi o to, że pierwsze 4 argumenty to x, y, szerokość, długość. Odjęcie od x to margines z lewej, odjęcie od y to margines od góry, zwiększenie szerokości to margines z prawej, a zwiększenie wysokości dolny margines. Zrobiłeś margines z prawej i u dołu, a z lewej i u góry nie. Z lewej to jeszcze logiczne skoro nie da się w lewo chodzić, ale czemu u dołu jest, a u góry nie ma? To celowy zabieg, czy po prostu źle mnie zrozumiłeś?
Po prostu źle Cię zrozumiałem;)
czyli daje margines tak:
Begin step gracza
GML//optymalizacja kodu gryinstance_deactivate_region(view_xview[64],view_yview[64],// początek regionu, w ktorym dezaktywujesz obiekty
view_wview[0]+64,view_hview[0]+64,false,true); // dlugosc i wysokosc regionu
instance_activate_object(obj_game_controller);// tu dodaje rozumiem wyjątki w grze,które chce żeby się nie dezaktywowały</span>
instance_activate_object(obj_room_controller);
instance_activate_object(obj_global_controller);
instance_activate_object(par_solid);
instance_activate_object(par_solid_ghost);
instance_activate_object(obj_napis_plansz);
instance_activate_object(obj_fade);
instance_activate_object(obj_przejscie7);
instance_activate_object(obj_energia);
instance_activate_object(obj_spawn_bulwa);
instance_activate_object(obj_spawn);
instance_activate_object(obj_spawn_gerwazy);
instance_activate_object(obj_spawn_rysiu);
instance_activate_object(obj_spawn_rysiu_chodzi);
instance_activate_object(obj_spawn_dino);
instance_activate_object(obj_spawn_bandyta);
instance_activate_object(obj_enemy_smoczek);
instance_activate_object(par_hazard);
instance_activate_object(obj_spadajace_kolce);
Ktoś mi może powiedzieć co jest nie tak...ogólnie wszystko dobrze działa...ale teraz jak znajdę się,czy to na samym początku planszy lub na samym końcu planszy,to jednorazowo tylko raz wyświetla się przez ułamek sekundy kawałek poprzedniej planszy z poprzedniego roomu..
O co z tym chodzi? jak się tego pozbyć?
-
No zależy ile jeszcze tych solidów jest, bo może jednak warto by było..
Ale ogółem powinno być ok, jeżeli coś Ci buguje to wtedy zmieniaj ;)
Aczkolwiek bym zmniejszył ten z prawej i u dołu margines. Ciekawi mnie też czemu u góry marginesu nie ma, a u dołu jest, tak miało być?
No nic nie buguje Maxgaming;) hmmm chodzi ci dlaczego mam margines +800 ;)?
bo w view w grze ustawiłem sobie 800x500 czyli mały kawałek scenerii;) z całości;) i ta część ma być nietykalna;) i każda za nią ma się dezaktywować i przed nią też może,ale jak się znajde w jej zasiegu,to ma się aktywować i tyle;)
-
No to mniej więcej tak jak piszesz, tylko jednak margines, aż tak duży być nie musi. Jeżeli nie masz zbyt długich obiektów to raczej margines duży być nie musi, jednak niewielki jednak bym dał dla pewności ;)
A ponowna aktywacja musi być, bo inaczej raz zdezaktywowany obiekt, permanentnie by był już nie aktywny ;)
zobacz coś takiego;D?
chce tylko żeby view mój był aktywny co ma wymiary podglądu 800x500 szeroki 800 wysoki na 500..reszta za nim ma być nieaktywna...dodałem wyjątki,ale hmmm czy to jest dobre
mają być nieaktywne,a jak znajdą się w moim podglądzie nie daleko ,to mają się aktywować ot coś takiego.
GML//optymalizacja kodu gryinstance_deactivate_region(view_xview[0],view_yview[0],// tu nie dałem marginesu..czyli teraz,wszystko z lewej strony powinno się dezaktwować,jak nie jest w zasięgu mojego podglądu.
view_wview[0]+800,view_hview[0]+500,false,true); // dlugosc i wysokosc regionu
instance_activate_object(obj_game_controller);// tu dodaje rozumiem wyjątki w grze,które chce żeby się nie dezaktywowały</span>
instance_activate_object(obj_room_controller);
instance_activate_object(obj_global_controller);
instance_activate_object(par_solid);
instance_activate_object(par_solid_ghost);
-
@Cygnus: Zazwyczaj to jest rozmiar view + margines jakiś tam.
@Milord: Nie do końca. Marginesy robi się tylko dla pewności, np jakby jakieś obiekty były duże i by niby były dezaktyowane a nie powinny i mamy wtedy bugi itp.. To dużo zależy jak zbudowana jest nasza gra, ale raczej aż tak duże nie są potrzebne(czym większe tym większe obciążenie PC).
instance_activate_all(); - aktywuje wszystkie obiekty, bo te nie aktywują się same co step ;) Taki efekt otrzymałeś bo dezaktywowałeś obiekty przed sobą a ich z powrotem nie aktywowałeś. Aha i jak w grze np chodzi się tylko w prawo to można dezaktywować wszystkie obiekty od lewej(zacząć nie od view_xview, a od 0)... Ale mówię to zależy wszystko od konstrukcji gry. Może poczytaj sobie więcej bardziej jak to działa, żeby więcej teorii mieć, bo o złotą metodę pasującą do każdego projektu tutaj ciężko :)
Max gaming;)
to gra platformowa chodzi się w prawo;) ale można się cofać;) ale tylko w danej planszy;)
Bardziej mi chodzi o efekt,że chce tak żeby wszystko co jest w podglądzie moim view okienku było aktywne,a po za nim już nie aktywne,o to mi dokładnie chodzi ;)
-
GMLinstance_activate_all();
instance_deactivate_region(view_xview[0],view_yview[0],// początek regionu, w ktorym dezaktywujesz obiekty
view_wview[0],view_hview[0],false,true); // dlugosc i wysokosc regionu
instance_activate_object(WYJĄTEK);// tu dodaje rozumiem wyjątki w grze,które chce żeby się nie dezaktywowały
Chodź po 1. radziłbym trochę rozszerzyć, na wszelki wypadek
GMLinstance_deactivate_region(view_xview[0]-margines,view_yview[0]-margines,// początek regionu, w ktorym dezaktywujesz obiekty
view_wview[0]+margines,view_hview[0]+margines,false,true); // dlugosc i wysokosc regionu
instance_activate_object(WYJĄTEK);// tu dodaje rozumiem wyjątki w grze,które chce żeby się nie dezaktywowały
I lepiej podziel sobie na obiekty dynamiczne(te poruszające się np. npc-ty) i statyczne(np. ściana). Bo inaczej możesz mieć bugi, że npc npc-t wejdzie w ścianę(która jeszcze dezaktywowana nie będzie). Wtedy dynamicznym daj większy margines.
Musisz dać to w jakiś obiekt, może być gracz. Step, begin itp. to raczej dużego znaczenia nie ma, chodź w specyficznych sytuacjach możesz musieć to zmienić zależnie od swojego kodu. Chociaż jeżeli masz kod np. w step zawsze, to danie w begin może trochę zmniejszyć ryzyko bugów, ale jeżeli stosujesz osobną dezaktywację dynamicznych i statycznych obiektów to nie musisz się raczej o to martwić ;)
Respawn? To zależy, bo jeżeli mają się zawsze respawnować, to może być problem z dezaktywacją w ogóle. Jeżeli mają tylko w pobliżu gracza to tak, dezaktywuj.
MaxGaming zrobiłem tak kod dałem w begin step gracza
GML//optymalizacja kodu gryinstance_deactivate_region(view_xview[0]-300,view_yview[0]-400,// początek regionu, w ktorym dezaktywujesz obiekty,ale chyba trzeba dać na + marginesy,bo dezaktytwuje wszystko co jest przede mną,a nie za mną
view_wview[0]+800,view_hview[0]+500,false,true); // dlugosc i wysokosc regionu ,tu chodzi o moje parametry view podgladu pokoju?
instance_activate_object(obj_game_controller);// tu dodaje rozumiem wyjątki w grze,które chce żeby się nie dezaktywowały</span>
instance_activate_object(obj_room_controller);
instance_activate_object(obj_global_controller);
instance_activate_object(par_solid);
instance_activate_object(par_solid_ghost);
dałem wyżej instance_activate_all(); ale nie wiem,czy tak ma być,bo bez tego jak nie dam,to jak idę graczem do przodu,to wszystkie obiekty,które są przede mną zniknęły;) oczywiście poza tymi co dodałem do wyjątku..
-
Lenin ja już dawno tak zrobiłem za nim mi odpisałeś
Ale else nic nie pomaga:/
step wroga
GML//Prosta sztuczna inteligencja wrogaimage_angle = direction;
if distance_to_object(obj_bohater)<90
{
if obj_bohater.x>x image_xscale=1;
else image_xscale=-1;
if (place_free(x+image_xscale*5,y) && instance_position(x+image_xscale*5,y+32,par_sciana)) x+=image_xscale*5;
}
else
if place_meeting(x,y,par_solid) || place_meeting(x,y,par_solid_entity) && image_xscale = 1
{
image_xscale = -1;
}
if place_meeting(x,y,par_solid) || place_meeting(x,y,par_solid_entity) && image_xscale = 1
{
image_xscale = 1;
}
// Odwracanie wroga od obj_niewidzialna_przeszkoda
else
if place_meeting(x+5,y,obj_niewidzialna_przeszkoda) && image_xscale = 1
{
image_xscale = -1;
}
if place_meeting(x-5,y,obj_niewidzialna_przeszkoda) && image_xscale = -1
{
image_xscale = 1;
}
else
//Zachowanie bohatera na platformy z nalozona par_przeswitujaca_platforma
if place_meeting(x+5,y,par_przeswitujaca_platforma) && image_xscale = 1
{
image_xscale = -1;
}
if place_meeting(x-5,y,par_przeswitujaca_platforma) && image_xscale = -1
{
image_xscale = 1;
}
else
if !place_meeting(x+sign(image_xscale),y-2,par_solid) {
if image_xscale > 0 {
hspd = min(hspd+sign(image_xscale),2);
} else if image_xscale < 0 {
hspd = max(hspd+sign(image_xscale),-2);
}
}
if hspd == 0 {
image_xscale *= -1;
unstick(8);
}
//Przeciwnik mruga
if hurtClock > 0 {
visible = !visible;
hurtClock -= 1;
} else {
visible = true;
}
if hp <= 0 {
instance_destroy();
dead = true; //wywolanie alarmu,gdy wrog jest martwy
global.pScore += 100;
instance_create(x,y-50,choose(obj_moneta,obj_gwiazdka,obj_serce)) // Losowy element,kiedy wrog zginie np gwiazdka,moneta,serce itp
with instance_create(x,y,obj_ginaca_jednostka) {
sprite_index = spr_wrog_umiera; //zmiana sprita
image_xscale = other.image_xscale;
image_yscale = other.image_yscale;
hspd = other.hspd;
vspd = other.vspd;
audio_play_sound(dzwiek_wrog_umiera, 1, false); //odtwarzamy dzwiek przy smierci wroga
}
}
//respawn wroga
if (dead == true)
{
instance_create(x,y,obj_spawn);
}
-
wiem wiem dużo tego musiałbym wysłać...
zobacz
tak już lepiej działa
GMLif(vspd>0 ^^ hspd>0){
image_speed=1;
}else{
image_speed=0;
};
tylko,że jak idę w lewo jest ok,a jak w prawo,to sprita wygląda jakby cały czas krok robił;)
aj nie jest to już takie istotne;)
i Tak Ci bardzo dziękuje za pomoc;)
Ps.Zerknąłbyś jeszcze do moich dwóch tematów? bo tam mam największy problem;)
-
Każdy z tech warunków może być spełniony w danym stepie, dlatego image_xscale zmienia się co chwila.
wykonuje się to
GMLif obj_bohater.x>x image_xscale=1;
nastepnie to
GMLif place_meeting(x+5,y,par_przeswitujaca_platforma) && image_xscale = 1
{
image_xscale = -1;
bo oba mogą być spełnione, i zaczyna Ci skakać.
Zdecyduj co pierwsze ma być sprawdzane, zrób z tego logiczną całość, dodaj else jakieś i powinno być dobrze
No na pewno ma być ten pierwszy warunek
GMLif obj_bohater.x>x image_xscale=1; -
tak mam tylko vspd i hspd ;)
no wiem...w stepie mam to jeśli chodzi o ruch bohatera;)
-
Zrobiłem symulację u mnie, czy znów nie jakiś babol, ale wszystko śmiga. Może obiekt napis znajduję się tylko w pierwszym pokoju? Pamiętaj że musisz go postawić w każdym pokoju(oczywiście w menu czy coś nie musisz, tylko tam gdzie ma się wyświetlać). Persistant nie powinno tu niczego zmienić.
Daj kod poruszania, bo może np. masz na speed, albo jakąś inną metodą i ciężko w ciemno Ci powiedzieć co zrobić :)
hehe racja nie mam w drugim pokoju tego obiektu;)
już go dodaje,raczej więcej niż pewne,że będzie działało;) dziękuje;)
zaraz poszukam u siebie kodu na poruszanie się..
Zrobiłem symulację u mnie, czy znów nie jakiś babol, ale wszystko śmiga. Może obiekt napis znajduję się tylko w pierwszym pokoju? Pamiętaj że musisz go postawić w każdym pokoju(oczywiście w menu czy coś nie musisz, tylko tam gdzie ma się wyświetlać). Persistant nie powinno tu niczego zmienić.Daj kod poruszania, bo może np. masz na speed, albo jakąś inną metodą i ciężko w ciemno Ci powiedzieć co zrobić :)
vspd ;) taką metodą mam;)
-
Staram się Maxgaming;) czasem uda mi się wyłapać mały błąd..W porządku i tak dziękuje za pomoc,bo dużo mi pomogłeś..
w draw dałem
GMLdraw_set_font(fn_plansza);draw_set_color(c_blue);
switch(room)
{
case roo_world1_1://nazwa pokoju
draw_text(view_xview + view_wview / 2 , view_yview + view_hview / 2 , "STAGE 1-5");
break;
case roo_world1_2://nazwa pokoju
draw_text(view_xview + view_wview / 2 , view_yview + view_hview / 2 , "STAGE 2-5");
break;
case roo_world2_1://nazwa pokoju
draw_text(view_xview + view_wview / 2 , view_yview + view_hview / 2 , "STAGE 3-5");
break;
};
na pierwszej planszy ładnie się napis wyświetla,ale już na drugiej nie wyświetla się..no nie wiem..hmmm..persistent też nic nie daje czy to zaznaczone czy nie;)
co do bohatera..hmmm dając w stepie przed kodem chodzenia gracza image_speed=0; nie do końca rozwiązuje problem ok chwilowo gracz się zatrzymuje,ale potem dziwnie się zachowuje;) niech już tu jest jak jest;)
-
GMLdraw_text(view_xview + view_wview / 2 , view_yview + view_hview / 2 , "STAGE 1-4");
Tekst na końcu, najpierw x i y :)
i teraz w poruszaniu robisz:GMLif(instance_number(obj_opis_plansz)>0)
{
//kod poruszania
}
Bo teraz dopiero pomyślałem, że wprowadziłem Cię w błąd przez moje roztargnienie. Wysypało by Ci error jakby obiekt znikł a Ty byś próbował się odwołać do jego alarmu.
Ten kod sprawdza ilość obiektów z napisem i jeżeli jest jakiś(ich liczba jest większa niż 0) to wykonuje kod poruszania ;)
MaxGaming
mała poprawka w stepie Bohatera wstawiam tak
GMLif(instance_number(obj_opis_plansz)=0)// zamiast > ,bo tak,to blokowało cały czas ruch bohatera,tak jakby chodził w miejscu//kod poruszania
}
Zastanawia mnie jedna rzecz...bo fajnie już to wygląda..teraz np chcę użyć image_index i na moment,kiedy bohater stoi chciałbym zmienić sprita,by stał całkowicie w miejscu.
-
Dzięki MaxGaming;) miałem pisać,że udało mi się to rozwiązać;) jeszcze raz dziękuje;) działa idealnie;)
A powiedz mi na podstawie tego kody,żeby nie wklejać ten obj_napisz_plansza do każdej scenerii i nie zmieniać napisu na 2-4,3-4,4-4 czy można wpisać jakiś warunek,skrypt,który by na podstawie nazwy pokojów załóżmy 4 pokoje nazywają się plansza1,plansza2,plansza3,plansza4 wyświetlał tak jak teraz napis kolejno stage 1-4 stage 2-4 stage 3-4 i stage 4-4 ??
Bo teraz to trzeba za każdym razem taki sam obiekt tworzyć w każdym pokoju tylko zmieniać mu tekst na odpowiedni,który chcemy żeby się wyświetlił.
Problem z ustawieniem ruchomego tła
w Pytania początkujących
Opublikowano
Cześć wszystkim mam taki problem z ruchomym głównym tłem.
Może wyjaśnię o co dokładnie mi chodzi.
mam trzy tła background1 bacground2 background3
Każde z nich ma takie same wymiary czyli 2096x1536
Tło background3 to sceneria na której są solidy nałożone
Tło Background2 to statyczne tło na których widać bliższe elementy
Tło background1 to ruchome tło w oddali z delikatnym blurem
Viewa mam ustawionego na 800x500
I teraz chciałbym ustawić żeby te tło background1 poruszało się przy ruchu gracza góra,dół,lewo prawo...
próbowałem już w stepie bohatera różnych ustawień np:
Efekt jest taki,że jak chodzę bohaterem,to te tło dziwnie się porusza,np jak mam w oddali krajobraz,to przy poruszaniu ten krajobraz opada nie widać go,jest potem w innym miejscu,a w miejscu krajobrazu jest inna część tła z całości.
Jak np wyłączę ruchome tło,to krajobraz wszystko ładnie jest dopasowane,no,ale nie ma efektu poruszającego się tła.
Kiedyś miałem ustawione tło ruchome o identycznych rozmiarach co view i było ok,a teraz ma view inny i tło większe,bo chciałem żeby to lepiej wyglądało...
Kurcze walczę z tym już jakiś czas i nie wiem jak to ustawić żeby było dobrze.
Statycznie jest dobrze jak ładnie to wygląda,ale wtedy brak efektu głębi poruszania się tła..
Nie mam już pomysłu na to..
proszę pomóżcie
Game Maker Studio Pro.