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

828 odpowiedzi na to pytanie

Rekomendowane odpowiedzi

  • 0

Kontekst: Znak ! znaczy to samo co not

 

zamiast robić if !vspeed=0 zrób if vspeed!=0

 

Możliwe że kompilator interpretuje !vspeed jako "Odwóć vspeed", gdzie wartość 0 i mniej to negative a powyżej 0 to positive. Program zamienia wartość dodatnią (>0)(czyli TRUE) na 0 (czyli FALSE), podczas gdy wartość jest ujemna (<0) jest już FALSE więc zostaje zmieniona na TRUE czyli 1.

A że 1 nie równa się 0 kod się nie wykonuje.

Tutaj jeszcze tabelka dla zwizualizowania sytuacji

Liczba Wartość Odwrócona wartość Odwrócona wartość w formie liczbowej  
<0 FALSE TRUE 1 Nie równe 0, nie wykonuje kodu.
0 FALSE TRUE 1 Nie równe 0, nie wykonuje kodu.
>0 TRUE FALSE 0 Równe 0, wykonuje kod

Udostępnij tego posta


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

Musiałbyś to zapisać w ten sposób:
 

if not (vspeed = 0) sprite_index = s_Player_Jump;

albo

if  !(vspeed = 0) sprite_index = s_Player_Jump;


nie wiem czy to dobrze wytłumaczę, ale w Twoim przykładzie not odnosi się tylko do vspeed i GM traktuje vspeed jako true/false a nie jako zmienną int.

not vspeed daje false i to póżniej przyrównuje do 0 (czyli wg GM drugie false) co razem daje true. To samo powinno być jakbyś zapisał

if  vspeed  sprite_index = s_Player_Jump;

 

Udostępnij tego posta


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

if not vspeed = 0

to dokładnie to samo co

if (not vspeed) = 0

 

zatem w tej sytuacji, negujesz vspeed (zatem zwraca true gdy vspeed jest 0 i false w pozostałych przypadkach).

 

Tobie chodzi o:

 

if not (vspeed = 0).

Udostępnij tego posta


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

nie ma. poza tym, nie wiem, czy w ogole oplacalnym jest utrzymywanie wsparcia dla wymarlej architektury prockow.

Udostępnij tego posta


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

IDE jest 64bitowe, ale gry chyba nadal 32 :P

Udostępnij tego posta


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

Szybki temat, nie wiem jak się za to zabrać:

To jest zmienna, która odpowiada za to, że na tej długości pikseli wróg widzi i strzela do mnie:

max_range = 600 - czyli w promieniu 600 pxl widzi i naparza.

Chciałbym to zamienić, aby to 600 stało się zakresem viewa gracza, czyli krótko mówiąc, aby strzelał, tylko gdy go widzę na ekranie.

Pozdro :D

Udostępnij tego posta


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

Lolik, musisz zrobić coś w stylu collision_rectangle, tylko na view'a. Dam Ci prosty kod, zmień go na własne potrzeby (uwzględnij spirte_width wroga itp)

 

vx = view_xview;
vy = view_yview;

vh = view_hview;
vw = view_wview;


if(  (x >= vx and x <= vx+vw) and (y >= vy and y <= vy+vh)  )
{
    //kod na strzelanie w gracza
}
else
{
    //kod na cokolwiek, kiedy gracza nie widzi
}

 

Udostępnij tego posta


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

Nope, w Create sprawdzi kod tylko raz przy tworzeniu instancji. Gra musi sprawdzać to co klatkę tak, żeby nie przeoczyła momentu kiedy wróg pojawia się w polu widzenia gracza, tak więc wklejasz to w Step. Jedynie co możesz dać w Create to zmienne, ale równie dobrze zamiast zmiennych własnych, możesz napisać od razu view_xview zamiast vx.

Udostępnij tego posta


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

Tu jest ów fragment kodu:

 

if on_turret
            {
                if df < inaccuracy+turret_nearest.inaccuracy*2
                && collision_line(x,y,x+lengthdir_x(turret_nearest.max_range,dir),y+lengthdir_y(turret_nearest.max_range,dir),enemy_nearest,prec_wall_collision,1)
                && !collision_line(x,y,x+lengthdir_x(turret_nearest.max_range,dir),y+lengthdir_y(turret_nearest.max_range,dir),ally,prec_wall_collision,1)
                {
                    event_user(1) // shoot
                    shooting = 1
                }
            }
            else
            {
                if df < inaccuracy*2
                && collision_line(x,y,x+lengthdir_x(max_range,dir),y+lengthdir_y(max_range,dir),enemy_nearest,prec_wall_collision,1)
                && !collision_line(x,y,x+lengthdir_x(max_range,dir),y+lengthdir_y(max_range,dir),ally,prec_wall_collision,1)
                {
                    event_user(1) // shoot
                    shooting = 1
                }
            }

Podmianka max_range, na te dane vx vw itp sprawiło, że oponent nie strzela wcale.

Udostępnij tego posta


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

Tak jak napisałem wyżej, musisz zrobić coś na podobieństwo colission_rectangle, czyli wywal całkiem swoje collision_line, nie używaj tego. Nie wiem co znaczą twoje zmienne, ale jak na mój rozum, drugiego ifa też trzeba się pozbyć, zostaje tylko ten pierwszy (cokolwiek robi). Coś takiego, powinno być.

 

if(  (x >= vx and x <= vx+vw) and (y >= vy and y <= vy+vh)  )
{
    //kod na strzelanie w gracza
	event_user(1) // shoot (co to jest?)
    shooting = true // do uzyskiwania wyniku prawda/fałsz nie używaj int'a tylko bool'a - zajmuje mniej komórek pamięci w Ramie (optymalizacja)
}
else
{
    //kod na cokolwiek, kiedy gracza nie widzi
    shooting = false
}

Pokombinuj na różne sposoby. Ogólnie, mój kod:

(x >= vx and x <= vx+vw) and (y >= vy and y <= vy+vh)

Zwraca Ci wartość z czy przeciwnik wchodzi w view gracza. Dając "else" po tym if'ie, negujesz tą wartość, czyli wychodzi "false"
Przypatrz się dobrze, spróbuj zrozumieć :thumbsup:

Udostępnij tego posta


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

Dobrodzieje, jak użyć xscala, by nie naruszyć image angle? Zawsze gdy używam xscale, to image angle również podlega xscale. Co zrobić, by uniknąć takiej sytuacji?

Udostępnij tego posta


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

Ale jedno z drugim nie ma żadnego związku. W kodzie pewnie gdzieś masz napisaną jakąś zależność między jednym a drugim 

Udostępnij tego posta


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

 

Mam obiekt(ręce), który ma być przekręcony (image_angle) w zależności położenia myszki. Lecz gdy myszka będzie po drugiej stronie obiektu (lewej) (x<x) ma wykonać image_xscale -1. Lecz gdy to zrobię, obiekt obraca się o 180 stopni, i jest w kierunku przeciwnym od kursora myszki

EDIT: jest w przeciwnym kierunku od kursora myszki aż do momentu powrotu na pierwszą stronę(prawą).

EDIT2 Tak to wygląda:

20181007_110003.gif

Chcę, by ręce podlegały xscale, lecz by nie obracały się tyłem od kursora, żeby w czasie xscale nie było rotacji

EDIT:3 Sorry, pomyliłem xscale z yscale xd. jest już wszystko ok. Dzięki za odp

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

×