# Projectiles

Subscribe to Tech With Tim!

In this tutorial we are going to be implementing projectiles.

### Projectile Class

The first thing we are going to do is create a projectile class.

```class projectile(object):
self.x = x
self.y = y
self.color = color
self.facing = facing
self.vel = 8 * facing

def draw(self,win):
```

### Modifying the Player Class

Because we are going to be shooting bullets left or right we need to ensure our character is always facing left or right. This required modifying the player.draw method and adding another attribute of standing to our player.

```class player(object):
def __init__(self,x,y,width,height):
self.x = x
self.y = y
self.width = width
self.height = height
self.vel = 5
self.isJump = False
self.left = False
self.right = False
self.walkCount = 0
self.jumpCount = 10
self.standing = True

def draw(self, win):
if self.walkCount + 1 >= 27:
self.walkCount = 0

if not(self.standing):
if self.left:
win.blit(walkLeft[self.walkCount//3], (self.x,self.y))
self.walkCount += 1
elif self.right:
win.blit(walkRight[self.walkCount//3], (self.x,self.y))
self.walkCount +=1
else:
if self.right:
win.blit(walkRight[0], (self.x, self.y))
else:
win.blit(walkLeft[0], (self.x, self.y))
```

### Modifying the Main Loop

We also need to modify our main loop to ensure our character is always facing left or right.

```man = player(200, 410, 64,64)
run = True
while run:
clock.tick(27)

for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False

keys = pygame.key.get_pressed()

if keys[pygame.K_LEFT] and man.x > man.vel:
man.x -= man.vel
man.left = True
man.right = False
man.standing = False # NEW
elif keys[pygame.K_RIGHT] and man.x < 500 - man.width - man.vel:
man.x += man.vel
man.right = True
man.left = False
man.standing = False # NEW
else:
main.standing = True # NEW (removed two lines)
man.walkCount = 0

if not(man.isJump):
if keys[pygame.K_UP]:
man.isJump = True
man.right = False
man.left = False
man.walkCount = 0
else:
if man.jumpCount >= -10:
neg = 1
if man.jumpCount < 0:
neg = -1
man.y -= (man.jumpCount ** 2) * 0.5 * neg
man.jumpCount -= 1
else:
man.isJump = False
man.jumpCount = 10

redrawGameWindow()
```

### Setting up The Projectiles

The first step is to create a list which will store all of our bullet objects.

```bullets = [] # This goes right above the while loop
```

Now we are going to add a for loop into our main loop that will move our bullets and remove them if they have left the screen.

```# Goes inside the while loop

for bullet in bullets:
if bullet.x < 500 and bullet.x > 0:
bullet.x += bullet.vel  # Moves the bullet by its vel
else:
bullets.pop(bullets.index(bullet))  # This will remove the bullet if it is off the screen
```

### Shooting the Bullet

We are first going to change our jump key to be the up arrow (just change pygame.K_SPACE to pygame.K_UP). Then we are going to create a new if statement that will check if the space bar is clicked. If it is we will create a new bullet, give it a velocity and start moving it.

```# Goes inside the while loop, under keys = ...
if keys[pygame.K_SPACE]:
if man.left:
facing = -1
else:
facing = 1

if len(bullets) < 5:  # This will make sure we cannot exceed 5 bullets on the screen at once
bullets.append(projectile(round(man.x+man.width//2), round(man.y + man.height//2), 6, (0,0,0), facing))
# This will create a bullet starting at the middle of the character
```

And the last thing to do is to draw our bullets inside redrawGameWindow().

```def redrawGameWindow():
win.blit(bg, (0,0))
man.draw(win)
for bullet in bullets:
bullet.draw(win)

pygame.display.update()
```

Now we can fire bullets!

### Full Code

The full code should look like this.

```import pygame
pygame.init()

win = pygame.display.set_mode((500,480))

pygame.display.set_caption("First Game")

clock = pygame.time.Clock()

class player(object):
def __init__(self,x,y,width,height):
self.x = x
self.y = y
self.width = width
self.height = height
self.vel = 5
self.isJump = False
self.left = False
self.right = False
self.walkCount = 0
self.jumpCount = 10
self.standing = True

def draw(self, win):
if self.walkCount + 1 >= 27:
self.walkCount = 0

if not(self.standing):
if self.left:
win.blit(walkLeft[self.walkCount//3], (self.x,self.y))
self.walkCount += 1
elif self.right:
win.blit(walkRight[self.walkCount//3], (self.x,self.y))
self.walkCount +=1
else:
if self.right:
win.blit(walkRight[0], (self.x, self.y))
else:
win.blit(walkLeft[0], (self.x, self.y))

class projectile(object):
self.x = x
self.y = y
self.color = color
self.facing = facing
self.vel = 8 * facing

def draw(self,win):

def redrawGameWindow():
win.blit(bg, (0,0))
man.draw(win)
for bullet in bullets:
bullet.draw(win)

pygame.display.update()

#mainloop
man = player(200, 410, 64,64)
bullets = []
run = True
while run:
clock.tick(27)

for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False

for bullet in bullets:
if bullet.x < 500 and bullet.x > 0:
bullet.x += bullet.vel
else:
bullets.pop(bullets.index(bullet))

keys = pygame.key.get_pressed()

if keys[pygame.K_SPACE]:
if man.left:
facing = -1
else:
facing = 1

if len(bullets) < 5:
bullets.append(projectile(round(man.x + man.width //2), round(man.y + man.height//2), 6, (0,0,0), facing))

if keys[pygame.K_LEFT] and man.x > man.vel:
man.x -= man.vel
man.left = True
man.right = False
man.standing = False
elif keys[pygame.K_RIGHT] and man.x < 500 - man.width - man.vel:
man.x += man.vel
man.right = True
man.left = False
man.standing = False
else:
man.standing = True
man.walkCount = 0

if not(man.isJump):
if keys[pygame.K_UP]:
man.isJump = True
man.right = False
man.left = False
man.walkCount = 0
else:
if man.jumpCount >= -10:
neg = 1
if man.jumpCount < 0:
neg = -1
man.y -= (man.jumpCount ** 2) * 0.5 * neg
man.jumpCount -= 1
else:
man.isJump = False
man.jumpCount = 10

redrawGameWindow()

pygame.quit()
```