如何在pygame中用鼠标发射子弹?

时间:2016-11-12 08:56:15

标签: python pygame

我正试图从我的坦克发射子弹

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是主角的位置

mouse_x,mouse_y是鼠标的位置

mouse_x,mouse_y=pygame.mouse.get_pos()

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

我正指着移动枪的功能:

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
射击炮弹(子弹)的功能:

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)

调用函数

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

这是在pygame中发射子弹的正确方法吗?

问题1:当我点击我要拍的地方时,我的坦克没有任何东西

(由user2588654解决)

问题2:单击拍摄后我移动鼠标,子弹移动受到鼠标移动的影响

(由user2588654解决)

这是我下面的全部代码,但你不必看到它

图片:

enemy

player

background

(某些变量与上述不同)

pos_x + 360是pos_x

pos_y + 740是pos_y

mouse_radians是radians_pt

ball_move是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()

0 个答案:

没有答案