Skocz do zawartości

Trzy małe problemy z drabiną


Rekomendowane odpowiedzi

Dzień dobry wszystkim,

 

Od pewnego czasu borykam się z kilkoma problemami.

Mam na myśli drabinę.

Korzystałem z różnych samouczków w sieci,ale mimo to nie mogę rozwiązać tych problemów.

 

A teraz jaśniej.

 

Problem 1

 

Drabina na pozór działa dobrze..Mogę po niej wchodzić i schodzić.

Żeby z niej nie spaść użyłem trwałego obiektu który nanoszę na górną krawędź drabiny następnie ten obiekt trwały sparowałem z drabiną i problem powierzchownie rozwiązany.

czemu piszę że powierzchownie?

Bo jest mały problem...kiedy nacisnę krótko przycisk dół na klawiaturze to mój bohater spada z drabiny na najbliższe podłoże solid ; natomiast kiedy przytrzymam dłużej klawisz dół to schodzi normalnie z drabiny.

Nie mam pojęcia jak to naprawić żeby mógł normalnie schodzić bez względu czy nacisnę krótko klawisz dół czy też długo.

 

 

Problem 2

 

Nie wiem,czy tu akurat wina jest źle ustawionego sprita bohatera,ale kiedy wejdę już na szczyt drabiny to mimo że już jestem na górze,to jeszcze przez chwilę mój sprite wspina się.

Komicznie to wygląda...

Próbowałem w ustawieniach spritach zmienić pozycję x i y sprite...ale to nie pomaga..

 

 

Problem 3

 

Mój bohater będąc na drabinie ma możliwość ataku w postaci strzału z pocisku.

używam tu dodatkowo sprite ataku na drabinie który w chwili wystrzelenia pocisku pokazuje się.

I tu jest mały kłopot...Kiedy wykonam strzał bohaterem na drabinie to za nim pocisk się nie rozbije o cokolwiek to kiedy poruszam lewo prawo bohaterem to zamiast zmienić się sprite bohatera na wchodzącego po drabinie,to pokazuje się przez chwilę jeszcze sprite ataku na drabinie oczywiście źle to wygląda,bo on suwa się góra dół...

 

 

 

Tu poniżej kod mojej drabiny.

Pomijam większość,żeby nie wklepywać bezsensownie wszystkiego..

 

 

obj_bohater

 

Step

 

//Ruch bohaterem
if drabina == false
{
if key_check_pressed(key.jump)  && wPowietrzu == false
 {
vspd = -10-sign
silaSkoku = 4;


if key_check(key.down) && place_meeting(x,y+1,par_objekt_trwaly)//obiekt dziedziczacy z drabina aby bohater nie spadl z drabiny
{
y += 4;
vspd = 0;
silaSkoku = 0;
czasSkoku = 0;
}
 }





//Drabina
if  place_meeting(x,y,par_drabina) && place_meeting(x,y-32,par_drabina) && place_meeting(x,y+5,par_drabina) && czas <= 0 && (key_check(key.up) || key_check(key.down))  
{
drabina = true;
vspd = 0;
hspd = 0;
 }
  }


//Ruch po drabinie
if drabina == true
{
var __hsign = key_check(key.right)-key_check(key.left);
var __vsign = key_check(key.down)-key_check(key.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_drabina)
{
drabina = false;
vspd = -10;
}
 
if __hsign != 0
{
image_xscale = __hsign;
}
 
if !place_meeting(x,y,par_drabina) || !place_meeting(x,y+32,par_drabina)  
{
drabina = false;
}
 }
 
// animacja bohatera wchodzacego na drabinie i odpoczywajacego
if drabina == true {
  if x == xprevious && y == yprevious {
   if sprite_index != spr_bohater_odpoczywanadrabinie {
    sprite_index = spr_bohater_odpoczywanadrabinie;
   }
  } else {
   if sprite_index != spr_bohater_wchodzipodrabinie {
    sprite_index = spr_bohater_wchodzipodrabinie;
   }
  }
 }


////Bohater atakuje z drabiny
if keyboard_check_pressed(ord('X')) && drabina==true && czas == false  && place_meeting(x,y,par_drabina)   &&  instance_number(objPocisk) < 3
{
czas = 30;    
atak = 1;
with instance_create(x,y,par_ataku) {

     sprite_index = spr_bohater_strzela_na_drabinie; 
     
     image_xscale = other.image_xscale;

{
    var box, ID;
    if image_xscale == -1
        box = bbox_left;
    else
        box = bbox_right;
        
    ID = instance_create(box+image_xscale*-10, y-17, objPocisk);
        ID.hspeed = image_xscale * 15;
        
}      
 }
  }
 
 

 

 

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Trochę za duzo kodu do analizy, nie chce mi się przyglądać. Ale na drugi problem to bym dodał sprawdzanie czy drabina jest pod bohaterem i kilka pikseli wyżej, to powinno załatwić sprawę.

Odnośnik do komentarza
Udostępnij na innych stronach

Dziękuję za sugestie.

 

