3

I am trying to fire a bullet from my tank

for event in pygame.event.get():
    if event.type == pygame.MOUSEBUTTONDOWN:
        if pygame.mouse.get_pressed()[0]:
            cannon_ball_move_change = 1

cannon_ball_move += cannon_ball_move_change

pos_x,pos_y is the position of the main character

mouse_x,mouse_y is the position of the mouse

mouse_x,mouse_y=pygame.mouse.get_pos()

mouse_radians = math.radians(-180) + math.atan2((pos_y-mouse_y),(pos_x-mouse_x))

function that moves the gun I am pointing at:

def player_gun(pos_x,pos_y,mouse_radians):

    pygame.draw.line(screen,green,[pos_x,pos_y],[pos_x+20*math.cos(mouse_radians),pos_y+20*math.sin(mouse_radians)],5)
    #'pygame.draw.line' draws a line(gun) that connects from the player and the direction of where the mouse is pointing at

    pygame.draw.circle(screen,green,[pos_x,pos_y],5)
    #this is the gun's body part

function that shoots cannonballs(bullets):

def player_cannonball(mouse_radians,cannon_ball_move,pos_x,pos_y):
    cannonball_x = int(cannon_ball_move*(math.cos(mouse_radians))+pos_x)
    cannonball_y = int(cannon_ball_move*(math.sin(mouse_radians))+pos_y)
    pygame.draw.circle(screen,red,[cannonball_x,cannonball_y],5)
    print(cannonball_x,cannonball_y)

calling the function

player_cannonball(mouse_radians,cannon_ball_move,pos_x,pos_y)
player_gun(pos_x,pos_y,mouse_radians)

Is this the right way to fire a bullet in pygame?

problem 1: When I click where I want to shoot nothing comes out of my tank

(solved by user2588654)

problem 2: After I click to shoot and I move the mouse the bullet movement is affected by the movement of my mouse

(solved by user2588654)

This is my whole code down below but you don't have to see it

The pictures:

enemy

player

background

(some variables are different from above)

pos_x+360 is pos_x

pos_y+740 is pos_y

mouse_radians is radians_pt

ball_move is cannonball_move

import pygame,math,random
pygame.init()
display_width = 1200
display_height = 800
white = (255,255,255)
black = (0,0,0)
red = (200,0,0)
yellow = (150,150,0)
green=(0,170,0)
light_yellow = (255,255,0)
light_red = (255,0,0)
role_model = car_image = pygame.image.load('player1.png')
enemy = pygame.image.load('enemy.png')
background = pygame.image.load('background.png')

clock = pygame.time.Clock()
FPS = 30
screen = pygame.display.set_mode([display_width,display_height])
screen_rect = screen.get_rect()
car_width = 16
car_height = 28
smallfont =pygame.font.SysFont('comicsansms',25)
medfont =pygame.font.SysFont('comicsansms',50)
largefont =pygame.font.SysFont('comicsansms',80)

def player_car(car_image,rect,angle,pos_x,pos_y):
    rot_image,rot_rect=rotate(car_image,rect,angle)
    rot_rect.centerx +=pos_x
    rot_rect.centery += pos_y
    screen.blit(rot_image,rot_rect)
    print(rot_rect)


def player_turret(pos_x,pos_y,radians_pt):
    pygame.draw.line(screen,green,[pos_x+360,pos_y+740],[pos_x+360+20*math.cos(radians_pt),pos_y+740+20*math.sin(radians_pt)],5)
    pygame.draw.circle(screen,green,[pos_x+360,pos_y+740],5)

def player_cannonball(radians_pt,ball_move,pos_x,pos_y):
    #cannonball_count = 0
    ball_x = int(ball_move*(math.cos(radians_pt))+pos_x+360)
    ball_y = int(ball_move*(math.sin(radians_pt))+pos_y+740)
    pygame.draw.circle(screen,red,[ball_x,ball_y],5)
    print(ball_x,ball_y)

def enemy_car(enemy,rect,angle_e,pos_x_e,pos_y_e):
    rot_image_e,rot_rect_e=rotate(enemy,rect,angle_e)
    rot_rect_e.centerx +=pos_x_e
    rot_rect_e.centery += pos_y_e
    screen.blit(rot_image_e,rot_rect_e)

def death_move(pos_x,pos_y):
    color_list=[light_yellow,light_red]
    for i in range(40):
        a=color_list[random.randrange(0,2)]
        pygame.draw.circle(screen,a,[random.randint((pos_x+360)-25,(pos_x+360)+25),random.randint((pos_y+740)-25,(pos_y+740)+25)],3)
        pygame.display.update()
        clock.tick(FPS)

