Skocz do zawartości

Deszcz + burza + błyskawice na zaznaczonym wyłącznie fragmencie planszy GMS 1.4


Rekomendowane odpowiedzi

Cześć,

 

Potrzebuje żywego przykładu..

Mam na myśli deszcz oraz błyskawice losowo które bedą się pojawiać a ekran będzie wtedy migał.

 

Na necie jest troche przykładów..ale jest jeden haczyk..

 

Chciałbym mieć możliwość taką że zaznaczam fragment planszy i tylko na tym fragmencie planszy ma pojawić się deszcz z błyskawicami.

Nie na całości scenerii..

 

Ktoś wie z was jak coś takiego zrobić?

Z góry wszystkim pragnę podziękować za wszelką pomoc.

Odnośnik do komentarza
Udostępnij na innych stronach

Dobra...znalazłem taki przykład z  neta

 

co prawda na emiterach na razie nie widzę,żeby obciążało zbyt mocno procesor..

Zresztą chcę to tylko używać na małym obszarze planszy..

mam tu deszcz i mgłę..ale brakuje błysku..burzy...może ktoś wspomoże mnie? fajnie jakby taki błysk działał z piorunami lub bez piorunów w creaction code deszczu.

 

a teraz do rzeczy;-)

 

zaznaczam sobie na room edytorze fragment prostokątny na którym ma się utworzyć deszcz i tak się też dzieje..

problem jest tego typu...kiedy przemieszczam się bohaterem to ten fragment deszczu też się przemieszcza..a zależy mi na tym żeby był wyłącznie w tym miejscu co go zaznaczyłem..

Dziwnie to wygląda,bo jak przemieszczam się bohaterem np góra dół..to widzę "początek zaczęcia tworzenia deszczu/sprita deszczu" a nie powinienem tego widzieć..

Być może ma to wpływ parallaxa moja w grze,ale mimo to chciałbym żeby był w stałym miejscu...bez względu na ruch gracza.

Gnysek wspomniał o draw_surface..to jest ok.ale jak to ze sobą połączyć?

 

ten kod jest dość uniwersalny...

żeby deszcz padał muszę jeszcze w room edytorze w creacion code obj_deszcz wpisać taki kod który stworzy deszcz o sile padania =1 tak przynajmniej to rozumiem.

i zapewne tu w creaction code trzeba by było ustawić stałe położenie deszczu...

 

wolałbym konkretne rozwiązanie niż sugestia..;-) ja wiem,że Gnysek robi co może,ale myślę,że ktoś z was NA PEWNO mógł mieć z tym styczność...

 

obj_deszcz

room_edytor creation code

 

haveParticles(pRain,1);

obj_deszcz

 

create

 

hspdAdd = 0;
vspdAdd = 0;

partEmitter = part_emitter_create(partSystem);
partType = ds_list_create();
partCount = ds_list_create();

destroy

 

part_emitter_destroy(partSystem,partEmitter);
ds_list_clear(partType);
ds_list_clear(partCount);

begin step

 

hspd += other.hspdAdd;
vspd += other.vspdAdd;


if ds_list_size(partType) > 0  && !notInView(){
 part_emitter_region(partSystem,partEmitter,max(bbox_left,view_xview[0]),min(bbox_right,view_xview[0]+view_wview[0]),max(bbox_top,view_yview[0]),min(bbox_bottom,view_yview[0]+view_hview[0]),ps_shape_rectangle,ps_distr_linear);
 for (i=0;i<ds_list_size(partType);i++) {
  part_emitter_burst(partSystem,partEmitter,ds_list_find_value(partType,i),ds_list_find_value(partCount,i)*((min(bbox_right,view_xview[0]+view_wview[0])-max(bbox_left,view_xview[0]))/32)*((min(bbox_bottom,view_yview[0]+view_hview[0])-max(bbox_top,view_yview[0]))/32));
 }
}

 

 

i emitery...

któryś z nich odpowiada za to gdzie zaczyna się rysowanie kropli deszczu..który to jeszcze nie wiem...

 

 

