Czy wiesz, że... na forum możesz uzyskać pomoc nt. modowania GTA?
Strona główna forum Szukaj Rejestracja
Witaj, nieznajomy!
Poprzedni 1 Następny
Postów: 1004 Dołączył: 2009-01-20
#
Czy da się jakoś napisać pętle sprawdzającą żeby nie pisać za każdym razem po jakieś akcji że np. czy aktor zginą, czy został złapany przez policje albo czy samochód, który ma się jeździć przez całą akcje został rozwalany?
Postów: 878 Dołączył: 2009-01-20
#
Sprawę ułatwi Ci tzw. konstrukcja wysokiego poziomu przy użyciu pętli while:

Kod:
while true
  
wait 0
  if
    
0118: actor 0@ dead
  then
    
// zrob cos

  end

  
if
    0119: car 0@ wrecked
  then
    
// zrob cos

  else
    
// zrob cos

  end

  
if
    00EC: actor $PLAYER_ACTOR sphere 0 near_point 1812.369 -1929.922 radius 80.0 80.0
  then
    
// zrob cos

    break
  end
end


Poleceniem "break" wychodzisz z pętli while. Trochę więcej o pętlach wysokiego poziomu:
http://www.gta-mods.pl/artykuly/49/petle-wysokiego-poziomu

___________________
Administrator
Postów: 1004 Dołączył: 2009-01-20
#
W zasadzie kiedyś to czytałem ale nie bardzo rozumiem co oznaczają takie polecenia(czy jak to się zwie) jak "while true" czy "end" chociaż end z angielskiego po naszemu to zakończenie czy tam koniec czegoś, chyba. Dokładniej to mi chodzi o to czemu w kodzie jest raz jedno end a czasem nawet 3 end pod rząd. np
Kod:

jakiś kod
end

albo tak
Kod:

jakiś kod
end
 end
  end

przy tym właśnie się najbardziej gubię
Postów: 878 Dołączył: 2009-01-20
#
Wyjaśnienie if

Pełna konstrukcja instrukcji if wygląda tak:
Kod:
if
  // warunek

then
  
// akcja dla spelnionego warunku

else
  
// akcja dla niespełnionego warunku

end


end zamyka konstrukcję if. Kiedy tworzy się "ify w ifie" to w jednym miejscu następuje zamknięcie wielu ifów, np.

Kod:
if
  // coś

then
  
// akcja

  
  if
    
// kolejny warunek

  then
    
// kolejna akcja


    if
      
// trzeci warunek

    then
      
// trzecia akcja

    else
      
// coś

    end
  
end
end



Wyjaśnienie while

Jeśli chodzi o while, to można to wytłumaczyć w ten sposób: "Podczas, gdy dany warunek jest spełniony, wykonuj następujące zadanie" lub "Wykonuj to zadanie tak długo, jak długo spełniony jest dany warunek".

W kodzie, który podałem, tym warunkiem jest po prostu wyrażenie true, czyli prawda, a więc ten warunek zawsze będzie spełniony, choćby nie wiem co. Coś takiego sprawi, że pętla będzie wykonywać się cały czas, aż do momentu, kiedy sam z niej wyjdziesz przy pomocy instrukcji break (przerwij).

Zamiast true można dać dowolną funkcję sprawdzającą (zwracającą false lub true). Przykłady są w poradniku, do którego dałem link.

___________________
Administrator
Postów: 1004 Dołączył: 2009-01-20
#
Może ktoś wytłumaczyć co ja mam wstawić w miejsce dla niespełnionego warunku w takiej pętli?
Kod:
if
  // warunek
then
  // akcja dla spelnionego warunku
else
  // akcja dla niespełnionego warunku
end


warunek - to jak rozumiem jakiś opcod sprawdzający czy np aktor został zabity czy tam nie

akcja dla spelnionego warunku - tuta jak rozumiem daje się opcody typu np. pokazujące napis że aktor zginoł

- akcja dla niespełnionego warunku - ale tutaj za nic nie mogę dojść co się powinno dawać.
Postów: 628 Dołączył: 2009-01-22
#
To nie jest wymagane, if...then...end też działa :P

Zrób sobie parę takich konstrukcji, skompiluj je i zdekompiluj ponownie. Będą one znowu w low-level i dzięki temu łatwiej je zrozumiesz.

