Skocz do zawartości

Problem z latarką


SKiD

Rekomendowane odpowiedzi

Witam,

dzisiaj podjąłem się tworzenia latarki do mojego projektu. Na internecie znalazłem fajny przykład (Easy_Lighting by greyfox) który edytowałem do swoich potrzeb i tak dalej.

Sama latarka działa świetne ale teraz mam taki problem że na każdej następnej mapie gdzie możesz użyć latarki (włącza się ja za pomocą "F"), on staję się ciemniejsza i w ogóle.

 

Więc na mapie nr 1 latarka jest perfekcyjna, na mapie nr 2 widać jest różnicę ale nie jest aż tak bardzo spostrzegawcza, na mapie nr 3 pole latarki jest pomniejszone i ciemniejsze. Za każdą mapą latarka po prostu słabnie. Jakieś pomysły?

 

Trudno jest to opisać ale mam nadzieje że da się zrozumieć.

Z góry dzięki.

Odnośnik do komentarza
Udostępnij na innych stronach

Otóż nie na każdej mapie mam latarkę. Co do kodu to nie mam zielonego pojęcia o który wam chodzi bo jest kilka. Więc dam na wszelki wypadek wszystkie...

 

obj_flashlight

create

GML
//Set the yscale to .5.

image_yscale=.5

 

//If you want to draw the light with color declare this variable as true, otherwise false.

draw_color=true

 

//Since we are drawing this light with color, we need to set image_blend (color of light) and image_alpha (strength of light).

image_blend=c_blue

image_alpha=.5

 

//In order for an object to be taken into account as a light, this must be called.

script_light_add()

Step:

GML
//Position of the flashlights light.

x=obj_player_parent.x+lengthdir_x(16,point_direction(obj_player_parent.x,obj_player_parent.y,mouse_x,mouse_y))

y=obj_player_parent.y+lengthdir_y(16,point_direction(obj_player_parent.x,obj_player_parent.y,mouse_x,mouse_y))

 

//Direction of the flashlights light.

direction=point_direction(obj_player_parent.x,obj_player_parent.y,mouse_x,mouse_y)

 

//Length of our flashlights light.

image_xscale=min(max(.5,point_distance(x,y,mouse_x,mouse_y)/480),2)

 

obj_light_around_player

create:

GML
//Since we are NOT drawing this object with color, we set draw_color to false.

draw_color=false

 

//Set the size of the light to double it's standard size.

image_xscale=1

image_yscale=1

 

//In order for an object to be taken into account as a light, this must be called.

script_light_add()

step:

GML
x=obj_player_parent.x

y=obj_player_parent.y

 

obj_lighting_engine

create:

GML
//Create the surface used for our lighting engine.

sur=surface_create(view_wview[0],view_hview[0])

 

//Create a list that will contain the id's of objects that are lights.

global.list=ds_list_create()

 

//This finction must be called with every sprite that is a light.

sprite_set_alpha_from_sprite(spr_light,spr_light)

sprite_set_alpha_from_sprite(spr_flashlight,spr_flashlight)

 

//Makes things look purtyer.

texture_set_interpolation(true)

 

Step:

GML
//Run our lighting engine script (this can't be called in the draw event.)

//argument0 is the color used to indicate darkness.

//argument1 is the alpha value of the darkness.

script_light(c_black,1)

 

Draw:

GML
//Draw the lighting engine.

script_draw_light()

 

obj_player_parent

F pressed

GML
if instance_exists(obj_lighting_engine) and !instance_exists(obj_flashlight)

{

instance_create(x,y,obj_flashlight)

}

else

{

with(obj_flashlight)instance_destroy();

}

 

Są też 3 scripty więc jeśli to jest potrzebne to pisać to je tutaj też wrzucę.

Odnośnik do komentarza
Udostępnij na innych stronach

@kt1117

 

EDIT:

I problem nadal istnieje. (Latarka staje się ciemniejsza w następnych pokojach)

 

EDIT2:

Po ustawieniu obiektu persistent wszystko działa, prawdopodobnie muszę to tak zostawić i stworzyć inny obiekt który będzie usuwał latarkę z room w których jej nie chce...

 

EDIT3:

To się nacieszyłem bo znowu jestem w punkcie wyjścia... Jeśli nawet latarka zostanie zniszczona przez inny obiekt a potem zrobiona w np. następnym roomie to latarka będzie słabsza i będzie ciemniejsza...

Odnośnik do komentarza
Udostępnij na innych stronach

prawdopodobnie muszę to tak zostawić i stworzyć inny obiekt który będzie usuwał latarkę z room w których jej nie chce...

Niech sobie ta latarka trzyma tego surfejsa nawet w roomach w których go nie używasz (będzie jeden obiekt, z persistent, tak jak teraz masz), i wtedy tylko cały step i draw rozpoczynasz kodem

GML
if(global.latarka)