pDeszcz = part_type_create()
part_type_alpha3(pDeszcz,0,.5,0);
//part_type_colour1(pDeszcz,c_aqua);
//part_type_shape(pDeszcz,pt_shape_line);
part_type_sprite(pDeszcz, spr_kropladeszczu, 0, 0, 0);
//part_type_size(pDeszcz,0.15,0.15,0,0);
part_type_gravity(pDeszcz,1,270);
part_type_direction(pDeszcz,270,270,0,0);
part_type_speed(pDeszcz,8,16,0,0);
part_type_orientation(pDeszcz,90,90,0,0,0);
part_type_life(pDeszcz,3,5);

 

Odnośnik do komentarza
Udostępnij na innych stronach

Jednak będę potrzebował waszej pomocy...

Nie będę wklepywał tu setek kodu..

do rzeczy..

 

1. sprawa co wyżej rozwiązana..podniosłem wartość y o y-50 i jest ok;-)

2. mam już kod na pioruny oraz kod na błyskanie ekranu..

Obecnie błyska i grzmi na całej planszy..chce aby wyłącznie grzmiało i błyskało na tym fragmencie do zaznaczyłem w room edytorze deszcz...

Próbowałem dodać to do kodu...w draw błyskawicy i piorunów

 

max(bbox_left,view_xview[0]),min(bbox_right,view_xview[0]+view_wview[0]),max(bbox_top,view_yview[0]),min(bbox_bottom,view_yview[0]+view_hview[0])

ale mimo to nic się nie dzieje..

 

jeszcze raz poniżej kod..

 

obj_deszcz

(ma sprita niewidzialnego którego rozciągam w room edytorze i na danej nierozciągniętej części ekranu pada deszcz

 

obj_deszcz

 

begin step

 

if ds_list_size(partType) > 0  && !notInView(){
 part_emitter_region(partSystem,partEmitter,max(bbox_left,view_xview[0]),min(bbox_right,view_xview[0]+view_wview[0]),max(bbox_top,view_yview[0]-50),min(bbox_bottom,view_yview[0]+view_hview[0]),ps_shape_rectangle,ps_distr_linear);
 for (i=0;i<ds_list_size(partType);i++) {
  part_emitter_burst(partSystem,partEmitter,ds_list_find_value(partType,i),ds_list_find_value(partCount,i)*((min(bbox_right,view_xview[0]+view_wview[0])-max(bbox_left,view_xview[0]))/32)*((min(bbox_bottom,view_yview[0]+view_hview[0])-max(bbox_top,view_yview[0]))/32));
 }
}
                                        
                                        
//Tworzymy blysk i blyskawice
if random(80) < 1 //jesli wartosc losowa wynosi 1
{
instance_create(random(room_width),0,obj_piorun); //Tworzymy piorun
instance_create(0,0,obj_blyskawica) //Tworzymy blysk
}                                        

i teraz tak

 

obj_blyskawica

 

draw

 

draw_sprite_ext(sprite_piksel,0,0,0,room_width,room_height,0,c_black,image_alpha);

obj_piorun

 

draw

 

 

///Rysujemy piorun 

n_br = 0; //Liczba galezi

//Uzywamy mb dla galezi glownych i sub dla rozgalezien
mb_dir = 200+random(140); //Kierunek fragmentu linii
for (i=0;i<_irr;i+=1) {
    mb_x[i] = _x; mb_y[i] = _y; //Pozycja porazenia
    _branching = (random(_br)<1); //Niezalezne porazenia od pioruna i rozgalezienia
    if (_branching = true) {
       n_br += 1;
       b_irr[n_br] = random(_irr); //Ilosc porazen dla tego rozgalezienia
       sb_x[n_br,0] = mb_x[i]; sb_y[n_br,0] = mb_y[i]; 
       
       _c = cos(pi*floor(random(2)));
       if (_c=1) sb_dir = 190+random(60);
       else sb_dir = 350-random(60);
       
// To sprawia, że galac będzie w lewo lub w prawo; nie w lewo i potem w prawo
       
       for (j=1;j<b_irr[n_br];j+=1) {
           sb_x[n_br,j] = sb_x[n_br,j-1]+lengthdir_x(random(_ml),sb_dir);
           sb_y[n_br,j] = sb_y[n_br,j-1]+lengthdir_y(random(_ml),sb_dir);
           if (_c=1) sb_dir = 190+random(60);
           else sb_dir = 350-random(60);
           }
       }
    _x += lengthdir_x(random(_ml),mb_dir);
    _y += lengthdir_y(random(_ml),mb_dir);
    
    mb_dir = mb_dir-30+random(60);
    if (mb_dir > 340) mb_dir -= random(60);
    if (mb_dir < 200) mb_dir += random(60); //Piorun nie idzie w gore;zapobiegamy temu
    }
alpha -= 1/9; //Powolne zanikanie pioruna
if alpha<0{instance_destroy()} //Niszczenie jak zaniknie juz piorun

draw_set_blend_mode(bm_add); 
draw_set_color(make_color_rgb(217,160,255)); //Ustawiamy rzecz na kolor purpurowy
draw_set_alpha(alpha/2); //Rysujemy piorun w podanej wartosci alpha

for (xxx=-1;xxx<=1;xxx+=1) {
    for (yyy=-1;yyy<=1;yyy+=1) {
        
        draw_primitive_begin(pr_linestrip);
        for (i=0;i<_irr;i+=1) {
            draw_vertex(mb_x[i]+xxx,mb_y[i]+yyy);
            }
        draw_primitive_end();

    for (i=1;i<n_br;i+=1) {
        draw_primitive_begin(pr_linestrip);
        for (j=0;j<b_irr[i];j+=1) {
            draw_vertex(sb_x[i,j]+xxx,sb_y[i,j]+yyy);
            }
        draw_primitive_end();
        }
    
    }
}
    
draw_set_alpha(1); //Ustawienie przezroczystosci 
draw_set_color(c_white); //Ustawienie koloru

 

Odnośnik do komentarza
Udostępnij na innych stronach

Chyba zagram w toto lotka;-) bo chyba nikt tu nie zagląda..

