Welcome, Guest. Please login or register.

Login with username, password and session length

 
Advanced search

1411428 Posts in 69363 Topics- by 58416 Members - Latest Member: JamesAGreen

April 19, 2024, 12:22:45 PM

Need hosting? Check out Digital Ocean
(more details in this thread)
TIGSource ForumsCommunityDevLogsSeraphim Games - Monomania
Pages: [1]
Print
Author Topic: Seraphim Games - Monomania  (Read 2215 times)
MilkCrook
Level 0
*


Graphics designer for Seraphim Games'-Monomania


View Profile
« on: January 21, 2016, 01:41:38 AM »

We are a game making studio called "Seraphim Games" Our studio contains of three graphic designers and two programmers.
We're making a school project (second grade in High School in Sweden) which we call 'Monomania'
Members of Seraphim Games are: MilkCrook(Lukas), Black Rose(Gabriel), Neelke(Adam), Flying Frogger(Love), Illius(Emil)

Monomania is a fast-paced bullet hell game which gameplay is based on the process of the in-game music.

Monomania is a bullet hell game where you survive the hell, not create it. The player does not shoot at all, because all you need to do is to survive until the song playing is finished.
The bullet hell will get more intense when the song gets near the chorus or other intenser parts of the song. At the nearer of the end of the song we're planning to have a boss, which has it's own special attacks and attack patterns.

« Last Edit: May 12, 2016, 11:43:23 PM by MilkCrook » Logged
Neelke
Level 0
*



View Profile
« Reply #1 on: January 28, 2016, 01:42:28 AM »

Constructing A Level:

In our game, creating levels will be fairly simple, but very time consuming. The gameplay is constructed with functions calling bullets to positions on the screen (such as a shockwave of bullets appearing at the centre of the gamescreen). You create a class with the level's name and work on it from there. The entire level is dependant on a timer which is set up as such:

Code:

public static void Update(GameTime gameTime)
{
      timeManager += (float)gameTime.ElapsedGameTime.TotalSeconds;

      if (eventSpeed <= timeManager)
      {
           NAME_OF_LEVEL();
           timeManager = 0.0f;
      }
}

// eventSpeed is the set time for which next event in the level will occur
// timeManager is the float value keeping track of the current time


So let's get started with creating a simple shockwave of bullets in the level. We'll grab a static function from our bullet class with the name CreateBulletShockwave. We'll place it in a switch case.

Code:

public static void NAME_OF_LEVEL()
{
     name_of_level++; // An integer moving through the timer
     eventSpeed = 1.0f; // Default time if none is wanted

     switch(name_of_level)
     {
          case 1:
              eventSpeed = 1.5f; // A bit of extra waiting time
              break;
          case 2:
              Bullet.CreateBulletShockwave(Bullet.BulletDefinition.BlueBullet_StandardBullet, 10, new Vector2(800, 450), new Vector2(2, 2), new Vector2(0, 0), 1.0f);
              break;
     }
}


So now ingame, we should be able to see a shockwave of bullets being created. The annoying part about this process is that in our game, the bullets will be shot after the music's rhythm. So let's say that a loud drum is heard in the song, we want to set the level to create a shockwave of bullets at that point in the song. You have to guess your way through the song until you think like you've timed it right, which takes a lot of time.

This was a short guide on how to create a level, by me Smiley.

Neelke (Adam)

Logged
Black Rose
Level 0
*


View Profile
« Reply #2 on: January 28, 2016, 02:28:43 AM »

Animating the snake boss

Today I've worked with my animation for one of our bosses, the snake boss. I began my work with a basic design of the boss that I got from one of our programmers. With thae basic design of the boss i began to cut it into parts and moving the parts around(we're only using it's head and a little bit of it's neck.) Good thing about having a basic drawing is that you can move parts around and/or draw parts that are missing or need a polishing. This is a faster way than making everything from scratch.
Moving parts can be beneficial or it can be really hard if you're not used to this method. It's also really usefull if you're decent-god with painting on missing pieces when moving around parts of your drawing. The boss haven't gotten a paint-job yet
 


Black Rose(Gabriel)
« Last Edit: April 21, 2016, 12:41:33 AM by Black Rose » Logged
MilkCrook
Level 0
*


Graphics designer for Seraphim Games'-Monomania


View Profile
« Reply #3 on: February 11, 2016, 03:04:26 AM »

Today, me and my fellow designer, has fixed glowy designs on our bullets. In photoshop we used the 'Layer Style' to add inner glow and color/pattern overlay to make our bullets to look fancier and more in the same art-style. I have also fixed a problem with our menu buttons not being the same size as the box they're supposed to sit in by just using the magic wand to check how big the space were.

