Skocz do zawartości

Mini problem z kodem :)


Mleko

Rekomendowane odpowiedzi

Hej! :)

 

Ostatnio troche programowalem i mam pewiem problem :o :o .

 

Animacja działa w lewo, gdy ide w lewo do gory itd gdy ide w prawo nie działa, natomiast gdy ide w prawo i do góry to działa.

 

GML
//Zamienne

W= keyboard_check(ord("W"));

A= keyboard_check(ord("A"));

S= keyboard_check(ord("S"));

D= keyboard_check(ord("D"));

 

//Poruszanie sie

if W and place_free(x,y-moveSpeed)

{

y-= moveSpeed;

mw= true;

}else{ y-= 0; mw= false; }

 

if A and place_free(x-moveSpeed,y)

{

x-= moveSpeed;

ma= true;

}else{ x+= 0; ma= false; }

 

if S and place_free(x,y+moveSpeed)

{

y+= moveSpeed;

ms= true;

}else{ y+= 0; ms= false; }

 

if D and place_free(x+moveSpeed,y)

{

x+= moveSpeed;

md= true;

}else{ x+= 0; md= false; }

 

//Animacja

if mw= true or ma= true or ms= true or md= true{ m= true; }

if mw= false and ma= false and ms= false and md= true{ m= false; }

 

if m= true { image_speed= 0.14; sprite_index= sHeroWalking;}else{ image_speed= 0.05; sprite_index= sHero;}

if md= true

{

image_xscale= -1;

}else{ if ma= true{ image_xscale= 1; }}

Odnośnik do komentarza
Udostępnij na innych stronach

Myślę, że w

GML
if mw= false and ma= false and ms= false and md= true{ m= false; }

powinno być

GML
if mw= false and ma= false and ms= false and md= false{ m= false; }

 

Poza tym było kilka mniejszych błędów, więc wysyłam cały kod

GML
//Zmienne

W= keyboard_check(ord("W"));

A= keyboard_check(ord("A"));

S= keyboard_check(ord("S"));

D= keyboard_check(ord("D"));

 

//Poruszanie sie

if(W and place_free(x,y-moveSpeed)){

y-= moveSpeed;

mw= true;

}else{

mw= false;

}

 

if(A and place_free(x-moveSpeed,y)){

x-= moveSpeed;

ma= true;

}else{

ma= false;

}

 

if(S and place_free(x,y+moveSpeed)){

y+= moveSpeed;

ms= true;

}else{

ms= false;

}

 

if(D and place_free(x+moveSpeed,y)){

x+= moveSpeed;

md= true;

}else{

md= false;

}

 

//Animacja

if(mw= true or ma= true or ms= true or md= true){

if(m=false){

m=true;

}

}

if(mw= false and ma= false and ms= false and md= false){

if(m=true){

m=false;

}

}

 

if(m= true){

image_speed= 0.14;

sprite_index= sHeroWalking;

}else{

if(sprite_index!=sHero){

image_speed= 0.05;

sprite_index= sHero;

}

}

 

if(md= true){

image_xscale= -1;

}else{

if(ma= true){

image_xscale= 1;

}

}

Odnośnik do komentarza
Udostępnij na innych stronach

Myślę, że w

GML
if mw= false and ma= false and ms= false and md= true{ m= false; }

powinno być

GML
if mw= false and ma= false and ms= false and md= false{ m= false; }

 

Poza tym było kilka mniejszych błędów, więc wysyłam cały kod

GML
//Zmienne

W= keyboard_check(ord("W"));

A= keyboard_check(ord("A"));

S= keyboard_check(ord("S"));

D= keyboard_check(ord("D"));

 

//Poruszanie sie

if(W and place_free(x,y-moveSpeed)){

y-= moveSpeed;

mw= true;

}else{

mw= false;

}

 

if(A and place_free(x-moveSpeed,y)){

x-= moveSpeed;

ma= true;

}else{

ma= false;

}

 

if(S and place_free(x,y+moveSpeed)){

y+= moveSpeed;

ms= true;

}else{

ms= false;

}

 

if(D and place_free(x+moveSpeed,y)){

x+= moveSpeed;

md= true;

}else{

md= false;

}

 

//Animacja

if(mw= true or ma= true or ms= true or md= true){

if(m=false){

m=true;

}

}

if(mw= false and ma= false and ms= false and md= false){

if(m=true){

m=false;

}

}

 

if(m= true){

image_speed= 0.14;

sprite_index= sHeroWalking;

}else{

if(sprite_index!=sHero){

image_speed= 0.05;

sprite_index= sHero;

}

}

 

if(md= true){

image_xscale= -1;

}else{

if(ma= true){

image_xscale= 1;

}

}

 

 

O jacie dziękuje ale mam jeszcze 1 pytanie po co te nawiasy? ()

 