def death():
    msg_to_screen('YOU ARE DEAD',red,0,size='large')
    msg_to_screen('press c to continue or q to quit',black,50)
    pygame.display.update()
    death = True
    while death:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                death = False
                pygame.quit()
                quit()
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_c:

                    gameloop()
                    death = False
                elif event.key == pygame.K_q:
                    death =  False
                    pygame.quit()
                    quit()

        clock.tick(15)

def game_pause():
    game_pause = True
    msg_to_screen('PAUSED',black,0,'large')
    msg_to_screen('press c to continue or q to quit',red,40)
    pygame.display.update()
    while game_pause:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
##                controls = False
##                gameintro = False
##                running = False
##                game_pause = False
                pygame.quit()
                quit()
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_c:
                    game_pause = False
                elif event.key == pygame.K_q:
                    pygame.quit()
                    quit()


        clock.tick(15)
def game_intro():
    gameintro = True

    while gameintro == True:

        for event in pygame.event.get():
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_p:

                    gameloop()
                    gameintro = False

                if event.key == pygame.K_c:

                    controls()
                    gameintro = False

            if event.type == pygame.QUIT:
                pygame.quit()
                quit()
        screen.fill(white)
        msg_to_screen('CAR RACING',black,y_displace=-50,size = 'large')
        msg_to_screen('press p to play and c for controls menu',red,y_displace=20)
        msg_to_screen('by yeonjekim',yellow,y_displace=80)
        pygame.display.update()
        clock.tick(15)

def text_objects(text,color,size):
    if size == "small":
        textSurface = smallfont.render(text, True, color)
    elif size == "medium":
        textSurface = medfont.render(text, True, color)
    elif size == "large":
        textSurface = largefont.render(text, True, color)


    return textSurface, textSurface.get_rect()

def turret(pos_x_t,pos_y_t):
    pygame.draw.circle(screen,black,[pos_x_t,pos_y_t],30)
def msg_to_screen(msg,color, y_displace=0, size = "small"):
    textSurf, textRect = text_objects(msg,color, size)
    textRect.center = (display_width / 2), (display_height / 2)+y_displace
    screen.blit(textSurf, textRect)
def controls():
    controls = True

    while controls == True:
        for event in pygame.event.get():
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_b:
                    controls = False
                    game_intro()
            elif event.type == pygame.QUIT:
                pygame.quit()
                quit()
        screen.fill(white)
        msg_to_screen('CONTROLS',black,y_displace=-100,size = 'large')
        msg_to_screen('K_LEFT:  go left',green,y_displace = -40)
        msg_to_screen('K_RIGHT: go right',green,y_displace = 0)
        msg_to_screen('K_UP:    go up',green,y_displace = 40)
        msg_to_screen('K_DOWN:  go down',green,y_displace = 80)
        msg_to_screen('K_SPACE: break',green,y_displace = 120)
        msg_to_screen('K_p:     pause',green,y_displace = 160)
        msg_to_screen('press b to go back to the main menu',red,y_displace = 200)
        pygame.display.update()
        clock.tick(15)
def rotate(image, rect, angle):
    rot_image = pygame.transform.rotate(image, angle)
    rot_rect = rot_image.get_rect(center=rect.center)
    return rot_image,rot_rect

def carRotationPos(angle):
    x=1*math.cos(math.radians(angle-90))
    y=1*math.sin(math.radians(angle-90))

    return x,y