Blue is a normal bullet that goes off screen


Purple is a bullet which will bounce once on the walls then go off screen.


Red is a temoporarily homing bullet


The yellow bullet will 'blow up' and create blue bullets


We ,sadly, interfered some minor trouble in our group's decision making and cooperation between programmers and designer but we cleanely and quickly cleared it up with the help of eachother and a nice friendly group meeting.  Grin

-MilkCrook
« Last Edit: February 11, 2016, 01:51:33 PM by MilkCrook » Logged
Illius
Level 0
*



View Profile
« Reply #4 on: February 11, 2016, 06:42:37 AM »

Hello all, Emil here to update on my contributions to the project so far.

As of the start of the project I've had the job of coding the players mechanics, the menu and general controls/interactions.

The menu, made by one of our graphic designers looks like this:
http://imgur.com/ltMN2yb
The three buttons present are external textures that we drew into the game and they highlight and enlarge when you select them.

I solved it code wise through an enum:that handle wich button was highlighted. A little like this:
Code:
        public enum MenuSelecter
        {
            play,
            options,
            exit
        }

        public static bool
            isButtonDown = false,
            isThumbStickDown = false;
The isButtonDown and isThumbstickDown bools are used to limit the amount of inputs so that the selector doesn't go everywhere with one tap. isButtonDown is for the DPAD and isThumbStickDown is for the left thumbstick. All on the xbox controller. So far so simple.   Smiley

The actual movement with the selection i solved through a series with if statements, each checking whats currently selected and moved it accordingly depending if you pressed upward or downward.
Code:
// Moves MenuSelecter downwards
            if (((InputManager.pad.DPad.Down == ButtonState.Pressed && isButtonDown == false)
                || (InputManager.pad.ThumbSticks.Left.Y <= -0.1f && isThumbStickDown == false))
                && StateManager.state == StateManager.States.mainMenu
                && menuSelecter == MenuSelecter.play)
            {
                menuSelecter = MenuSelecter.options;
                isButtonDown = true;
                isThumbStickDown = true;
            }

            if (((InputManager.pad.DPad.Down == ButtonState.Pressed && isButtonDown == false)
                || (InputManager.pad.ThumbSticks.Left.Y <= -0.1f && isThumbStickDown == false))
                && StateManager.state == StateManager.States.mainMenu
                && menuSelecter == MenuSelecter.options)
            {
                menuSelecter = MenuSelecter.exit;
                isButtonDown = true;
                isThumbStickDown = true;
            }

            if (((InputManager.pad.DPad.Down == ButtonState.Pressed && isButtonDown == false)
                || (InputManager.pad.ThumbSticks.Left.Y <= -0.1f && isThumbStickDown == false))
                && StateManager.state == StateManager.States.mainMenu
                && menuSelecter == MenuSelecter.exit)
            {
                menuSelecter = MenuSelecter.play;
                isButtonDown = true;
                isThumbStickDown = true;
            }
This one is a mess and i know for certain that theres a better way of doing this, but this gets the job done for now.

Anyways, I'll explain more about the player and other small interactions in another post.
Thank you for reading this, I'm out Wink
- Emil (aka Illius if you will)
Logged
Neelke
Level 0
*



View Profile
« Reply #5 on: February 18, 2016, 06:43:18 AM »

Each Bullet And Its Properties

So currently there are four different bullets existing in the game. Not too long ago they were implemented into the game and I will discuss thoroughly how exactly each bullet works and its accessibility.

Each bullet have their own so-called enum definition that defines the bullets characteristics. I will be speaking about the blue standard bullet, the purple bouncy bullet, the red homing bullet and the yellow detonating bullet.

Blue Bullet (Standard)
So this bullet is pretty explainatory in itself, there is nothing specific about it and works as a normal bullet would in any game.

Works With All Functions: Yes


Purple Bullet (Bouncing)
This bullet actually works pretty simular to the blue bullet, with the exception of the purple bullet can bounce once against a wall. When this occurs, the purple bullet will turn into a blue and making it normal.

Works With All Functions: Yes


Red Bullet (Homing)
This currently as I write this works very poorly. Only one function works with this bullet (which admittedly works pretty fine though) but using the bullet with any other function will cause the game to crash.

Works With All Functions: No

Yellow Bullet (Detonating)
This seems to be a normal bullet at first (apart from it being a different shape and yellow), but after a set time (controlled with a float value), the bullet will detonate into a shockwave of certain bullets. Currently it can only detonate into blue bullets but it might support other bullets in the future.

