Skocz do zawartości

Temat zbiorczy na drobnostki


Chell
 Udostępnij

Rekomendowane odpowiedzi

Widzę że są inkrementacje +16, więc możesz skrócić kod do dwóch pętli for na zasadzie

GML
var result=false;

for(var i=1;i<4;i++){

if place_meeting(x+1,y-(i*16),obj_clif_right){

if image_xscale=1

clif_id=instance_place(x+1,y-(i*16),obj_clif_right);

else clif_id=0;

clif_size=i;

result=true;

break;

}

}

if !result for(var i=1;i<4;i++){

if place_meeting(x-1,y-(i*16),obj_clif_right){

if image_xscale=-1

clif_id=instance_place(x-1,y-(i*16),obj_clif_right);

else clif_id=0;

clif_size=i;

result=true;

break;

}

}

if !result{

clif_id=0;

clif_size=0;

}

 

 

Używamy zmiennej result do emulowania "else" w pętli for, żeby druga nam się nie wykonała jeżeli znalazło wynik. Emuluje też ostatnie else jeżeli nigdzie nie znalazło żadnego wyniku.

Edit: Dzięki zastosowaniu pętli możesz łatwo dodawać ostrzejsze klify bez dopisywania kodu.

Edit2: Możesz poeksperymentować czy robienie od razu instance_place zamiast place_meeting nie przyspieszy troche kodu.

Odnośnik do komentarza
Udostępnij na innych stronach

Hej czy można ustawić collision circle lub collision line z obiektem jakim jest kursor myszy? Czy może jednak muszę w takim wypadku stworzyć osobny obiekt którego x=mouse_x i y=mouse_y i w odniesieniu do niego badać collision circle lub collision line?

Możesz sobie zrobić obiekt który jednocześnie będzie kursorem i będzie miał kolizje.Bo szczerze to wątpię że dałoby radę pierwszemu sposobowi.

Odnośnik do komentarza
Udostępnij na innych stronach

Hey,czy jest jakaś funkcja,która zaokrągla liczby,przykładowo jest 564.934 i po użyciu funkcji liczba wygląda tak 564.9 ,

Czy muszę samemu to jakoś napisać,na pewno by się dało,ale myślę że jest na to szybszy sposób.

Najprościej jest tak:

GML
i = floor(i*100)/100

Ale chyba jest do tego funkcja. Tak jest string_format(val, tot, dec)

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy
macie może pomysł jak napisać ten sam kod ale w bardziej optymalny sposób?

 

W GMS2:

 

GML
var _a = [obj_clif_right, obj_clif_left];

var _break = false;

clif_id = 0;

clif_size = 0;

for(var _obj = 0; _obj < 2; _obj++) {

for (var _yy = 0; yy <= 2; yy++) {

if place_meeting(x, y-_yy*16, _a[_obj]) {

if (image_xscale == (_obj == 0 ? 1 : -1)) {

clif_size = _yy+1;

clif_id = instance_place(x,y-_yy*16, _a[_obj]);

_break = true;

break;

}

}

}

if _break break;

}

 

Dla GMS 1 trzeba zmienić pierwszą linijkę:

GML
var _a; _a[0] = obj_cliff_right; _a[1] = obj_clif_left;
oraz linijkę z image_xscale:

