Home Game Development python – Why does collision solely work generally when there are a number of objects within the sport?

python – Why does collision solely work generally when there are a number of objects within the sport?

0
python – Why does collision solely work generally when there are a number of objects within the sport?

[ad_1]

when i used to be making a pygame in python for the primary time
i kinda have an issue the place generally the participant and the article would contact and the sport wouldn’t shut as supposed i dint appear to search out the answer to this drawback principally it might work however generally the collision would happen however the participant would clip proper by way of
i’ve tried quite a few collision methods which i’ve heard however none appear to work as properly
the issue would nonetheless exit

right here is my code

import math
import pygame
import random
RED=(255,0,0)
BLUE=(0,0,255)
bg_COLOR=(0,0,0)
WHITE=(255,255,255)

pygame.init()
font = pygame.font.SysFont('monospace', 15)
wid=720
hight=600

player_size = [40,40]
flag=0
player_pos = [int(wid/2),hight-2*player_size[1]]

enemy_size = 50
enemy_pos = [random.randint(0,wid-enemy_size),0]

en_list=[enemy_pos]
velocity=10
en_num=4
block_evade=0

display screen = pygame.show.set_mode((wid,hight))
pygame.show.set_caption('x wing shooter alpha v1')
game_over = False

clock = pygame.time.Clock()
def score_count(block_evade,block_attack=0):
    textual content = font.render('rating:', 1,WHITE)
    text2 = font.render(str(block_evade + block_attack),1,WHITE) 
    display screen.blit(textual content,(0,0))
    display screen.blit(text2,(50,0))


def game_quit():
     pygame.show.give up()
     pygame.give up()


def spawn_en(en_list):
    delay = random.random()
    if len(en_list)<en_num and delay < 0.2:#
        x_pos=random.randint(0,wid-enemy_size)
        y_pos=0
        en_list.append([x_pos ,y_pos])

def create_en(en_list):
    for enemy_pos in en_list:
        pygame.draw.rect(display screen,BLUE,(enemy_pos[0],enemy_pos[1],enemy_size,enemy_size))

def detect_col(player_pos, enemy_pos):
    p_x=player_pos[0]
    p_y=player_pos[1]

    e_x=enemy_pos[0]
    e_y=enemy_pos[1]
    x1=int(e_x+enemy_size/2)
    x2=int(p_x+player_size[0]/2)
    y1=int(e_y+enemy_size/2)
    y2=int(p_y+player_size[1]/2)
    distance =int(math.sqrt((math.pow(x2-x1,2))+(math.pow(y2-y1,2))))

    if(e_x + enemy_size >= p_x > e_x):
        if(e_y + enemy_size >= p_y > e_y):
            return True
    elif(p_x + player_size[0] >= e_x > p_x):
        if(p_y + player_size[1] >= e_y > p_y):
            return True
    elif(distance <= int(enemy_size/2)):
        return True




def fall_en(en_list):
    block_evade=0
    for idx, enemy_pos in enumerate(en_list):
        if enemy_pos[1] >= 0 and enemy_pos[1]<=hight:
            enemy_pos[1]+=velocity
        else:
            en_list.pop(idx)
            block_evade+=1
    return block_evade

def col_check(en_list, player_pos):
    for enemy_pos in en_list:
        if detect_col(player_pos,enemy_pos):
            return True
        else:
            return False


whereas not game_over:

    for occasion in pygame.occasion.get():
        if occasion.sort == pygame.QUIT:
           game_quit()
           flag=1
           break 
    if occasion.sort == pygame.KEYDOWN:
        x = player_pos[0]
        y = player_pos[1]
        if occasion.key == pygame.K_LEFT and player_pos[0] >= 0:
            x-=10
        elif occasion.key == pygame.K_RIGHT and player_pos[0] <= wid-player_size[0]:
            x+=10
        elif occasion.key == pygame.K_DOWN  and player_pos[1] <= hight-player_size[1]:
            y+=10
        elif occasion.key == pygame.K_UP  and player_pos[1] >= 0:
            y-=10
        player_pos = [x,y]


    if flag != 1:    
        display screen.fill(bg_COLOR)    






    spawn_en(en_list)
    block_evade+=fall_en(en_list)
    if col_check(en_list, player_pos):
        game_over=True
    create_en(en_list)
    score_count(block_evade,0)
    pygame.draw.rect(display screen,RED,(player_pos[0],player_pos[1],player_size[0],player_size[1]))

    clock.tick(20)

    pygame.show.replace()

else:
    game_quit()

[ad_2]

LEAVE A REPLY

Please enter your comment!
Please enter your name here