Works With All Functions: Currently unknown



Sorry for no images or code sources here but I felt it wasn't necessary. I will improve my updates in my next post.

Neelke (Adam)


Logged
Flying Frogger
TIGBaby
*


View Profile
« Reply #6 on: March 10, 2016, 03:00:02 AM »

Buttons for start menu and level selection

I've finished all the buttons that we need in the game for the moment.
The start, options and exit buttons are all for the main menu.
The main menu buttons have effects on them where they light up and move back and forth when you hold your cursor over the button.

"Bass knight", "supernova" and "fairydust" are the names of the 3 different levels we will have at the moment.

Logged
Black Rose
Level 0
*


View Profile
« Reply #7 on: March 17, 2016, 02:56:19 AM »

Snakeboss and bakgrund

This time i have been given the task of making the backgrund of one of our levels. It is going okay but i have no idea how to make the lava/flames look real. I don´t know right now how to make it any better than it already is but with some help from other graphic students I maybe can solve the problem.
Last time i worked on the snake boss i encounter a problem with coloring the different animation frames for the animations of the snakeboss. While coloring the first frame i came up whit a technique to make coloring take less time. By making the first frame fully done with color and effects I then can copy the effects and placing the same effects on the next frame. Placing the effects is step one, the second step is to color in the white with help of the magic tool. When I start coloring the effects will be drawn directly on and when I just have to adjusts the effects so they look okay. This technique saved me hours of work and effort and it looks great.     

Black Rose. Gabriel Nordin.
Logged
MilkCrook
Level 0
*


Graphics designer for Seraphim Games'-Monomania


View Profile
« Reply #8 on: April 05, 2016, 11:21:19 PM »

Last time I did finishing work on a background for one of the levels in our game by making it darker. In-game it was very light and distracting so all I did was to go in to photoshop and try different levels of  opacity to get it just right.
I've also finished our second player model and started on a third one.
We've gotten an assignment to do a big poster for our game which I've also finished making.

Player 2, (pink parts is there to make it transparent in-game)


Background for our first level of the game.


Big ass poster
« Last Edit: April 06, 2016, 11:50:36 PM by MilkCrook » Logged
Black Rose
Level 0
*


View Profile
« Reply #9 on: April 10, 2016, 07:02:50 AM »

Boss Hydra                                                  
In this part of the game project, I've been responsible for color and give texture to the hydra boss who should be in the game. The animation to the boss has been split up and deployed on a sprite sheet. This means that you can start coloring it all directly on the Spritesheet.
To colorize the Spritesheet direct is usually easier than going between the large amounts of layers you need when doing the coloring.
When I tried my usual working method I came across an unusual problem that I had to solve.
My method is always to divide the image into parts. In my case it was the scales, the face and the middle part of the neck and the bottom/belly that where the main parts. Finally I made claws and teeth because they required a little bit more special work (the problem was here!).  

With all the parts of the same kind on one Sprite sheet it was possible for me to use the "Magic wand" on all large image areas in the same layer. As an example the head, the stomach and the scales on the back can be done in this way. You complete the three parts individually and not all it the same time. This opens up for making special effects later on. I did all the hydra head pieces in one layer before going to the stomach on another layer and so on.  

One advantage of having all the parts in different layers is that I can change the color using an effect called "Color Overlay". With this effect, I can change the color of the pictures if my team is not satisfied with the result. I can recommend this way of working for those who have not fully decided what they want for color and want to experiment a little bit.          
After you have filled in with the base color you like on all of the images you can begin to apply effects so the pictures look more true to reality. I myself use a lot of effects because it is efficient and is less time-consuming than creating effects manually. It usually gives much better results and I have been given good response from the team and others who have seen the results.

There are two ways to complete the boss. There are pros and cons with both of them that I'm going to tell you about. First way to color is to use the "Magic wand" tool in Photoshop, which I told you about before. The tool makes it faster to fill in marked areas. In my case a problem arose when I was going to do it this way.

The problem that I encountered was that the basic design of the picture had color that are barely visible, some kind of "garbage colors". Garbage colors is color pieces that are nearly transparent, therefore one can miss to remove them before you paint. The garbage color areas may be shaped and positioned anywhere, in my case the where found all over on the pictures of the animations. One option is to erase the rubbish on all parts of the animation images individually, but it takes a lot of time just to do it on a single image. With 24 frames it would take too long time to do and because I discovered the problem to late I had to do it in a different way. Luckily this problem only occurred in two parts of the boss, the teeth´s and the cheek´s.
I could not solve this problem by using the Magic wand tool on the teeth´s but I found another way to color in a faster more efficient way.
I'll go through my way of solving the problem step by step now.  There are two ways of doing it and I'll tell you the pros and cons of them.

