You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

244 lines
6.6 KiB

2 years ago
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using System.Collections.Generic;
using System;
namespace Asteroids;
public class Player
{
public Texture2D Texture;
public Texture2D BTexture;
public List<bullet> Bullets;
public List<powerup> Ups;
public Rectangle Rect;
public Vector2 force;
public Vector2 pos;
public int wait;
public bool waitb;
public Rectangle[] Boxes;
public float boost;
public float maxboost;
public bool boosting;
public bool regboost;
public int Health;
public int maxHP;
public Player(Texture2D Texture, Texture2D BTexture)
{
this.Texture = Texture;
this.BTexture = BTexture;
Rect = new Rectangle(0,0,Texture.Width/2, Texture.Height/2);
pos = new Vector2(vars.PlayArea.X + vars.PlayArea.Width/2 - Rect.Width/2, vars.PlayArea.Y + vars.PlayArea.Height - 100);
Rect = new Rectangle((int)pos.X, (int)pos.Y, Rect.Width, Rect.Height);
Bullets = new List<bullet>();
Ups = new List<powerup>();
Health = 100;
maxHP = Health;
maxboost = 10;
boost = maxboost/2;
}
public void input(GameTime gameTime)
{
KeyboardState KEY = Keyboard.GetState();
if(KEY.IsKeyDown(Keys.W))
{
force.Y -= 0.1f;
}
if(KEY.IsKeyDown(Keys.S))
{
force.Y += 0.1f;
}
if(KEY.IsKeyDown(Keys.A))
{
force.X -= 0.1f;
}
if(KEY.IsKeyDown(Keys.D))
{
force.X += 0.1f;
}
if(KEY.IsKeyDown(Keys.LeftShift))
{
if(!regboost)
{
boosting = true;
}
}
else
{
boosting = false;
}
if(KEY.IsKeyDown(Keys.Space))
{
wait--;
if(wait <= 0)
{
wait = 10;
bulletspawner();
}
}
else
{
wait = 0;
}
if(KEY.IsKeyDown(Keys.Escape) && waitb)
{
vars.Scens.Scene = 2;
vars.Scens.wait = false;
}
if(KEY.IsKeyUp(Keys.Escape)){waitb = true;}
//Checking boost numbs
if(!boosting)
{
boost += (float)gameTime.ElapsedGameTime.TotalSeconds;
}
if(boost <= 0)
{
regboost = true;
boosting = false;
boost = 0;
}
if(boost >= maxboost)
{
regboost = false;
boost = maxboost;
}
//exiting if no force applied
if(force == Vector2.Zero)
{
return;
}
force.X = MathHelper.Clamp(force.X, -1, 1);
force.Y = MathHelper.Clamp(force.Y, -1, 1);
if(force.Y > 0 && KEY.IsKeyUp(Keys.S)){force.Y -= 0.1f;}
if(force.Y < 0 && KEY.IsKeyUp(Keys.W)){force.Y += 0.1f;}
if(force.X > 0 && KEY.IsKeyUp(Keys.D)){force.X -= 0.1f;}
if(force.X < 0 && KEY.IsKeyUp(Keys.A)){force.X += 0.1f;}
force.Y = MathF.Round(force.Y, 1);
force.X = MathF.Round(force.X, 1);
if(boosting)
{
pos += force * 5;
boost -= (float)gameTime.ElapsedGameTime.TotalSeconds *3;
}
else{pos += force * 3;}
}
public void Draw(SpriteBatch _spriteBatch, GameTime gameTime)
{
foreach(var item in Ups)
{
item.Update(gameTime);
}
foreach(var item in Bullets)
{
item.Draw(_spriteBatch);
}
Rect = new Rectangle((int)pos.X, (int)pos.Y, Rect.Width, Rect.Height);
_spriteBatch.Draw(Texture, Rect, null, Color.White);
}
public void Collision(Rectangle[] Boxes)
{
this.Boxes = Boxes;
if(!Boxes[0].Contains(Rect))
{
if(Rect.Left < Boxes[0].Left)
{
pos.X += Boxes[0].Left - Rect.Left;
}
if(Rect.Right > Boxes[0].Right)
{
pos.X -= Rect.Right - Boxes[0].Right;
}
if(Rect.Top < Boxes[0].Top)
{
pos.Y += Boxes[0].Top - Rect.Top;
}
if(Rect.Bottom > Boxes[0].Bottom)
{
pos.Y -= Rect.Bottom - Boxes[0].Bottom;
}
}
Bullets.RemoveAll(pred);
Ups.RemoveAll(powPred);
}
public bool pred(bullet b)
{
return b.Collision(Boxes);
}
public bool powPred(powerup P)
{
if(P.TimeLeft <= 0)
{
return true;
}
return false;
}
public void bulletspawner()
{
Bullets.Add(new bullet(BTexture, new Vector2(pos.X + Rect.Width/2 - BTexture.Width/2, pos.Y), 10f, 0f, Color.White));
foreach(var item in Ups)
{
item.bullets(Bullets, this);
}
}
}
public class bullet
{
public Texture2D Texture;
public float Speed;
public Vector2 pos;
public Rectangle Rect;
public float Rot;
public Color C;
public bullet(Texture2D Texture, Vector2 pos, float Speed, float rot, Color C)
{
this.Texture = Texture;
this.pos = pos;
this.Speed = Speed;
this.Rot = rot;
this.C = C;
Rect = new Rectangle((int)pos.X, (int)pos.Y, Texture.Width, Texture.Height);
AudioEn.playsound(2);
}
public void Draw(SpriteBatch _spriteBatch)
{
Vector2 e = new Vector2(MathF.Cos(Rot - 1.5707963268f) * Speed, MathF.Sin(Rot - 1.5707963268f) * Speed);
pos += e;
Rect = new Rectangle((int)pos.X, (int)pos.Y, Texture.Width, Texture.Height);
_spriteBatch.Draw(Texture, Rect, null, C, Rot, Vector2.Zero, SpriteEffects.None, 0f);
}
public bool Collision(Rectangle[] Boxes)
{
if(!Boxes[0].Contains(Rect))
{
return true;
}
return false;
}
}
public class powerup
{
public float TimeLeft;
public float[] rots;
public powerup()
{
Random r = new Random();
TimeLeft = r.Next(5, 20);
rots = new float[r.Next(1, 2)];
for(int i = 0; i < rots.Length;i++)
{
rots[i] = r.Next(-45, 45);
}
}
public void Update(GameTime gameTime)
{
TimeLeft -= (float)gameTime.ElapsedGameTime.TotalSeconds;
}
public void bullets(List<bullet> Bullets, Player PL)
{
foreach(var item in rots)
{
Bullets.Add(new bullet(PL.BTexture, new Vector2(PL.pos.X + PL.Rect.Width/2 - PL.BTexture.Width/2, PL.pos.Y), 10f, MathHelper.ToRadians(item), Color.BlanchedAlmond));
}
}
}