def gameloop():
    gameintro = False
    running = True
    angle = -90
    radians_pt = 0
    radians_pt_change = 0
    angle_change = 0
    changeX = 0
    changeY=0
    max_speed = 25
    x=0
    y=0
    pos_x=0
    pos_y=0
    pos_x_e= 120
    pos_y_e=-30
    speed = 0
    speed_change = 0
    change_1=0
    count = 0
    count_e = 0
    change_2 = 0
    max_speed_e = 15
    slowingdown=0
    angle_e=-90
    mouse_x=0
    mouse_y=0
    cannonball_max_count = 5
    ball_move =0
    ball_move_change=0
    moving_up = False
    moving_down = False
    slowdown_up = False
    slowdown_down = False
    rect = role_model.get_rect(center = (360,740))#center = screen_rect.center)
    while running == True:


        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                controls = False
                gameintro = False
                running = False


            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_p:
                    game_pause()

                elif event.key == pygame.K_LEFT:


                    angle_change = 5

                elif event.key == pygame.K_RIGHT:
                    angle_change = -5

                elif event.key == pygame.K_UP:
                    slowdown_up = False
                    slowdown_down = False
                    changeX=-x
                    changeY=y
                    speed_change = ((1/2)*speed_change**2 - (1/2)*speed_change+ 1)*0.2
                    moving_up = True
                #start of my problem
                elif event.key == pygame.K_DOWN:
                    slowdown_down = False
                    slowdown_up = False
                    changeX=x
                    changeY=-y
                    speed_change = ((1/2)*speed_change**2 - (1/2)*speed_change+ 1)*0.2
                    moving_down = True
                elif event.key == pygame.K_SPACE:
                    change_1 =2



            if event.type == pygame.KEYUP:
                if event.key == pygame.K_LEFT:
                    angle_change = 0

                elif event.key == pygame.K_RIGHT:
                    angle_change = 0

                elif event.key == pygame.K_UP:
                    moving_up = False
                    slowdown_up = True
                elif event.key == pygame.K_DOWN:
                    moving_down = False
                    slowdown_down = True
                elif event.key == pygame.K_SPACE:
                    slowingdown = 0
                    change_1 = 0
                    max_speed = 25
            if event.type == pygame.MOUSEBUTTONDOWN:
                if pygame.mouse.get_pressed()[0]:
                    ball_move_change=1

        ball_move += ball_move_change
        mouse_x,mouse_y=pygame.mouse.get_pos()
        mouse_gradient=math.atan2((pos_y+740-mouse_y),(pos_x+360-mouse_x))
        radians_pt = mouse_gradient+math.radians(-180)
        print(radians_pt)
        player_cannonball(radians_pt,ball_move,pos_x,pos_y)

        slowingdown+=change_1 
        if moving_up == True:
            max_speed-=slowingdown
        elif moving_down == True:
            max_speed-=slowingdown


        if changeX or changeY:
            pos_x+=changeX
            pos_y+=changeY
        if angle == -360 or angle == 360:
            angle = 0

        if angle_change:
            angle +=angle_change
        if speed_change:
            speed+=speed_change


            if speed > max_speed:
                speed = max_speed




        screen.blit(background,(0,0))
        x,y=carRotationPos(angle)

        x=round(x*speed)
        y=round(y*speed)
        if slowdown_up == True:

            changeX = -x
            changeY = y
            speed =speed- 1
            if speed <=0:
                speed = 0

        if slowdown_down == True:
            changeX = x
            changeY = -y
            speed =speed- 1
            if speed <=0:
                speed = 0


        if moving_up:


            changeX = -x
            changeY = y

        if moving_down:

            changeX = x
            changeY = -y

        #collision detection
        if pos_x<-341:

            death_move(pos_x,pos_y)
            death()
##            pos_x = -341
##            pos_x+=2
        if pos_y<-720:
            death_move(pos_x,pos_y)
            death()
##            pos_y=-720
##            pos_y+=2
        if pos_y>43:
            death_move(pos_x,pos_y)
            death()
##            pos_y = 43
##            pos_y-=2
        if pos_x>820:
            death_move(pos_x,pos_y)
            death()
##            pos_x = 820
##            pos_x-=2
        #enemy collision detection

        #grass collison
        if not(-308<pos_x<782 and -686<pos_y<13):
            if count>20:
                count = 20
            count +=1

            max_speed = 25-count
            if slowingdown>4-change_1:
                slowingdown = 4-change_1
            if slowingdown<0:
                slowingdown = 0
        elif -228<pos_x<718 and -625<pos_y<-50:
            if count>20:
                count = 20
            count +=1
            max_speed = 25-count
            if slowingdown>4-change_1:
                slowingdown = 4-change_1
            if slowingdown<0:
                slowingdown = 0
        else:
            count = 0
            max_speed = 25
            if slowingdown>25-change_1:
                slowingdown = 25-change_1
            if slowingdown<0:
                slowingdown = 0

        #enemy grass collision