___________________
Moderator
http://i.imgur.com/Abvv63y
Śledź mój kanał Twitter by być na bieżąco ze wszystkimi aktualizacjami moich modów!
Postów: 1004 Dołączył: 2009-01-20
#
Można powiedzieć że zrozumiałem o co z tymi nowymi pętlami chodzi ale jednego nadal nie mogę do końca zrozumieć. Jak je należy budować żeby np. pod czasz całej misji bez względu ile np. w czekpontów wejdzie aktor cały czasz było sprawdzane że np. aktor zginą. Żebym nie musiał za każdym razem tworzyć takiej pętli sprawdzającej. Co prawda po niżej w kodzie zrobiłem coś takiego ale nie do końca działa to tak jak powinno. Bowiem jak się wejdzie np. do pierwszego takiego czekpońta i pojawia się następny to można i tak wejść znowu do tego pierwszego, chociaż jak się nie wejdzie to też misje można wykonywać dalej.

Jeżeli ktoś by był taki miły i napisał gotowy przykład np. typu wchodzę do pierwszego czekpońta(zaczyna się misja) i potem do drugiego i trzeciego, a za każdym razem było by sprawdzane że aktor zginą to był bym wdzięczny.
Kod:
{$CLEO .cs}
0000: NOP

0247: request_model 400
Model.Load(#CELLPHONE)
03CF: load_wav 23000 as 3
038B: load_requested_models

048F: actor $PLAYER_ACTOR remove_weapons 
01EB: set_traffic_density_multiplier_to 0.1 
03DE: set_pedestrians_density_multiplier_to 0.0 
//010D: set_player $PLAYER_CHAR wanted_level_to 0

select_interior 0 
0860: link_actor $PLAYER_ACTOR to_interior 0 
Actor.PutAt($PLAYER_ACTOR, 2466.5825 -1687.6492 13.5154)
Actor.Angle($PLAYER_ACTOR) = 90.0

:start1
02A7: 1@ = create_icon_marker_and_sphere 23 at 2459.0408 -1687.2944 13.5418 radius 3.0

while true
  wait 0

  if
    00ED:   actor $PLAYER_ACTOR 0 near_point 2459.0408 -1687.2944 radius 1.0 1.0 on_foot
  then
  Player.CanMove($PLAYER_CHAR) = False
  fade 0 1500
  wait 1500
  08E7: disable_entrance_markers 1
  $ONMISSION = 1
  Marker.Disable(1@)
  03BC: 2@ = create_sphere_at 1764.8632 -2283.2903 -2.7649 radius 3.0
  018A: 3@ = create_checkpoint_at 1764.8632 -2283.2903 -2.7649
  00A1: put_actor $PLAYER_ACTOR at 2468.5623 -1689.1936 13.5154 
  Actor.Angle($PLAYER_ACTOR) = 260.0
  02EB: restore_camera_with_jumpcut 
  Player.CanMove($PLAYER_CHAR) = True
  wait 1500
  fade 1 1500
  break
  end
  end

while true
  wait 0
//sprawdza czy aktor zginoł
  :zginol1
  if
    0118: actor $PLAYER_ACTOR dead
  then
  00BA: show_text_styled GXT 'M_FAIL' time 5000 style 1
  Marker.Disable(1@)
  03BD: destroy_sphere 2@ // sfera
  0164: disable_marker 3@ // kwadracik na radarze
  08E7: disable_entrance_markers 0
  $ONMISSION = 0
  jump @start1
  break
  end 
  if
    00EC:   actor $PLAYER_ACTOR 0 near_point 1764.8632 -2283.2903 radius 1.5 1.5
  then
  03BD: destroy_sphere 2@ // sfera
  0164: disable_marker 3@ // kwadracik na radarze
  03D1: play_wav 3
  0729: AS_actor $PLAYER_ACTOR hold_cellphone 1
  wait 5000
  0729: AS_actor $PLAYER_ACTOR hold_cellphone 0
  wait 1000
  03BC: 2@ = create_sphere_at 1763.733 -2296.6899 -2.5939 radius 1.5
  018A: 3@ = create_checkpoint_at 1763.733 -2296.6899 -2.5939
  jump @zginol1
  break
  end   
  if
    00ED:   actor $PLAYER_ACTOR 0 near_point 1763.733 -2296.6899 radius 1.0 1.0 on_foot
  then
  Player.CanMove($PLAYER_CHAR) = False
  fade 0 1500
  wait 1500
  03BD: destroy_sphere 2@ // sfera
  0164: disable_marker 3@ // kwadracik na radarze
  00A1: put_actor $PLAYER_ACTOR at 1765.3459 -2273.4724 26.796
  Actor.Angle($PLAYER_ACTOR) = 180.0
  02EB: restore_camera_with_jumpcut 
  Player.CanMove($PLAYER_CHAR) = True
  wait 1500
  fade 1 1500
  jump @zginol1
  break
  end
  end
0A93: end_custom_thread
Poprzedni 1 Następny
Zaloguj się lub zarejestruj się, żeby pisać na forum.
Created & Powered by MakG