• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

공 쪼개기 문제

22.08.22 16:55 작성 조회수 158

0

  • import os
    import pygame
    pygame.init()
    screen_x=1920
    screen_y=1020
    screen=pygame.display.set_mode((screen_x,screen_y))
    pygame.display.set_caption("pygame")
    clock=pygame.time.Clock()
    current_path=os.path.dirname(__file__)
    image_path=os.path.join(current_path,"images")
    background=pygame.image.load(os.path.join(image_path,"background.png"))
    stage=pygame.image.load(os.path.join(image_path,"stage.png"))
    stage_size=stage.get_rect().size
    stage_y=stage_size[1]
    character=pygame.image.load(os.path.join(image_path,"character.png"))
    character_size=character.get_rect().size
    character_x=character_size[0]
    character_y=character_size[1]    
    character_x_pos=(screen_x/2)-(character_x/2)
    character_y_pos=screen_y-character_y-stage_y
    character_to_x=0
    character_speed=15            
    weapon1=pygame.image.load(os.path.join(image_path,"weapon1.png"))
    weapon1_size=weapon1 .     get_rect().size
    weapon1_x=weapon1_size[0]
    weapon1s=[]
    weapon1_speed=22.5
    weapon2=pygame.image.load(os.path.join(image_path,"weapon2.png"))
    weapon2_size=weapon2.get_rect().size
    weapon2_x=weapon2_size[0]
    weapon2s=[]
    weapon2_speed=10    
    weapon3=pygame.image.load(os.path.join(image_path,"weapon3.png"))
    weapon3_size=weapon3.get_rect().size
    weapon3_x=weapon3_size[0]
    weapon3s=[]
    weapon3_speed=2
    weapon_select=0
    ball_images=[pygame.image.load(os.path.join(image_path,"ball1.png")),pygame.image.load(os.path.join(image_path,"ball2.png")),pygame.image.load(os.path.join(image_path,"ball3.png")),pygame.image.load(os.path.join(image_path,"ball4.png"))]
    ball_speed_y=[-40,-35,-30,-25]
    balls=[]
    balls.append({"pos_x":50,"pos_y":50,"image_index":0,"to_x":5 ,"to_y" :- 10,"init_speed_y":ball_speed_y[0]})
    weapon1_to_remove=-1
    weapon2_to_remove=-1
    weapon3_to_remove=-1
    ball_to_remove=-1
    running=True
    while running:
        dt=clock.tick(150)
        for event in pygame.event.get():
            if event.type==pygame.QUIT:
                running=False
            if event.type==pygame.KEYDOWN:
                if event.key==pygame.K_LEFT:
                    character_to_x+=-1*character_speed
                if event.key==pygame.K_RIGHT:
                    character_to_x+=character_speed
                if event.key==pygame.K_w:
                    weapon_select=0
                if event.key==pygame.K_a:
                    weapon_select=1
                if event.key==pygame.K_d:
                    weapon_select=2
                if event.key==pygame.K_SPACE:
                    if weapon_select==0:
                        weapon1_x_pos=character_x_pos+character_x/2-weapon1_x/2
                        weapon1_y_pos=character_y_pos
                        weapon1s.append([weapon1_x_pos,weapon1_y_pos])
                    if weapon_select==1:
                        weapon2_x_pos=character_x_pos+character_x/2-weapon2_x/2
                        weapon2_y_pos=character_y_pos
                        weapon2s.append([weapon2_x_pos,weapon2_y_pos])
                    if weapon_select==2:
                        weapon3_x_pos=character_x_pos+character_x/2-weapon3_x/2
                        weapon3_y_pos=character_y_pos
                        weapon3s.append([weapon3_x_pos,weapon3_y_pos])
            if event.type==pygame.KEYUP:
                if event.key==pygame.K_LEFT:
                    character_to_x=0
                if event.key==pygame.K_RIGHT:
                    character_to_x=0
        character_x_pos+=character_to_x
        if character_x_pos<0:
            character_x_pos=0
        if character_x_pos>screen_x-character_x:
            character_x_pos=screen_x-character_x
        weapon1s=[[w1[0],w1[1]-weapon1_speed]for w1 in weapon1s]
        weapon1s=[[w1[0],w1[1]]for w1 in weapon1s if w1[1]>0]
        weapon2s=[[w2[0],w2[1]-weapon2_speed]for w2 in weapon2s]
        weapon2s=[[w2[0],w2[1]]for w2 in weapon2s if w2[1]>250]
        weapon3s=[[w3[0],w3[1]-weapon3_speed]for w3 in weapon3s]
        weapon3s=[[w3[0],w3[1]]for w3 in weapon3s if w3[1]>600]
        for ball_index,ball_value in enumerate(balls):
            ball_x_pos=ball_value["pos_x"]
            ball_y_pos=ball_value["pos_y"]
            ball_image_index=ball_value["image_index"]
            ball_size=ball_images[ball_image_index].get_rect().size
            ball_x=ball_size[0]
            ball_y=ball_size[1]
            if ball_x_pos<0 or ball_x_pos>screen_x-ball_x:
                ball_value["to_x"]=-1*ball_value["to_x"]
            if ball_y_pos>screen_y-stage_y-ball_y:
                ball_value["to_y"]=ball_value["init_speed_y"]
            else:
                ball_value["to_y"]+=0.5                            
                ball_value["pos_x"]+=ball_value["to_x"]
            ball_value["pos_y"]+=ball_value["to_y"]
        character_rect=character.get_rect()
        character_rect.left=character_x_pos              
        character_rect.top=character_y_pos
        for ball_index,ball_value in enumerate(balls):
            ball_x_pos=ball_value["pos_x"]
            ball_y_pos=ball_value["pos_y"]
            ball_image_index=ball_value["image_index"]
            ball_rect=ball_images[ball_image_index].get_rect()
            ball_rect.left=ball_x_pos
            ball_rect.top=ball_y_pos
            if character_rect.colliderect(ball_rect):
                running=False
                break
        for weapon1_index,weapon1_value in enumerate(weapon1s):
            weapon1_x_pos=weapon1_value[0]
            weapon1_x_pos=weapon1_value[1]
            weapon1_rect=weapon1.get_rect()
            weapon1_rect.left=weapon1_x_pos
            weapon1_rect.top=weapon1_y_pos
            if weapon1_rect.colliderect(ball_rect):
                weapon1_to_remove=weapon1_index
                ball_to_remove=ball_index  
                if ball_image_index<3:
                    ball_width=ball_rect.size[0]
                    ball_height=ball_rect.size[1]
                    small_ball_rect=ball_images[ball_image_index+1].get_rect()
                    small_ball_width=small_ball_rect.size[0]
                    small_ball_height=small_ball_rect.size[1]
                    balls.append({"pos_x":ball_x_pos+ball_width/2-small_ball_width/2,"pos_y":ball_y_pos+ball_height/2-small_ball_height/2,"image_index":ball_image_index+1,"to_x":-5,"to_y":-10,"init_speed_y":ball_speed_y[ball_image_index+1]})
                    balls.append({"pos_x":ball_x_pos+ball_width/2-small_ball_width/2,"pos_y":ball_y_pos+ball_height/2-small_ball_height/2,"image_index":ball_image_index+1,"to_x":5,"to_y":-10,"init_speed_y":ball_speed_y[ball_image_index+1]})
                break  
        for weapon2_index,weapon2_value in enumerate(weapon2s):
            weapon2_x_pos=weapon2_value[0]
            weapon2_x_pos=weapon2_value[1]
            weapon2_rect=weapon2.get_rect()
            weapon2_rect.left=weapon2_x_pos
            weapon2_rect.top=weapon2_y_pos
            if weapon2_rect.colliderect(ball_rect):
                weapon2_to_remove=weapon2_index
                ball_to_remove=ball_index
                if ball_image_index<3:
                    ball_width=ball_rect.size[0]
                    ball_height=ball_rect.size[1]
                    small_ball_rect=ball_images[ball_image_index+1].get_rect()
                    small_ball_width=small_ball_rect.size[0]
                    small_ball_height=small_ball_rect.size[1]
                    balls.append({"pos_x":ball_x_pos+ball_width/2-small_ball_width/2,"pos_y":ball_y_pos+ball_height/2-small_ball_height/2,"image_index":ball_image_index+1,"to_x":-5,"to_y":-10,"init_speed_y":ball_speed_y[ball_image_index+1]})
                    balls.append({"pos_x":ball_x_pos+ball_width/2-small_ball_width/2,"pos_y":ball_y_pos+ball_height/2-small_ball_height/2,"image_index":ball_image_index+1,"to_x":5,"to_y":-10,"init_speed_y":ball_speed_y[ball_image_index+1]})
                break
        for weapon3_index,weapon3_value in enumerate(weapon3s):
            weapon3_x_pos=weapon3_value[0]
            weapon3_x_pos=weapon3_value[1]
            weapon3_rect=weapon3.get_rect()
            weapon3_rect.left=weapon3_x_pos
            weapon3_rect.top=weapon3_y_pos      
            if weapon3_rect.colliderect(ball_rect):
                weapon3_to_remove=weapon3_index
                ball_to_remove=ball_index
                if ball_image_index<3:
                    ball_width=ball_rect.size[0]
                    ball_height=ball_rect.size[1]
                    small_ball_rect=ball_images[ball_image_index+1].get_rect()
                    small_ball_width=small_ball_rect.size[0]
                    small_ball_height=small_ball_rect.size[1]
                    balls.append({"pos_x":ball_x_pos+ball_width/2-small_ball_width/2,"pos_y":ball_y_pos+ball_height/2-small_ball_height/2,"image_index":ball_image_index+1,"to_x":-5,"to_y":-10,"init_speed_y":ball_speed_y[ball_image_index+1]})
                    balls.append({"pos_x":ball_x_pos+ball_width/2-small_ball_width/2,"pos_y":ball_y_pos+ball_height/2-small_ball_height/2,"image_index":ball_image_index+1,"to_x":5,"to_y":-10,"init_speed_y":ball_speed_y[ball_image_index+1]})
                break
        if ball_to_remove>-1:
            del balls[ball_to_remove]
            ball_to_remove=-1
        if weapon1_to_remove>-1:
            del weapon1s[weapon1_to_remove]
            weapon1_to_remove=-1
        if weapon2_to_remove>-1:  
            del weapon2s[weapon2_to_remove]
            weapon2_to_remove=-1
        if weapon3_to_remove>-1:  
            del weapon3s[weapon3_to_remove]
            weapon3_to_remove=-1  
        screen.blit(background,(0,0))
        for index,value in enumerate(balls):
            ball_x_pos=value["pos_x"]
            ball_y_pos=value["pos_y"]
            ball_image_index=value["image_index"]
            screen.blit(ball_images[ball_image_index],(ball_x_pos,ball_y_pos))
        for weapon1_x_pos,weapon1_y_pos in weapon1s:
            screen.blit(weapon1,(weapon1_x_pos,weapon1_y_pos))
        for weapon2_x_pos,weapon2_y_pos in weapon2s:
            screen.blit(weapon2,(weapon2_x_pos,weapon2_y_pos))
        for weapon3_x_pos,weapon3_y_pos in weapon3s:
            screen.blit(weapon3,(weapon3_x_pos,weapon3_y_pos))
        screen.blit(stage,(0,screen_y-stage_y))
        screen.blit(character,(character_x_pos,character_y_pos))
        pygame.display.update()
    pygame.quit()
    무기를 추가해서 다음과 같은 코드를 짰는데 정작 공이 무기에 닿았을 때는 아무일도 없고 다른 데 있을 때 발사하면 쪼개지네요......왜이러는걸까요?

답변 0

답변을 작성해보세요.

답변을 기다리고 있는 질문이에요.
첫번째 답변을 남겨보세요!