##        if not(-308<pos_x_e<782 and -686<pos_y_e<13):
##            if count_e>20:
##                count_e = 20
##            count_e +=1
##            
##            max_speed_e = 25-count_e
##            if slowingdown>4-change_1:
##                slowingdown = 4-change_1
##            if slowingdown<0:
##                slowingdown = 0
##        elif -228<pos_x_e<718 and -625<pos_y_e<-50:
##            if count_e>20:
##                count_e = 20
##            count_e +=1
##            max_speed_e = 25-count  #max_speed_e
##            if slowingdown>4-change_1:
##                slowingdown = 4-change_1
##            if slowingdown<0:
##                slowingdown = 0
##        else:
##            count_e = 0
##            max_speed_e = 25
##            if slowingdown>25-change_1:
##                slowingdown = 25-change_1
##            if slowingdown<0:
##                slowingdown = 0

        #end of the collision detection

        #enemy car code
        if angle_e == 270:
            angle_e = -90
        if -260<=pos_x_e<730 and pos_y_e == -30:
            pos_x_e+=10#((1/2)*speed_change**2 - (1/2)*speed_change+ 1)*0.2


        elif -90<=angle_e<0:
            angle_e += 5



        elif angle_e==0 and -657<pos_y_e<=-30:
            pos_y_e -= 10
        elif 0<=angle_e <90 and pos_y_e == -660:
            angle_e +=5

        elif pos_y_e == -660 and -260<pos_x_e<=730:

            pos_x_e -=10
        elif pos_y_e == -660 and pos_x_e == -260 and 90<=angle_e<180:
            angle_e +=5
        elif -660<=pos_y_e<-40  and pos_x_e == -260 and angle_e == 180:
            pos_y_e += 10
        elif -40<=pos_y_e<-30 and 180<=angle_e<270:
            pos_y_e +=10/18
            angle_e +=5
        if pos_y_e ==-29.99999999999997:
            pos_y_e = round(pos_y_e)

        #pos_x_t = random.randint(30,600)
        #pos_y_t = random.randint(30,600)
        #turret(pos_x_t,pos_y_t)
        #if enemy team reaches the yellow line enemy team earns a turret
        #the enemy can shoot
        #you can get items if you reach the yellow line, the item could be a gun for removing enemy turrets

        player_car(car_image,rect,angle,pos_x,pos_y)
        player_turret(pos_x,pos_y,radians_pt)
        enemy_car(enemy,rect,angle_e,pos_x_e,pos_y_e)



        msg_to_screen('speed = '+str(round(speed*5,1))+'km/h',black, y_displace=-375, size = "small")
        pygame.display.update()
        clock.tick(FPS)

game_intro()
pygame.quit()
Yeonje Kim
  • 41
  • 9
  • Please have a look at this website https://www.pygame.org/docs/tut/chimp/ChimpLineByLine.html – Pragyaditya Das Nov 12 '16 at 09:01
  • Does it not work or you want it to make it more compact or what do you exactly want/need? –  Nov 12 '16 at 09:01
  • @Turry sadly it doesn't work – Yeonje Kim Nov 12 '16 at 09:45
  • @YeonjeKim In your `player_cannonball` function, are `ball_x` and `ball_y` supposed to be `cannonball_x` and `cannonball_y`? Where are `ball_x` and `ball_y` set? Also, where do 360 and 740 come from? – CodeSurgeon Nov 12 '16 at 10:15
  • @user2588654 sorry for my mistake I fixed it – Yeonje Kim Nov 12 '16 at 10:18
  • please ignore 360 and 740 – Yeonje Kim Nov 12 '16 at 10:21
  • To clarify, when you say it doesn't work, is it just that the cannon_ball is not displayed, the cannon_ball doesn't move correctly, or something else? It is tough to see immediately what is wrong. Would it be possible to post the entire game loop/main class? – CodeSurgeon Nov 12 '16 at 10:21
  • edits: cannonball_x = ball_x, cannonball_y = ball_y and no 360 and 740 – Yeonje Kim Nov 12 '16 at 10:22
  • cannon_ball is not displayed – Yeonje Kim Nov 12 '16 at 10:23
  • and it doesn't move correctly too – Yeonje Kim Nov 12 '16 at 10:23
  • 1
    @YeonjeKim Using some hideous placeholder graphics I got it running. When I commented out `screen.blit(background,(0,0))`, I saw the red bullet. I think you are drawing the bullet, it is just that it is underneath the background. Draw the background first, then the bullet! – CodeSurgeon Nov 12 '16 at 10:36
  • Thank you for your help! but there is another problem to fix... the problem is that after I click to shoot and I move the mouse the bullet movement is affected by the movement of my mouse – Yeonje Kim Nov 12 '16 at 10:42
  • 2
    @YeonjeKim Well the reason that happens is because every frame, you are changing `radians_pt` based on the mouse position. You need to change this so that when you click, you save the angle you are firing at in a different variable. But your code is starting to look really messy. It might be clearer if you made it object-oriented and used classes for your player, enemy, and cannon ball! – CodeSurgeon Nov 12 '16 at 10:48
  • @user2588654 Thank you for your help :) – Yeonje Kim Nov 12 '16 at 11:51

0 Answers0