{

I zostaw w Game End to surface_free().

 

mień latarce event Create, na game start.
Będzie się bugować, bo obiekty w innych roomach i tak by się tworzyły, tyle, że te następne by nie miały stworzonego surfejsa (game start) a próbowały z nich korzystać (step/draw)
Odnośnik do komentarza
Udostępnij na innych stronach

W stu procentach o to chodziło?

Bo wyskakuje im problem o:

ERROR in
action number 1
of Draw Event
for object obj_lighting_engine:

Error in code at line 1:
   if(global.latarka)
            ^
at position 11: Unknown variable latarka

 

Może coś nie tak zrobiłem, jakieś pomysły? D:

Odnośnik do komentarza
Udostępnij na innych stronach

Zależy o który obiekt tutaj chodzi. We wszystkich trzech mam jakiś kod w Create Event, jeśli o to chodzi. Natomiast do włączania i wyłączania latarki używam parenta gracza który sprawdza czy latarka istnieje jeśli nie to tworzy latarkę jeśli tak to ją niszczy.

Odnośnik do komentarza
Udostępnij na innych stronach

Jestem pewny, że chodzi o jakąś drobnostkę.

Daj kod script_light i script_light_add.

 

E: sprawdź też w Debug Mode ile instacji każdego obiektu jest w kolejnych mapach, tzn. graj na Debugu i sprawdzaj, czy nie tworzą się jakieś nowe obiekty.

Odnośnik do komentarza
Udostępnij na innych stronach

Tutaj macie

script_light_add

GML
//Add the object's id to the list used to identify lights.

ds_list_add(global.list,id)

script_light

GML
//If there are no entries for lights then the engine won't run.

if ds_list_empty(global.list) then exit

 

//Set the blend mode to subtract.

draw_set_blend_mode(bm_subtract)

 

//Set the drawing target to our surface sur.

surface_set_target(sur)

 

//Clear the surface in the given color and alpha based on its respective arguments.

draw_clear_alpha(argument0,argument1)

 

//Initialize a for loop. This will loop through each block in our list of id's.

for (i=0;i<ds_list_size(global.list);i+=1)

{

//Create a temporary variable 'object' and assign it to the instance at location i in the list.

var object;

object=ds_list_find_value(global.list,i)

 

//Draw the light on the surface.

with object draw_sprite_ext(sprite_index,0,x-view_xview[0],y-view_yview[0],image_xscale,image_yscale,direction,c_white,1)

}

//Set the drawing target back to the screen.

surface_reset_target()

 

//Set the blend mode back to normal.

draw_set_blend_mode(bm_normal)

Odnośnik do komentarza
Udostępnij na innych stronach

Dobra pograłem i przypatrzyłem się tym varibles...

Tutaj jest screen zaznaczyłem na czerwono rzeczy które mają coś do czynienia z latarką.

vars.png

list - w kodzie / example którego użyłem ta lista miała trzymać/zapisywać id jakichkolwiek świateł.

sur - jeśli się nie mylę to jest surface (nie znam się na nich) na roomie 1 sur był 0 a w room 2 sur = 1.

i - zmienia się za każdym razem gdy latarka zostaje włączona (czyli włączamy = 1 potem wyłączamy i znowu włączamy i = 2 itd.)

 

Muczek,

zrobiłem to co napisałeś ale wyskoczył błąd że "global.list" i "sur" nie istnieje, więc dałem te dwie rzeczy do create event, no i latarka zaczęła chodzić ale był tylko taki wycięty sprite + problem nadal istniał ale nie był aż tak widoczny...

 

Więc nadal potrzebuje pomocy....

Odnośnik do komentarza
Udostępnij na innych stronach

Za niedługo zwariuję, postanowiłem się wrzucić edytowany exaple który dokładnie pokazuje mój problem...

https://gmclan.org/up7448_12_latarka.html

Więc poruszanie wsad, włączanie/wyłączanie latarki F i przechodzenie do następnego/poprzedniego pokoju Enter.

Żeby dostrzec problem trzeba włączyć latarkę w ciemnym roomie następnie wyjść z tego rooma (ENTER) a potem do niego wrócić (ENTER), wtedy powinniście dostrzec różnicę.

 

Sorry że double postuje ale gdybym edytował to nikomu by się ten temat na nowo nie wyświetlał...

Odnośnik do komentarza
Udostępnij na innych stronach

Siema,

odświeżam temat bo nadal problem nie został rozwiązany (i prawdopodobnie tylko to mnie powstrzymuje od wydania pierwszego dema testowego).

Mam nadzieje że ktoś zna rozwiązanie na mój problem, dzięki.

 

P.S. Sorka za tego potrójnego posta, nie zdziwił bym się gdybym dostał warna...

Odnośnik do komentarza
Udostępnij na innych stronach

Problemem jest ten kawałek kodu wywoływany wielkorotnie:

GML
sprite_set_alpha_from_sprite(sprite_light,sprite_light)

sprite_set_alpha_from_sprite(sprite_flashlight,sprite_flashlight)

Raz zmodyfikowany w ten sposób sprit już taki zostaje. Za każdym razem to się wykonuje gdy tworzy się object_lighting_engine, w efekcie po przejściu do rooma sprit jest ponownie modyfikowany i tak w kółko. Musisz zablokować wykonywanie tego np. tak:

 

stwórz nowy pusty room ( musi być pierwszy ) w jego creation code wpisz

GML
global.once = false;

room_goto_next();

 

a create object_lighting_engine zmodyfikuj w ten sposób

GML
if ( !global.once )

{

sprite_set_alpha_from_sprite(sprite_light,sprite_light)

sprite_set_alpha_from_sprite(sprite_flashlight,sprite_flashlight)

global.once = true;

}

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