Skocz do zawartości
  • 0
Chell

Temat zbiorczy na drobnostki

Pytanie

masz pytanie, które nie zasługuje na własny temat i chcesz je zadać w shoutboxie? nie rób tego! tam utonie! spytaj tutaj. :-)

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

787 odpowiedzi na to pytanie

Rekomendowane odpowiedzi

  • 0

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

 

GML

if place_meeting(x,y,obj_clif_right)

{

if image_xscale=1

{

clif_size=1

clif_id=instance_place(x,y,obj_clif_right);

}

else

{

clif_id=0

clif_size=0

}

 

}

else if place_meeting(x,y-16,obj_clif_right)

{

if image_xscale=1

{

clif_size=1

clif_id=instance_place(x,y-16,obj_clif_right)

}

else

{

clif_id=0

clif_size=0

}

 

}

else if place_meeting(x,y-32,obj_clif_right)

{

if image_xscale=1

{

clif_size=3

clif_id=instance_place(x,y-32,obj_clif_right)

}

else

{

clif_id=0

clif_size=0

}

 

}

else if place_meeting(x,y,obj_clif_left)

{

if image_xscale=-1

{

clif_size=1

clif_id=instance_place(x,y,obj_clif_left)

}

else

{

clif_id=0

clif_size=0

}

 

}

else if place_meeting(x,y-16,obj_clif_left)

{

if image_xscale=-1

{

clif_size=2

clif_id=instance_place(x,y-16,obj_clif_left)

}

else

{

clif_id=0

clif_size=0

}

 

}

else if place_meeting(x,y-32,obj_clif_left)

{

if image_xscale=-1

{

clif_id=instance_place(x,y-32,obj_clif_left)

clif_size=3

}

else

{

clif_id=0

clif_size=0

}

 

}

else

{

clif_id=0

clif_size=0

}

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

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.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

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.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

Raczej niema ale możesz zrobić tak

GML
round(frac(liczba)*10)/10+floor(liczba)

Brzydko ale działa :jezor:

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

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?

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
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.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

Dzięki, no tak robię, ale kiedyś bodajże Marmot napisał w którymś temacie ( już nie pamiętam którym) aby nie tworzyć obiektów ponad miarę, po to , żeby nie obciążać pamięci oraz zachować elegancję kodu, także staram się dostosować do tej rady.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
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)

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

A nie powinno być

GML
i = floor(i*10)/10

skoro chce jedną liczbę po przecinku?

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
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

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

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

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

Dlatego zastanów się, czy jest Ci to w ogóle potrzebne :)

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
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 ;).

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

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???

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
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

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

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;

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

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.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
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);

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

Nadałem im parent, jednak po sprawdzeniu waszych metod, nadal to samo, kod mam wpisać w step parenta, czy kafelka dachu ?

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

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?

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

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

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

"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

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

Myślę że tutaj lepszym rozwiązaniem będzie:

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

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

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

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

To jest logicznie niemożliwe żeby wartość była inna niż 0<=x<=4 przy użyciu clamp. Coś innego musi Ci zmieniać tę zmienną.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

No i nie jest inna.Tylko że albo jest cały czas 4 alb w pewnym momencie nagle zmienia się na 0, skokowo,żadnych wartości pośrednich

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

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

Zaloguj się tutaj

  • Przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników, przeglądających tę stronę.

×