Graphics Too Much Blood?

Gamerev147

Member
I have dynamic blood in my top down shooter.
This blood is drawn to a surface to insure that the blood looks and feels the best when it is created.
The blood being drawn to a surface also helps boost performance when there is a ton of blood.

So my question is: In your opinion, would it get annoying having the screen covered in blood when you kill a wave of enemies? Is there such thing as "too much blood?"

[EDIT]: Here is a screenshot of just a little bit of blood:

Please give your honest opinion. Thanks! :):banana:
 
Last edited:

Yal

🐧 *penguin noises*
GMC Elder
In your opinion, would it get annoying having the screen covered in blood when you kill a wave of enemies?
Only if it obscures stuff (visual hints in the background, etc). It can also be handy to follow blood splatters around to see where you've been (if it's hard to navigate levels to begin with) and with too much blood you can lose that because EVERYTHING is bloody.

Also, it might be worth the effort to have different splatters for every enemy type to keep it from becoming samey - The Binding Of Isaac: Rebirth does a pretty good job with this with different debris for every killable/destructible entity, like pebbles when you bomb rocks, bones for some enemies, various colors of blood for other enemies, pieces of meat, eyeballs, etc.
 

Gamerev147

Member
Only if it obscures stuff (visual hints in the background, etc). It can also be handy to follow blood splatters around to see where you've been (if it's hard to navigate levels to begin with) and with too much blood you can lose that because EVERYTHING is bloody.

Also, it might be worth the effort to have different splatters for every enemy type to keep it from becoming samey - The Binding Of Isaac: Rebirth does a pretty good job with this with different debris for every killable/destructible entity, like pebbles when you bomb rocks, bones for some enemies, various colors of blood for other enemies, pieces of meat, eyeballs, etc.
Well it's mainly a free for all type game with other game modes such as plant the bomb, capture the flag, base point capture, and a work in progress, king of the hill game mode.
So there is really no story to the game. The backgrounds are very basic.

So I played the game for a while and tried to make as much blood as possible. This screenshot is about 10 - 15 minutes of playing, and this is how much blood there is:

So what do you think? Should I decrease the amount of blood being created, or make the blood fade away after a while?
 
S

Storyteller

Guest
make it fade away or turn brown after a time, like dried blood
 
If you want to make it fade, I wouldn't use a surface. Just find a nice way of using objects for it and have the objects fade themselves to 0 alpha after a certain amount of time and then destroy themselves.
 

Yal

🐧 *penguin noises*
GMC Elder
I would personally use tiles instead (in GMS1) or one of those asset layers you can place sprites in directly (in GMS2), surfaces use a lot of memory so you can't use them for really big rooms, but placing down tiles/assets can be done no matter the room size with no problems.
 

Gamerev147

Member
If you want to make it fade, I wouldn't use a surface. Just find a nice way of using objects for it and have the objects fade themselves to 0 alpha after a certain amount of time and then destroy themselves.
But the thing is, the blood object is being destroyed relatively quickly on the surface (to keep the blood the shape it is and the size it is). I've tried making objects, but the blood disappears quickly.
Here is the code for my blood. Just make a surface and test it yourself, you'll see what I mean.

obj_Blood - Create Event
Code:
///Setup Variables for Blood
image_xscale = random_range(0.3, 1.3);
image_yscale = image_xscale;
image_index = choose(0, 1, 2);

moveDir = random(360);
moveSpd = random_range(24, 48);
fric = random_range(moveSpd / 8, moveSpd / 2);

sizeChange = random_range(image_xscale / 10, image_xscale / 3);
Step Event-
Code:
///Fade Blood
image_xscale -= sizeChange;
image_yscale = image_xscale;

if (moveSpd > 0) {
    image_alpha -= random_range(0.05, 0.1);
}

moveSpd = choose(moveSpd, 0, fric);

if (instance_exists(obj_BloodController)) {
    surface_set_target(obj_BloodController.surf);
    draw_sprite_ext(spr_Bloodsplat, image_index, x, y, image_xscale, image_yscale, image_angle, c_white, image_alpha);
    surface_reset_target(); 
}

if (image_xscale <= 0) {

    instance_destroy(); //This destroys the blood, but keeps it on the surface

}
End Step -
Code:
x += lengthdir_x(moveSpd, moveDir);
y += lengthdir_y(moveSpd, moveDir);
If anyone has any ideas on how to make this only using an object, please! Leave a comment!
 
Yal is right in that using tiles is way more efficient than objects (or surfaces). Other than that, I'm not entirely sure what you mean? If you want the blood to stay for like 30 seconds or something and then fade away, you can just increase the amount of time before it scales away (as I see you're using the image_xscale as a test for when to destroy it). If you want it to stick around forever, then either continue using your surface or use Yal's more efficient tile idea.
 
Last edited:

Yal

🐧 *penguin noises*
GMC Elder
I've used the tile idea in at least 3 games, by the way, so I can confirm it works satisfactory both visually and performance-wise. The biggest issue is how tiles can't be rotated, but you can solve that by just having multiple different splatter patterns and pick random ones. It also looks nicer if the splatter is completely uniform in color (not necessarily in alpha) so it easily blends together without visible edges no matter how many you stack on each other.
 

Gamerev147

Member
No, the blood needs to be destroyed after image_xscale is 0. It's not a test. That's what makes the blood look the way it does.
The surface keeps sprites on it even when the object possessing the sprite is destroyed.

I've tried making an object for the blood that fades not using a surface. But the blood isn't created. It splashes for a quick second then is destroyed.

If i remove image_xscale <= 0 { instance_destroy(); } the size of the blood continues to increase in size and never stops.

I really want dynamic blood in my game and I have no experience in using tiles other than in the room editor. So objects would be best. But I can't make one with this code...
 
T

T. Brugel

Guest
This is the game Im currently working on, and it has a LOT of blood :p
I make the blood fade away after some time.
Just set an alarm in the create event of the blood objects, and when the alarm hits 0 it fades away quickly.
 

Yal

🐧 *penguin noises*
GMC Elder
How about having two blood objects? One for when it first splashes down and is animated, another one that stays there for a while and then fades out using image_alpha? You just need to transfer sprite_index, image_index, image_xscale, image_yscale, image_angle and image_alpha from the splash blood to the remain blood for them to look identical, and that's just a few lines of code.
 

sp202

Member
To darken the blood, continually draw the surface onto itself with a darker colour and lower opacity.
 

sp202

Member
It shouldn't, you're not creating extra surfaces, just drawing onto a surface. Though you might need a single additional surface depending on your version of GM as past GM8 I believe you can't draw a surface to itself directly.
 
Top