I am making a 2-player game which is supposed to look like:
In the game, the shooters(green and blue, controlled by players) can shoot bullets at each other.
If the bullet
1. collides with the wall(grey), it gets destroyed.
2. hits the shooter, it loses health(shooter).
The game is (supposed to be) turn-based and ends when a player reaches 0
health.
My Problem(s)
1. The barrel of my shooters is not updating/rotating.
2. Is there a better way to detect if a(ny) key is pressed.
* Shooter,Bullet,Wall are classes
My code
(comment if any function that would be useful in answering is not mentioned)
import math,random,pygame
def event_handle(event,turn):
if turn == 1:
c_s = p1
elif turn == 2:
c_s = p2
else:
return None
if event.type == pygame.KEYDOWN:
key = pygame.key.get_pressed()
# next_pos
if key[pygame.K_q]:
c_s.next_x -= 1
if key[pygame.K_e]:
c_s.next_x += 1
# angle
if key[pygame.K_w]:
c_s.angle += radians(1)
if key[pygame.K_s]:
c_s.angle -= radians(1)
# power (speed)
if key[pygame.K_d]:
c_s.speed += 0.1
if key[pygame.K_a]:
c_s.speed -= 0.1
def draw_all(bullist,shooters,wall,surface):
# draw shooters
for shooter in shooters:
shooter.move()
shooter.draw(surface)
# draw bullets
for bullet in bullist:
bullet.gravity()
bullet.move()
bullet.collides(shooters,wall,bullist)
bullet.out(surface,bullist)
bullet.draw(surface)
# wall
wall.update()
wall.draw(surface)
pygame.draw.aaline(surface,(255,255,255),(0,400),(640,400))
def angle(A,B,BC,theta):
C = [0,0]
alpha = math.atan2(A[1]-B[1] , A[0] -B[0] ) - theta
C[0] = int(round(B[0] + BC * math.cos(alpha),0))
C[1] = int(round(B[1] + BC * math.sin(alpha),0))
return C
class Shooter:
def __init__(self,pos,size,color,xmax,xmin):
self.pos = pos
self.size = size
self.rect = pygame.Rect(pos,size)
self.health = 100
self.color = color
self.angle = 0
self.speed = 0
self.max = xmax
self.min = xmin
self.next_x = pos[0]
self.color2 = []
for i in color:
i = i - 100
if i < 0:
i = 0
self.color2.append(i)
def draw(self,surface):
global C
pygame.draw.rect(surface,self.color,self.rect)
c = angle(self.rect.midleft,self.rect.center,
20,radians(self.angle))
if c != C and c != [95,392]:
print c
C = c
pygame.draw.line(surface,self.color2,self.rect.center,c,3)
## the other funcs or classes not needed
# globals
turn = 1
C = []
# pygame
(width, height) = (640, 480)
screen = pygame.display.set_mode((width, height))
pygame.display.set_caption('Shooter')
clock = pygame.time.Clock()
# game actors
shooters = []
bullets = []
p1 = Shooter((400,400),(30,-15),(255,0,0),0,0)
p2 = Shooter((100,400),(30,-15),(0,255,0),0,0)
shooters.extend([p1, p2])
wall = Wall(100)
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
pygame.quit()
break
else: event_handle(event,turn)
if not running:
break
screen.fill((0,0,0))
# Game draw logic + Game logic
draw_all(bullets,shooters,wall,screen)
pygame.display.flip()
clock.tick(40)
Shoter.move
method is missing (also some imports and theWall
class, but these are not that important). – slothshooter.move
only changesshooter.rect.x
's value by one at a time – pradyunsg