1.   The first way is to fill in the entire surface that you want painted on each of animation elements. This need not be done extremely carefully, you only have to get so that the paint fills the internal surface.  This is the easy part and depending on how good you are with your pen or how careful you are, only affects how much you need to fix later. I recommend you to do it as good as you can in stage.
2.   Now that you have filled out everything you will need to erase anything that is outside the outer lines. Works great if you have simple animations or images. It may take some time if you have a lot of details like claws and teeth´s which I had.
3.    After you have wiped out all traces of color around and you're ready to put on some effects (if you want).

The other way that I used to me is a variation of the first way but with a slight change.
1.   You begins with filling in a portion of the image in the animation so it looks ok, (no need to be so carefully done but it will help you if you're for the steps that follows).
2.   Now you should copy what you filled in. Paste this copy and "Merge layers" with the original layer. Now you have a layer with two color objects “blobs” sitting together.  
Do not put them on the layer of the sprite sheet with "Merge layer", put it under instead.
If you are not satisfied with the results of the two blobs of color on a layer you can add additional blobs of color on the same layer which gives you four blobs of color instead. This can be very helpful if you have a large number of images that you need to fill in (works only if sprite sheets images are perfectly placed). I used this method in order to gain time.
3. Now you have to merge all blobs of color and erase the debris and scrap color around the animation.
This way of working with fill in is faster than the method I described in the first paragraph, even though you still have to erase some parts.
I recommend this latter method because it requires fewer layers and is faster to accomplish. Large parts of the coloring of the Hydra is made in this way and I recommend to others who has the same problem to use this way of working, because it saves time and is not very labor intensive. The result for the viewer is about the same.
4. When all the little scraps and debris are gone it's time for effects and after that you are done.
I used the latter method on the teeth and cheeks where the problem was at its worst.
On the head and belly there were no graphical errors with basically invisible colors that ruin my coloring of it. I was pleased about that, because it made my job so much easier.
Tip: If you do a basic image to an animation you should not make any own hand-drawn special effects like fire or fluids (that are not part of the base image) because then it may transfer in to the animation even if they are not visible.
Good quality in the pictures and that they are done in the right way is a very good start in doing animations.

Here is a pictures to show what i mean by the wierd transparent colors (the white spots)


These pictures show the duplicating technique that i described earlier.(the second technique is in the text) 



Gabriel Nordin .Black Rose
« Last Edit: April 14, 2016, 01:30:17 AM by Black Rose » Logged
Neelke
Level 0
*



View Profile
« Reply #10 on: April 12, 2016, 01:40:03 AM »

Implementing the Hydra and using it ingame

I want to apologize for the extreme lack of progress information from us programmers. It appears that one of our programmers have been disregarding using this forum page correctly so it looks like I need to post some of what I’ve been up to instead.

So as my graphical drawer was explaining up above me, he was giving an instructional guide on how he would draw the hydra boss for the level “Bass Knight”. What I will be going through is how we use the hydra inside the game and implementing it.

So first of all, we have to start off by creating a class for the boss itself. As we have multiple bosses (currently a serpent, a hydra and a dragon), the class is setup with enums and a switch case:

Enums Setup (Boss Definition and Animations)

Code:
public enum BossDefinition
    {
        Serpent,
        Hydra_Head1,
        Hydra_Head2,
        Dragon,
    };

    public enum Animations
    {
        Idle,
        Attack,
        Idle_Extra1,
        Idle_Extra2,
        Idle_Extra3,
        Death,
        None,
        Last,
    }

Initial Boss Setup

Code:
public class Boss : Entity
    {

public static Boss
            boss1Instance,
            boss2Instance,
            boss3Instance,
            boss4Instance;

public Boss(BossDefinition bossDef, Animations animDef, Vector2 position, float rotation, Vector2 scale, Animations extraAnim1, Animations extraAnim2, Animations extraAnim3, bool flipHorizontally, int bossID)
        {
            this.bossDef = bossDef;
            this.animDef = animDef;
            this.position = position;
            this.rotation = rotation;
            this.scale = scale;
            this.flipHorizontally = flipHorizontally;
            this.bossID = bossID;
            texturePriority = 0.0f;

            switch (bossDef)
            {
                case BossDefinition.Serpent:

                    break;
                case BossDefinition.Hydra_Head1:
                    texture = TextureSet.Hydra1;
                    srcRect = new Rectangle(1, 1, 995, 539);
                    origin = new Vector2(497.5f, 269.5f);
                    circle = new Circle(new Vector2(position.X + 388, position.Y + 180), 180);
                    break;
                case BossDefinition.Hydra_Head2:
                    texture = TextureSet.Hydra2;
                    break;
                case BossDefinition.Dragon:

                    break;
            }
        }

Want to notify at this point the serpent and the dragon do have some animations, but they have missing animations + not colored so those switch cases are currently left empty.

So with the start values of the Boss class setup accordingly and properly, let's setup the Update and Draw methods. Let's begin with the Draw method, where we need to setup what all the different bosses could possibly need. I reckon we'll need a texture, position, sourceRectangle, rotation, originPoint, scale, spriteEffect and layerDepth values, so let's setup that in the Draw method:

Draw Method

Code:
public override void Draw(SpriteBatch spriteBatch)
        {
// This value is affected in the Boss inputs (scroll up to find a Boolean named flipHorizontally)            
SpriteEffects _spriteEffect = flipHorizontally == true ? SpriteEffects.FlipHorizontally : SpriteEffects.None;

            spriteBatch.Draw(
                GraphicsManager.textures[(int)texture],
                new Vector2(position.X, position.Y),
                sourceRectangle: srcRect,
                rotation: this.rotation,
                origin: this.origin,
                scale: this.scale,
                effects: _spriteEffect,
                layerDepth: this.texturePriority);
        }

Now before we continue with the Update method, we need to create two custom methods. Their task will be to initiate a certain boss animation and update the animations continueously. We'll name those two functions StartAnimation and PlayAnimation:

StartAnimation and PlayAnimation function

Code:
public void StartAnimation(int bossID, BossDefinition bossDef, Animations animDef)
        {
            maxDelay = 0.08f; // Delay of when switching frame
            definitionToEndOfFrame = 4; // For when spriteSheet jumps down the Y-direction (controlled with Modulus)
            reversed = false; // Certain animations reuse frames already used in one animation
            maxFrame = 6; // Helps defining when reversed boolean should change to true
            this.animDef = animDef; // Which animation to play (such as Animations.Attack)
        }

Currently the only animation available in the game has these sourceRectangle settings, so they currently act as default. StartAnimation is the one changing which animation a certain boss should play.

Code:
public void PlayAnimation(int bossID, BossDefinition bossDef, Animations animDef, GameTime gameTime)
        {
            timer += (float)gameTime.ElapsedGameTime.TotalSeconds;

            switch (animDef)
            {
                case Animations.Idle:

                    switch(bossDef)
                    {
                        case BossDefinition.Serpent:

                            break;
                        case BossDefinition.Hydra_Head1:

                            if(timer >= maxDelay)
                            {
                                if (reversed)
                                {
                                    currentFrame--;

                                    if(currentFrame == 0)
                                    {
                                        maxDelay = 0.75f;
                                    }
                                    else if(currentFrame < 0)
                                    {
                                        currentFrame = 1;
                                        maxDelay = 0.13f;
                                        reversed = false;
                                    }
                                }
                                else
                                {
                                    currentFrame++;

                                    if(currentFrame == 6)
                                    {
                                        maxDelay = 1.05f;
                                    }
                                    else if(currentFrame > 6)
                                    {
                                        currentFrame = 5;
                                        maxDelay = 0.13f;
                                        reversed = true;
                                    }
                                }

                                timer = 0;
                            }

                            break;
                        case BossDefinition.Hydra_Head2:

                            break;
                        case BossDefinition.Dragon:

                            break;
                    }

There is much more in this function, but shorten down to simply one definition of an animation. PlayAnimation updates the spriteSheets and changes frames depending on what enum Animations is currently defined as.

With these two functions in hand, we can finally create the Update method:

Update Method

Code:
public override void Update(GameTime gameTime)
        {
            timer += (float)gameTime.ElapsedGameTime.TotalSeconds;
            
            // bossID - defines which boss is being changed (what ID is defined when spawning a boss later on)
            // bossDef - which boss this specific boss is
            // animDef - which animation this boss should play
            // gameTime - mainly a helper so we can use PlayAnimation the way we do
            PlayAnimation(bossID, bossDef, animDef, gameTime);
            
            base.Update(gameTime);
        }






So now we can control the hydras animations completely with StartAnimation. The only thing left to do is create instances of the bosses and have the ability to spawn the bosses in. So let's create yet another function that will create a boss in the level. To be specific, let's name it SpawnBoss.

Spawning Bosses Method

Code:
public static void SpawnBoss(BossDefinition bossDef, Animations animDef, Vector2 position, float rotation, Vector2 scale, Animations extraAnim1, Animations extraAnim2, Animations extraAnim3, bool flipHorizontally, int bossID)
        {
            Boss newBoss = new Boss(BossDefinition.Hydra_Head1, animDef, position, rotation, scale, extraAnim1, extraAnim2, extraAnim3, flipHorizontally, bossID);
            newBoss.isRemoved = false;
            newBoss.StartAnimation(bossID, bossDef, animDef);

            if (bossDef == BossDefinition.Hydra_Head1)
                boss1Instance = newBoss;
            else if (bossDef == BossDefinition.Hydra_Head2)
                boss2Instance = newBoss;
            else if (bossDef == BossDefinition.Dragon)
                boss3Instance = newBoss;
            else if (bossDef == BossDefinition.Serpent)
                boss4Instance = newBoss;

            bossDef = BossDefinition.Hydra_Head1;

            Data.tempEntities.Add(newBoss);
        }

The way this code is written right now, this will only work with the hydra head and no other boss. Main reason being like I've mentioned previously, the hydra is the only boss we have currently in game. With this function done, all we need to do now is program this function into a level with the proper settings and we should be good to go.


Spawning a Hydra ingame

As it is my boss idea, my idea with this boss is for them to stick to the corners of the screen and charge into the center of the level and attack the player along with the music's beat. This is for example where flipHorizontally comes into use as we have the hydra facing to the right in our spriteSheet. It needs to be flipped to be used on the other side. If you have watched one of my previous posts on this page, I have gone through how to design a level, so you simply place this inside a case event and watch the magic happen.

Code:
Boss.SpawnBoss(BossDefinition.Hydra_Head1, Animations.Idle, new Vector2(100, 50), (float)(1.75f * Math.PI) / 12, new Vector2(1.0f, 1.0f), Animations.None, Animations.None, Animations.None, false, 1);
Boss.SpawnBoss(BossDefinition.Hydra_Head2, Animations.Idle, new Vector2(1500, 50), (float)-(1.75f * Math.PI) / 12, new Vector2(1.0f, 1.0f), Animations.None, Animations.None, Animations.None, true, 2);



And there we go, two hydras in a level breathing and inspecting the player:




Conclusion

Like I said in the beginning of my post, I apologize for being inactive around programming updates. Hope this extra-long and detailed post will suffice for that  Smiley

Neelke
Logged
MilkCrook
Level 0
*


Graphics designer for Seraphim Games'-Monomania


View Profile
« Reply #11 on: April 17, 2016, 11:41:05 AM »

This weeks monday (11 April) we had a 9:th grade class from another school to come and visit us, and to try out our games and give their opinions about it, We got some quit awesome criticism and everyone enjoyed playing it. Most things people said after they'd play it was that we should have it so the player could shoot, but they seriously missed the point of the game, and our big-ass poster we had.   Wink  People really liked the rytm of the game and that the bullets were in-sync with the in-game music.
They had some opinions on making the game easier. We've seen that the second level (Bass Knight) were kinda difficult until you've tried like 5-10 times, we also saw that nobody managed to complete the first 15 seconds of the third song (Fairydust) because it's really fast and very heavy on bullets.
Some 'complained' over that the yellow bullet were alot different from the other ones, so we changed it to this:


Some had issues reading our menu buttons, so we've had them changed to this to be able to read them easier:




We found a quite big problem a few days before play-testing and that was that we had no in-game "tutorial" or any way to know the controls, so we've made a temporary poster that looked like this:
Logged
Illius
Level 0
*



View Profile
« Reply #12 on: April 21, 2016, 05:22:03 AM »

Hello again!
Emil here. Thought that it was time for me to display what I've been working on this past month.

We desperately needed some core logic into our game so i started working on a pause menu to quickly navigate between the menus and levels.

The actual code is quite simple. I have a bool called isPaused that i toggle when you press start in game. When true, all entities stop updating with their current variables unchanged. This makes it super simple to resume the game.



While paused, we have a small pause menu where you can choose to either resume/restart the level or quit to the titlescreen. This menu always has two buttons present that I'm gonna call primaryButton and secondaryButton.
The primaryButton is either displaying "Resume" or "Restart" depending if you're alive or dead when pausing. The secondary button is always displaying "Quit to title". Once we have options implemented we might put that there too but it's still up for discussion.
Also, when you die the game will automatically pause allowing the player to restart immediately or quit to the main menu.



Here's the code for controlling the selecter in the pause menu:

Code:
public enum PauseSelecter
        {
            resume,
            restart,
            quitToTitle,
            none,
        }

        public static bool
            isPaused = false;

        public static PauseSelecter pauseSelecter;

        public static void Initialize()
        {
            pauseSelecter = PauseSelecter.none;
        }

        public static void Update(GameTime gameTime)
        {
            if (MainManager.isDead
                && isPaused)
            {
                if (pauseSelecter != PauseSelecter.quitToTitle)
                {
                    pauseSelecter = PauseSelecter.restart;
                }
            }

            else if (!MainManager.isDead
                && isPaused)
            {
                if (pauseSelecter != PauseSelecter.quitToTitle)
                {
                    pauseSelecter = PauseSelecter.resume;
                }
            }
            Console.WriteLine(pauseSelecter);
            // Moves pauseSelecter down/up
            if ((InputManager.pad.DPad.Down == ButtonState.Pressed
                || InputManager.pad.DPad.Up == ButtonState.Pressed
                || InputManager.pad.ThumbSticks.Left.Y <= -0.1f
                || InputManager.pad.ThumbSticks.Left.Y >= 0.1f
                || InputManager.keys.IsKeyDown(Keys.W)
                || InputManager.keys.IsKeyDown(Keys.S)
                || InputManager.keys.IsKeyDown(Keys.Up)
                || InputManager.keys.IsKeyDown(Keys.Down))
                && StateManager.state == StateManager.States.play
                && isPaused
                && Menu.isButtonDown == false
                &&  Menu.isThumbStickDown == false)
            {
                switch (pauseSelecter)
                {
                    case PauseSelecter.restart:
                        pauseSelecter = PauseSelecter.quitToTitle;
                        break;

                    case PauseSelecter.resume:
                        pauseSelecter = PauseSelecter.quitToTitle;
                        break;

                    case PauseSelecter.quitToTitle:
                        if (MainManager.isDead)
                        {
                            pauseSelecter = PauseSelecter.restart;
                        }
                        else
                        {
                            pauseSelecter = PauseSelecter.resume;
                        }
                        break;
                }
                Menu.isButtonDown = true;
                Menu.isThumbStickDown = true;
            }
        }

        public static void Draw(SpriteBatch spriteBatch)
        {
           
            if (MainManager.isDead
                && isPaused)
            {
                // Draws the play button and checks if selected
                // Draw restart button instead of resume when pausing while dead.
                if (pauseSelecter == PauseSelecter.restart)
                    spriteBatch.Draw(GraphicsManager.textures[25], new Vector2(800, 400), color: Color.Aqua, scale: new Vector2(1.2f, 1.2f), origin: new Vector2(179.5f, 41.5f));
                else
                    spriteBatch.Draw(GraphicsManager.textures[25], new Vector2(800, 400), color: Color.White, scale: new Vector2(1.0f, 1.0f), origin: new Vector2(179.5f, 41.5f));

                // Draws the "you died" text.
                spriteBatch.Draw(GraphicsManager.textures[26], new Vector2(800, 200), color: Color.White, scale: new Vector2(1.0f, 1.0f), origin: new Vector2(115, 20));
            }
            else if (!MainManager.isDead
                && isPaused)
            {
                // Draws the play button and checks if selected
                // Draw resume button instead of restart when pausing while alive.
                if (pauseSelecter == PauseSelecter.resume)
                    spriteBatch.Draw(GraphicsManager.textures[23], new Vector2(800, 400), color: Color.Aqua, scale: new Vector2(1.2f, 1.2f), origin: new Vector2(179.5f, 41.5f));
                else
                    spriteBatch.Draw(GraphicsManager.textures[23], new Vector2(800, 400), color: Color.White, scale: new Vector2(1.0f, 1.0f), origin: new Vector2(179.5f, 41.5f));
            }

            // Draws the quitToTitle button and checks if selected.
            if (isPaused)
            {
                if (pauseSelecter == PauseSelecter.quitToTitle)
                    spriteBatch.Draw(GraphicsManager.textures[24], new Vector2(800, 600), color: Color.Aqua, scale: new Vector2(1.2f, 1.2f), origin: new Vector2(179.5f, 41.5f));
                else
                    spriteBatch.Draw(GraphicsManager.textures[24], new Vector2(800, 600), color: Color.White, scale: new Vector2(1.0f, 1.0f), origin: new Vector2(179.5f, 41.5f));
            }
        }

The code that actually pauses the game is sprinkled throughout the project. For example, the input that detects the player pressing "start" on the xbox controller sets isPaused to True. The following If() statement will then surround all things that should update when the game is running:
Code:
if (!isPaused)

That is all around this subject that I have to say right now. Thank you for listening.  Wink

/Emil
Logged
Black Rose
Level 0
*


View Profile
« Reply #13 on: April 24, 2016, 12:33:02 AM »

Tips and tricks about special effects in Photoshop
In this text I will tell you about my tips and tricks in Photoshop’s layer effects menu. I will tell you what they do and how I use them.  
There are many effects to choose from. Many of them can be good for work like mine and some aren’t. I don´t use all of them when I do coloring for textures to animations. Some of the effects can cancel  other´s  and some effect feels like they are just useless.          
Outer glow
This effect can be used I some cases if you want a glowing effect from a lantern or a sun. This effect is good if you are going to do static pictures for the game, like the start screen. This effect is not fit for animations because everything around the tile gets affected by the effect. The animations alter frame by frame so the glow effect may be distorted by the movement. This is a problem when you put tiles with glow effect in the game. The result of this is that the effect is ruined. Making glowing effects is a job for the programs so there are other ways to have glowing blocks.
In our game we don’t have any outer glowing effects but we do have Inner glow. Whit this effect you can make your tiles look like they are glowing on the inside.
Inner glow
Inner glow is an effect that makes the inner lining of your object glow. The glowing effect can be alternated so it covers the entire inner area of the object. You can alter the opacity of the effect and make the glowing fade out by altering some of the sliders in the menu, “opacity” and “size”. Those two are the most important ones for a good glow effect, the other slides can you use if you want to experiment.  I use this effect because it has proven to be useful.
Texture
This one puts a chosen texture and pastes it on the color you have painted you object whit. So for an example I make a red ball and starts use this effect, it will put a selected texture on the red ball. You can make your own texture and paste it on to an object if you want to. I don’t use this effect so often for the reason that it is only useful if you don’t have any design on the designated object, and it is a bit complicated to put in your own texture in the system but that’s only my experience and opinion.

Bevel &Emboss
This tool is only meant for one purpose and that is to make the object look like 3D.  By adjusting the sliders you can make the object look like it has got a 3D edge. The effect is based on shadows and glow effects which are combined in to a single effect. You usually do this manually by drawing shadows but now you can have it done by just this one effect. I used this effect to add some depth to the snake boss. I could have drawn shadows to give him the depth but what would have taken much longer time.  I chose the Bevel&Emboss effect in my work because it gives good results and it doesn’t take long time to get the work done.


Color overlay
This effect is something that I recommend not to use. This effect is useless in combination whit any other effects. I can’t get it to work, and I have tried a lot, so I try to avoid using it in most cases. Mabey in the future I can find a way to use it.
Inner shadow
This is my favorite layer effect. This effect is a timesaver and also give great results. This effect can be used in the same way as the inner glow effect and the only difference is that instead of making everything glow it makes a shadow. By adjusting the slider “size” the shadow from the outer lining will be covering everything inwards in the objects. Whit some experimenting with the opacity and size you can get some great results.
This effect can be a grate tool for some works, I have used it a fair amount of times in the game project and in some of my other works but it lacks in some places. This effect can give good shadows but the shadow doesn’t always make some objects look real.
For an example, I am going to make some clothes to a character in a game. The material bends and stretch and that a problem for the shadow effect. The shadows don’t look real and sometimes the shadow ruins the illusion of 3d on the clothes. In cases like this it’s better to make the shadows by drawing manually, it is much more precise.  This lack of function is the reason why I don’t always use this effect in the tiles and other works. For beginners I recommend to do the shadow works manually and by this get the right experience which is good to have.
 I do have on more thing to tell about the shadow effect that I have stumbled upon. A new way to make all shadows aligned whit each other for all the frames of snake boss.
1.  Place all the frames on a sprite sheet.
2. Color them and give them the effects that you want (if you want of course)
3. Have all the layers whit color combined to a single layer.
4. Now when we put on the shadow effect all the frames will have the same effect. Now you can go to the wheel in the same menu as before and adjust the light so the shadows is following the same light source. The result is that all the frames shadows match whit reality, making it more realistic.  

Conclusion: From my experience of working whit these effects I can say that the most useful ones are Inner shadow and Bevel&Emboss. These effects are the easiest and most time saving ones and they give good results. That’s also why I like to experiment with them in my other works.
There are many other effects in the layer effect menu what I haven’t told you about but that’s for a other time.
Thanks for reading.                                
Black Rose. Gabriel Nordin    
« Last Edit: April 24, 2016, 10:15:16 PM by Black Rose » Logged
Pages: [1]
Print
Jump to:  

Theme orange-lt created by panic