강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của inlay941471
inlay941471

câu hỏi đã được viết

Bài giảng Python miễn phí (Cách sử dụng Phần 1) - Tạo game arcade hoài cổ (3 giờ)

Chia bóng

공 쪼개기 문제

Viết

·

297

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()
    무기를 추가해서 다음과 같은 코드를 짰는데 정작 공이 무기에 닿았을 때는 아무일도 없고 다른 데 있을 때 발사하면 쪼개지네요......왜이러는걸까요?
pythonGUIpygame

Câu trả lời

Câu hỏi này đang chờ câu trả lời
Hãy là người đầu tiên trả lời!
Hình ảnh hồ sơ của inlay941471
inlay941471

câu hỏi đã được viết

Đặt câu hỏi