GML
if (image_xscale == 1 + (_obj == 1) * -2) {

 

Krócej już ciężko, ale może ktoś z was podejmie wyzwanie :D

Odnośnik do komentarza
Udostępnij na innych stronach

Ja z chęcią podjąłbym wyzwanie gdybym miał troszkę lepszego skilla...

 

A zamiast tego mam małe pytanie: Czy jest jakiś tutorial na to jak wstawić video do swojej gry? I mam tu na myśli nie video na cały ekran , ale raczej video np, w małej ramce w prawym górnym rogu ekranu, a na reszcie ekranu toczy się dalej rozgrywka.

 

 

Jeśli jest na to jakaś prosta funkcja lub kod , to wybaczcie proszę , że przychodzę z takimi banałami o pomoc.

 

Pozdrawiam,

nowy_user

Odnośnik do komentarza
Udostępnij na innych stronach

W GMS2:

 

GML
var _a = [obj_clif_right, obj_clif_left];

var _break = false;

clif_id = 0;

clif_size = 0;

for(var _obj = 0; _obj < 2; _obj++) {

for (var _yy = 0; yy <= 2; yy++) {

if place_meeting(x, y-_yy*16, _a[_obj]) {

if (image_xscale == (_obj == 0 ? 1 : -1)) {

clif_size = _yy+1;

clif_id = instance_place(x,y-_yy*16, _a[_obj]);

_break = true;

break;

}

}

}

if _break break;

}

 

Dla GMS 1 trzeba zmienić pierwszą linijkę:

GML
var _a; _a[0] = obj_cliff_right; _a[1] = obj_clif_left;
oraz linijkę z image_xscale:

GML
if (image_xscale == 1 + (_obj == 1) * -2) {

 

Krócej już ciężko, ale może ktoś z was podejmie wyzwanie :D

 

Jak zwykle pokonany przez Gnyska. Ale to dobrze, naucze sie czegos nowego ;).

Odnośnik do komentarza
Udostępnij na innych stronach

top down

 

wprowadzam animację nóg postaci-niezależnie od animacji góry.

 

Mam obiekt "obj_legs" który w zależności od prędkości danej postaci ustala prędkość swojej animacji.

 

Tylko z jakiegoś powodu zmienne "speed" "vspeed" "hspeed" zawsze u każdego wynoszą 0 mimo że aktywnie się poruszają

Zastępczo użyłem

GML
if (x!=xprevious)&&(y!=yprevious) {image_speed=.5}
ale mnie to zupełnie nie satysfakcjonuje bo chciałbym 3 prędkości ustawić (powolne kroki ,chód,bieg)

 

Dlaczego te zmienne się nie zmieniają skoro jest ruch? Postaci poruszają się przy pomocy "mp_potential_step"- podejrzewam że to jest problem.Ale jak w takim razie wymierzyć ich prędkość i pod to dostosować szybkość animacji???

 

Odnośnik do komentarza
Udostępnij na innych stronach

Widzę że są inkrementacje +16, więc możesz skrócić kod do dwóch pętli for na zasadzie

GML
var result=false;

for(var i=1;i<4;i++){

if place_meeting(x+1,y-(i*16),obj_clif_right){

if image_xscale=1

clif_id=instance_place(x+1,y-(i*16),obj_clif_right);

else clif_id=0;

clif_size=i;

result=true;

break;

}

}

if !result for(var i=1;i<4;i++){

if place_meeting(x-1,y-(i*16),obj_clif_right){

if image_xscale=-1

clif_id=instance_place(x-1,y-(i*16),obj_clif_right);

else clif_id=0;

clif_size=i;

result=true;

break;

}

}

if !result{

clif_id=0;

clif_size=0;

}

 

 

Używamy zmiennej result do emulowania "else" w pętli for, żeby druga nam się nie wykonała jeżeli znalazło wynik. Emuluje też ostatnie else jeżeli nigdzie nie znalazło żadnego wyniku.

Edit: Dzięki zastosowaniu pętli możesz łatwo dodawać ostrzejsze klify bez dopisywania kodu.

Edit2: Możesz poeksperymentować czy robienie od razu instance_place zamiast place_meeting nie przyspieszy troche kodu.

 

 

W GMS2:

 

GML
var _a = [obj_clif_right, obj_clif_left];

var _break = false;

clif_id = 0;

clif_size = 0;

for(var _obj = 0; _obj < 2; _obj++) {

for (var _yy = 0; yy <= 2; yy++) {

if place_meeting(x, y-_yy*16, _a[_obj]) {

if (image_xscale == (_obj == 0 ? 1 : -1)) {

clif_size = _yy+1;

clif_id = instance_place(x,y-_yy*16, _a[_obj]);

_break = true;

break;

}

}

}

if _break break;

}

 

Dla GMS 1 trzeba zmienić pierwszą linijkę:

GML
var _a; _a[0] = obj_cliff_right; _a[1] = obj_clif_left;
oraz linijkę z image_xscale:

GML
if (image_xscale == 1 + (_obj == 1) * -2) {

 

Krócej już ciężko, ale może ktoś z was podejmie wyzwanie :D

 

GM2 co prawda nie mam ale dzięki za pomoc :3 już poprawione

Odnośnik do komentarza
Udostępnij na innych stronach

Pierdoła, ale nie mam pomysłu, szukałem, ale nie znalazłem.

Chodzi o dach Top-Down, ustawiłem parenta, co by nie robić wszystkiego osobno, problem polega na tym, że kiedy wchodzę w interakcję w dachem znika tylko część na której stoję(składa się z kafelków 32x32, a ja chcę żeby znikały wszystkie po wejściu. Oto kod:

GML
if (place_meeting(x,y,o_gracz))

visible=false;

else

visible=true;

Odnośnik do komentarza
Udostępnij na innych stronach

Muszą być jakoś ze sobą powiązane. Kafelek z którym kolidujesz musi wiedzieć jakie inne kafelki ma ukryć.

Jeżeli używasz osobnych obiektów dla każdego dachu (co jest dość złym podejściem) to możesz to przerobić tak:

GML
if (place_meeting(x,y,o_gracz)) {

with (o_Dach_12) {

visible=false;

}

} else {

with (o_Dach_12) {

visible=true;

}

}

 

Jeżeli jednak masz tylko jeden obiekt który rozstawiasz na różne dachy to musisz zrobić jakąś listę elementów które są powiązane. A potem ukrywać wszystkie elementy tej listy.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy
Muszą być jakoś ze sobą powiązane. Kafelek z którym kolidujesz musi wiedzieć jakie inne kafelki ma ukryć.

Jeżeli używasz osobnych obiektów dla każdego dachu (co jest dość złym podejściem) to możesz to przerobić tak:

GML
if (place_meeting(x,y,o_gracz)) {

with (o_Dach_12) {

visible=false;

}

} else {

with (o_Dach_12) {

visible=true;

}

}

 

Jeżeli jednak masz tylko jeden obiekt który rozstawiasz na różne dachy to musisz zrobić jakąś listę elementów które są powiązane. A potem ukrywać wszystkie elementy tej listy.

 

To coś dla mnie, mistrza optymalizacji!

GML
o_Dach_12.visible = !place_meeting(x,y,o_gracz);

 

Odnośnik do komentarza
Udostępnij na innych stronach

  • 1 miesiąc temu...

Mam swiatlo ktore roztacza wokol siebie gracz (top down) - ktore stanowi jego zakres widzenia-reszta w mroku.

Mam tez swiatlo ktore wytwarzaja pochodnie.Oba swiatla sa zupelnie inne.Zależy mi na tym żeby w trakcie zbliżania sie do pochodni swiatlo gracza stopniowo i plynnie zanikalo i jedynym widocznym stawalo sie swiatlo pochodni (bo jak sie zmieszaja to slabo wyglada)- podobnie jak bede odchodzil chcialbym zeby stopniowo oswietlenie gracza sie wzmacnialo

 

Zrobilem cos takiego

 

if (distance_to_object(obj_glr_fire_light)<350){view_light=0 }
else if (distance_to_object(obj_glr_fire_light)<380)&&(distance_to_object(obj_glr_fire_light)>100){view_light=1}
else if (distance_to_object(obj_glr_fire_light)<400)&&(distance_to_object(obj_glr_fire_light)>200){view_light=2 }
else view_light=4 
 

gdzie zmienna view_light oznacza zasiego swiatla tworzonego przez gracza.Wyglada to ok powiedzmy ale jest dramatycznie NIE płynne,skokowo nastepuje zmiana.Jak to przerobić w płynny efekt?

Odnośnik do komentarza
Udostępnij na innych stronach

Oj bardzo głupio widzę jest to zrobione. Dlaczego nie jest to interpolacja liniowa? Określ minimalny zasię i maksymalny a potem dziel. To wszystko.

var _min=350;
var _max=400;
view_light=lerp(_min,_max,distance_to_object(obj_glr_fire_light)-_min)*4

 

Odnośnik do komentarza
Udostępnij na innych stronach

"Dlaczego nie jest to interpolacja liniowa?" pewnie dlatego że nie mam pojęcia jak się za to zabrać, do teraz:P

 

Dzięki ale niestety póki co kod w tej wersji mi się nie przysłużył bo wartości view light muszą być zamknięte pomiędzy 0-4.Jeżeli pojawia się minusowa wartość to nic się nie dzieje,a jak powyżej 4 to pole widzenia rozrasta za bardzo.W tej chwili wartości idą w tysiącach- jak podejdę do światła to jest chyba -30000 a jak odchodzę to rooooosnie masakrycznie ;p Sam efekt działa tylko w zakresie 0-4

Odnośnik do komentarza
Udostępnij na innych stronach

Vader: Teraz "view light" nie zmienia się w ogóle niezależnie od odległości do światła (cały czas 4) i nagle zmienia się na 0 kiedy wejdę w światło i wtedy staje się ujemny

 

 

ps.niech ktos coś zrobi z tym logowaniem bo mozna kvrwicy dostać. 9/10 prób logowania kończy się komunikatem "Twoje konto zostało zablokowane spróbuj ponownie za 29minut"- a dodatkowo po każdym wyjściu z GMclanu automatycznie się wylogowuje...

Odnośnik do komentarza
Udostępnij na innych stronach

Kolejność wykonywania działać zawiodła, dzieliło _min przez (_max-_min). Żeby nie robić tłoku w jednej lini rozbiłem to na kilka.

 

var _min = 350;
var _max = 450;
var clmp = 4;
var len = distance_to_object(obj_glr_fire_light)-_min;
var len2 = _max-_min;
var len = (len/len2)*clmp;
view_light=clamp(len,0,clmp);

 

  • Super (+1) 2
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ę
 Udostępnij

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...