Problem 1 udało Mi się wczoraj naprawić oraz w połowie Problem 2

W pierwszym przypadku wystarczyło ustawić wartość inną wartość Y z +5 na +1

Podobnie jak w przypadku 2.Tu problem okazał się dość banalny.

 

Wartość y ustawiłem z-32 na -100

Teraz bohater kiedy wejdzie na drabinie to na jej szczycie kończy animacje i zmienia swój stan na sprite stojącego.

 

Tu zostało Mi do ustawienia bohatera w drugą stronę czyli bohater schodzący z drabiny.

Otóż..kiedy próbuje zejść bohaterem z drabiny to jego sprite zaczyna schodzić nie od szczytu drabiny tylko o pare punktów wyżej..

Mówiąc wprost i jaśniej..kiedy jestem nad drabiną to w chwili kiedy nacisnę kursor dół to bohater powiniem złapać się górnej krawędzi drabiny..

A teraz on znacznie wyżej łapie się drabiny..

Ciężko Mi to ustawić...siedzę już 2 dzień nad tym.

Moje pomysły wyczerpały się...

Próbowałem w opcjach roomu zmienić wartość hsp i vsp z -1 na 15.

Generalnie to pomogło teraz ekran nie przeskakuje uporczywie jak próbuje zejść po drabinie..Sprite płynnie zmienia swoje położenie...od razu łapie się górnej granicy drabiny.

Mimo to te rozwiązanie nie do końca jest dobre,ponieważ mam na planszy ruchome obiekty i teraz te obiekty nie nadążają za graczem.

Może jest inny sposób żeby ustawić sprite bohatera jak jest nad drabiną że przy naciśnięciu przycisku dół od razu chwytał górną część drabiny.

 

 

//Drabina
if  place_meeting(x,y,par_drabina) && place_meeting(x,y-32,par_drabina) && place_meeting(x,y+1,par_drabina) && czas <= 0 && (key_check(key.up) || key_check(key.down))  
{
drabina = true;
vspd = 0;
hspd = 0;
 }
  }


//Ruch po drabinie
if drabina == true
{
var __hsign = key_check(key.right)-key_check(key.left);
var __vsign = key_check(key.down)-key_check(key.up);
 
hspd = min(max(hspd+__hsign,-2),2);
vspd = min(max(vspd+__vsign*2,-4),4);
 
if __vsign == -1 && !place_meeting(x,y-100,par_drabina)
{
drabina = false;
vspd = -10;
}
 
if __hsign != 0
{
image_xscale = __hsign;
}
 
if !place_meeting(x,y,par_drabina) || !place_meeting(x,y+32,par_drabina)  
{
drabina = false;
}
 }

 

 

Odnośnik do komentarza
Udostępnij na innych stronach

Jednak moje szczęście nie trwało długo..

Wyzbyłem się platformy którą nakładam na drabinie w celu stałego podłoża aby sprite bohatera nie spadł z górnej krawędzi drabiny.

Teraz kiedy jest sama drabina,to w chwili kiedy znajdę się bohaterem na górze drabiny to naciskając przycisk dół to spada bohater.

Próbowałem użyć gravity...ale coś źle robię..

Proszę was o pomoc..jak na podstawie wyżej kodu ustawić aby gracz nie spadał z górnej krawędzi drabiny.

I naciskając przycisk dół dłużej lub krócej od razu chwytał się górnej krawędzi drabiny..

 

Dziękuję za każdą pomoc...sugestie..

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Yep, to generalnie nie jest proste zagadnienie i wymaga ściany kodu, więc ciężko się taki problem rozwiązuje. Trzeba spojrzeć szerzej, zajrzeć w projekt itd. Ja niestety aż tyle czasu nie znajdę, jak jakiś mam, to staram się naprowadzać :)

Odnośnik do komentarza
Udostępnij na innych stronach

W porządku:-)

Do kolegi wyżej napisałem.

Pogrzebałem troche w kodzie i udało mi się rozwiązać problem ze spadającą drabiną..

Stworzyłem zmienna w create 

Coś takiego trzymaniesiedrabiny = false;

Następnie w Stepie wywaliłem przy drabinie dół i dałem tą zmienną.

I w końcu w Stepie dałem żeby zmienna przy drabinie i przycisku dół była false a potem true:-)

Nie spada bohater ale jak zejde z drabiny i jestem na dole na solidzie to chwile sprite bohatera jest jakby przez coś trzymany..Mogę nogani przebierać..ale coś go trzyma przez chwile..i w końcu może chodzić i wszystko zaczyna działać..

Odnośnik do komentarza
Udostępnij na innych stronach

Dobra...

W końcu podgarnołem.

Bohater teraz nie spada z drabiny.

Ale zostały Mi dwie rzeczy do zrobienia.

 

1. Bohater jak jest przy drabinie po naciśnięciu przycisku dół chwyta się,ale nie górnej części drabiny tylko nad drabiną..

Dziwnie to wygląda.Mam sprita 128x128 pewnie przez to..

 