Odnośnik do komentarza
Udostępnij na innych stronach

A tak naprawdę: W każdym innym języku musiałbyć zamknąć sprawdzaną treść w nawias. GM tego nie wymaga, ale na to pozwala.

Tak samo ze średnikami.

 

Skoro już tu jestem:

Cały kod lepiej przemyśleć.

 

te całe WD/WS/M nie są potrzebne jeśli się przemyśli kod.

 

GML
//Zmienne

W= keyboard_check(ord("W"));

A= keyboard_check(ord("A"));

S= keyboard_check(ord("S"));

D= keyboard_check(ord("D"));

var _walk = W | S | A | D; //Co to znaczy wyjasnie pod kodem

//Chodzenie

if W{

if place_free(x,y-moveSpeed){

y-=moveSpeed;

sprite_index = sHeroWalking;

image_speed = 0.14;

image_xscale = 1;

}

}

else if S{ //else if oznacza ze sprawdzi S tylko jesli nie trzymamy W. Oznacza to ze trzymajac jednoczesnie W oraz S, idziemy w gore(W)

if place_free(x,y+moveSpeed){

y+=moveSpeed;

sprite_index = sHeroWalking;

image_speed = 0.14;

image_xscale = 1;

}

}

 

if D{

if place_free(x+moveSpeed,y){

x+=moveSpeed;

sprite_index = sHeroWalking;

image_speed = 0.14;

image_xscale = 1;

}

}

else if A{ //Analogicznie do W/S

if place_free(x-moveSpeed,y){

x-=moveSpeed;

sprite_index = sHeroWalking;

image_speed = 0.14;

image_xscale = -1;

}

}

//Animacja stania

if !_walk{

image_speed= 0.05;

sprite_index= sHero;

}

 

 

Wyjaśnienie lini _walk = W | S | A | D;:

 

Kiedy piszesz W = keyboard_check(ord("W")); zapisujesz do zmiennej W odpowiedź na to czy W jest wciśnięte czy nie.

Ta odpowiedź brzmi TRUE albo FALSE. TRUE to 1, FALSE to 0.

Te liczby bitowo wyglądają tak*:

TRUE: 0x00000001 //Liczba bitowa na TRUE

FALSE: 0x00000000 //Liczba bitowa na FALSE

 

W swoim kodzie używasz słowa and. Zamiast and można napisać &&. Innym testem jest lub czyli or które też można zapisać tak: ||.

Gdybyś zapisał coś takiego:

GML
if keyboard_check(ord("W")) || keyboard_check(ord("S")){

//Jakis kod

}

To jakiś kod by się wykonał jeśli wciśniesz W lub S.

 

Więc co oznacza | ?

Samo, pojedyńcze | to takie "LUB" sprawdzane w bitach, a nie logicznie.

Co to oznacza:

Bity mają zera lub jedynki, z nich składają się wartości, z nich składają się liczby które zapisujesz w zmiennych.

Na przykład tak bitowo wyglądają liczby 27 i 45:

 

27: 00011011

45: 00101101

 

Bitowe LUB oznacza, że łączymy te dwie wartości w jedną.

Wygląda to tak: Jeżeli w pierwszej LUB drugiej liczbie jest 1, zapisz 1. Jeżeli w obu jest 0, zapisz zero.

 

czyli 27 | 45 to:

 

00011011

00101101

-----------

00111111

 

Tak jak widzisz jeżeli w jednej liczbie(lub w obu) jest 1, to zapisujemy 1.

 

Okej, ale jak to się ma do var _walk = W | S | A | D; ?

 

Jak już mówiłem, w każdej z tych zmiennych ( W S A D ) mamy zapisane 1 lub 0 w zalezności czy przycisk jest wciśnięty.

Robiąc taką linijkę kodu, zapisujemy do _walk 1 jeżeli którykolwiek przycisk został wciśnięty oraz 0 jeżeli żaden nie został wciśnięty.

 

Przykładowo trzymamy D, ale żaden inny przycisk:

 

W = 0 = 00000000

S = 0 = 00000000

A = 0 = 00000000

D = 1 = 00000001

---------------------

_walk = 00000001

 

 

Pomyślałem, że jeśli dostajesz odpowiedź na tacy to lepiej żebyś się czegoś nowego nauczył :jezor:

 

 

* - Uproszczenie, GM robi to troche inaczej. Doswiadczeni userzy nie bijcie.

Odnośnik do komentarza
Udostępnij na innych stronach

No dobra, zaraz mi walniesz obszerną listę hipsterskich języków.

Wszystkie największe / najpopularniejsze tego wymagają.

Może skupmy się na temacie, a nie moim doborze słów?

Edit: A co do informacji, mógłbyś dać mu złe zrozumienie programowania, mówiąc mu że to się robi tylko z powodów estetycznych.

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