Zawsze jakaś szansa,że trafię chociaż trójkę ;-) parę groszy wpadnie;D

 

Jeśli chodzi o wymuszenie pozycji obiektu błysku zrobiłem coś takiego..

znając współrzędnie z room edytota

 

w draw dałem tak

 draw_sprite_stretched_ext(sPixel2, 0, x+200, y, 1000, 600, c_black, 1);

Co prawda może nie jest to super rozwiązanie,ale w takim oknie na takim obszarze miga obraz...

Wolałbym mieć uniwersalne rozwiązanie..bo rozmiar okna mogę zmienić i wtedy znów musiałbym ręcznie zmieniać parametry w draw obiektu błyskawicy

Takiego też rozmiaru jest obj_deszcz który rozciągam niewidzialnym spritem w room edytorze i na tym fragmencie tworzy się deszcz...

Ten obj_deszcz może mieć dowolny rozmiar to jego zaleta...

 

Ok został jeszcze piorun...

tu nie wiem jak to rozwiązać..nawet nie mam koncepcji..

mam współrzędne wyżej linijka..

ale jak to zrobić? dać w draw pioruna jakiś warunek?

Gnysek wspominał o draw_surface...

tych draw_surface jest od groma..

może chodzi o

draw_surface_part?

pomoglibyście Mi z tymi piorunami?

chciałbym żeby występowały wyłącznie na tym obszarze co wyżej...

 

tu jeszcze raz kod w draw piorunów

 

obj_piorun

 

draw

 

///Rysujemy piorun 

n_br = 0; //Liczba galezi

//Uzywamy mb dla galezi glownych i sub dla rozgalezien
mb_dir = 200+random(140); //Kierunek fragmentu linii
for (i=0;i<_irr;i+=1) {
    mb_x[i] = _x; mb_y[i] = _y; //Pozycja porazenia
    _branching = (random(_br)<1); //Niezalezne porazenia od pioruna i rozgalezienia
    if (_branching = true) {
       n_br += 1;
       b_irr[n_br] = random(_irr); //Ilosc porazen dla tego rozgalezienia
       sb_x[n_br,0] = mb_x[i]; sb_y[n_br,0] = mb_y[i]; 
       
       _c = cos(pi*floor(random(2)));
       if (_c=1) sb_dir = 190+random(60);
       else sb_dir = 350-random(60);
       
// To sprawia, że galac będzie w lewo lub w prawo; nie w lewo i potem w prawo
       
       for (j=1;j<b_irr[n_br];j+=1) {
           sb_x[n_br,j] = sb_x[n_br,j-1]+lengthdir_x(random(_ml),sb_dir);
           sb_y[n_br,j] = sb_y[n_br,j-1]+lengthdir_y(random(_ml),sb_dir);
           if (_c=1) sb_dir = 190+random(60);
           else sb_dir = 350-random(60);
           }
       }
    _x += lengthdir_x(random(_ml),mb_dir);
    _y += lengthdir_y(random(_ml),mb_dir);
    
    mb_dir = mb_dir-30+random(60);
    if (mb_dir > 340) mb_dir -= random(60);
    if (mb_dir < 200) mb_dir += random(60); //Piorun nie idzie w gore;zapobiegamy temu
    }