2. Obj_podloze powoduje zblokowanie na ułamek sekundy sprita bohatera który zejdzie z drabiny i dotknie tego podłoża..

Nie wiem moze trzeba dac jakis warunek żeby sprawdzał podłoże? Jak dotknie gracz po zejściu drabiny obj_podloze.

 

 

Kod teraz wygląda tak

Create

 

Zejsciezdrabiny = false;

 


//bohater juz nie spada z drabiny

if place_meeting(x,y,par_drabina) && key_check(key.down) {
zejsciezdrabiny = true;
}

if place_meeting(x,y,par_drabina) {
zejsciezdrabiny = false;
}

//bohater kiedy zetknie sie z ziemia //obj_podloze to puszcza drabine

if place_meeting(x,y,par_drabina) && drabina = true && place_meeting(x,y+2,obj_podloze)
{
drabina = false;
}

if  place_meeting(x,y,par_drabina) && place_meeting(x,y-32,par_drabina) && place_meeting(x,y+1,par_drabina) && czas <= 0 && (key_check(key.up) || zejsciezdrabiny))  
{
drabina = true;
vspd = 0;
hspd = 0;
 }
  }


//Ruch po drabinie
if drabina == true
{
var __hsign = key_check(key.right)-key_check(key.left);
var __vsign = key_check(key.down)-key_check(key.up);
 
hspd = min(max(hspd+__hsign,-2),2);
vspd = min(max(vspd+__vsign*2,-4),4);
 
if __vsign == -1 && !place_meeting(x,y-100,par_drabina)
{
drabina = false;
vspd = -10;
}
 
if __hsign != 0
{
image_xscale = __hsign;
}
 
if !place_meeting(x,y,par_drabina) || !place_meeting(x,y+32,par_drabina)  
{
drabina = false;
}
 }

 

 

Czy ktoś z was mógłby Mi pomóc z tymi dwoma wyżej rzeczami?

Dziękuję.

 

 

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Widzę kilkanaście razy place_meeting(x,y,par_drabina), dlaczego nie przypiszesz tego do jakiejś zmiennej (tymczasowej), oraz nie wrzucisz w jeden warunek wszystkiego, co wymaga, aby ten warunek był spełniony? to by zwiększyło czytelność kodu, może wtedy znajdziesz swój błąd, zobacz:

 

//bohater juz nie spada z drabiny

if place_meeting(x,y,par_drabina) {
	zejsciezdrabiny = false;
	if (key_check(key.down)) {
		zejsciezdrabiny = true;
	}

	//bohater kiedy zetknie sie z ziemia //obj_podloze to puszcza drabine
	if (drabina = true && place_meeting(x,y+2,obj_podloze)) {
		drabina = false;
	}

	if (place_meeting(x,y-32,par_drabina) && place_meeting(x,y+1,par_drabina) && czas <= 0 && (key_check(key.up) || zejsciezdrabiny)) {
		drabina = true;
		vspd = 0;
		hspd = 0;	
	}

}


//Ruch po drabinie
if drabina == true
{
	var __hsign = key_check(key.right) - key_check(key.left);
	var __vsign = key_check(key.down) - key_check(key.up);
	 
	hspd = min(max(hspd+__hsign,-2),2);
	vspd = min(max(vspd+__vsign*2,-4),4);
	 
	if __vsign == -1 && !place_meeting(x,y-100,par_drabina)
	{
		drabina = false;
		vspd = -10;
	}
	 
	if __hsign != 0
	{
		image_xscale = __hsign;
	}
	 
	if !_na_drabinie || !place_meeting(x,y+32,par_drabina)  
	{
		drabina = false;
	}
}

Poza tym, chyba nie pozostaje nic innego jak sobie za pomoca draw wyświetlać na ekranie wartości wszystkich zmiennych których używasz i wtedy zobaczyć, co w momencie gdy masz złą grafikę jest ustawione i będziesz wiedzieć, jaki przypadek obejść. Inaczej - trochę ciężko to będzie rozwiazać, bo to już jest problem mający w zależnościach wiele innych danych z gry których nie mamy i zrobiło się nieco zbyt kompleksowo.

Odnośnik do komentarza
Udostępnij na innych stronach

Zdecydowanie czytelniej...zgadzam się z Tobą...

Ciężko do pewnych nawyków się przyzwyczaić i cały czas nad tym pracuję.

 

Wyłapałem w inny sposób błąd.A mianowicie co się dzieje kiedy bohater kiedy zejdzie z drabiny dotknie stałego podłoża/gruntu..

A mianowicie był przez ułamek sekundy zatrzymany w miejscu tak jakby ktoś go trzymał.

 

 

Ten kod naprawia ten problem

 

    if __vsign == 1 && !wPowietrzu {
    drabina = false;
  }
 

Ok udało Mi się też zlokalizować przyczynę dlaczego nie mogłem ustawić sprita idealnie jak schodzi po drabinie.

Temat do zamknięcia..

Przyczyną była zmienna vspd musiałem zwiększyć dystans skoku do góry i już jest ok..

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