alpha -= 1/9; //Powolne zanikanie pioruna
if alpha<0{instance_destroy()} //Niszczenie jak zaniknie juz piorun

draw_set_blend_mode(bm_add); 
draw_set_color(make_color_rgb(217,160,255)); //Ustawiamy rzecz na kolor purpurowy
draw_set_alpha(alpha/2); //Rysujemy piorun w podanej wartosci alpha

for (xxx=-1;xxx<=1;xxx+=1) {
    for (yyy=-1;yyy<=1;yyy+=1) {
        
        draw_primitive_begin(pr_linestrip);
        for (i=0;i<_irr;i+=1) {
            draw_vertex(mb_x[i]+xxx,mb_y[i]+yyy);
            }
        draw_primitive_end();

    for (i=1;i<n_br;i+=1) {
        draw_primitive_begin(pr_linestrip);
        for (j=0;j<b_irr[i];j+=1) {
            draw_vertex(sb_x[i,j]+xxx,sb_y[i,j]+yyy);
            }
        draw_primitive_end();
        }
    
    }
}
    
draw_set_alpha(1); //Ustawienie przezroczystosci 
draw_set_color(c_white); //Ustawienie koloru

a tu wywołuje te dwa obiekty w obiekcie deszcz

 

obj_deszcz

begin step

 

if ds_list_size(partType) > 0  && !notInView(){
 part_emitter_region(partSystem,partEmitter,max(bbox_left,view_xview[0]),min(bbox_right,view_xview[0]+view_wview[0]),max(bbox_top,view_yview[0]-50),min(bbox_bottom,view_yview[0]+view_hview[0]),ps_shape_rectangle,ps_distr_linear);
 for (i=0;i<ds_list_size(partType);i++) {
  part_emitter_burst(partSystem,partEmitter,ds_list_find_value(partType,i),ds_list_find_value(partCount,i)*((min(bbox_right,view_xview[0]+view_wview[0])-max(bbox_left,view_xview[0]))/32)*((min(bbox_bottom,view_yview[0]+view_hview[0])-max(bbox_top,view_yview[0]))/32));
 }
}
                                        
                                        
//Tworzymy blysk i blyskawice
if random(80) < 1 //jesli wartosc losowa wynosi 1
{
instance_create(random(room_width),0,obj_piorun); //Tworzymy piorun
instance_create(0,0,obj_blyskawica) //Tworzymy blysk
}                                  

 

Z tym surface kombinuje..

To ma sens..ale nie wiem czy dobrze to rozumiem..

Żeby wymusić konkretną pozycję obj_piorun to w draw muszę dodać taki wpis

 

 


if !surface_exists(surf)
    {
    surf = surface_create(view_width, view_height);
    draw_surface_part(surf, 0, 0, 1000, 600, x+200, y );

    }

A w create obj_pioruna

Coś takiego..

surf = surface_create(view_width, view_height);

 

 

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Zaglądamy, ale jak widzimy 300 linijek kodu na którymi trzeba sporo czasu pomyśleć, bo nie znamy całego kodu (co do czytania byłoby jeszcze gorsze), to się nam nie chce.

Odnośnik do komentarza
Udostępnij na innych stronach

Spokojnie..tu nie chodzi o analize całego kodu...

Napisałem co chciałbym osiągnąć..

Wspominałeś żebym użył funkcji surface...

Właśnie to chce zrobić..tylko utknąłem z problemem.

Próbuje zmusić piorun żeby generował się na danym tylko obszarze,a nie całej scenerii..

Wyżej są współrzędne gdzie ma się te zjawisko pojawiać..

W przypadku wcześniejszym jak błysk było to o tyle łatwiejsze bo wystarczyło użyć w draw tej funkcji...

 

draw_sprite_stretched_ext(sPixel2, 0, x+200, y, 1000, 600, c_black, 1);

Natomiast przy piorunie to się nie sprawdzi..

Bo piorun nie ma sprita..

 

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