Pygame 中的生物碰撞

问题描述

如果对象 Player1 和对象 COmpuTER 发生碰撞,它们的坐标应该是静态的并且不会改变。我正在使用 for 循环来查找 Class Player1 和 COmpuTER 之间的距离。如果距离是 100,Class Player1 和 COmpuTER 都应该停止移动。我想通知您 Player1 和 COmpuTER 是包含类的列表。这些类被称为 Mobs 并描述了我游戏中的一个 mob 对象。

import pygame as pg
import random
import math
import os
import time

pg.init()


width_height = [800,800] #1400,1000
screen = pg.display.set_mode((width_height[0],width_height[1]))

 background_image = pg.transform.scale(pg.image.load(os.path.join("Pictures","BackgroundWarcraft.png")),(width_height[0],width_height[1]))
screen.blit(background_image,(0,0))

def collide(player1,player2):
value = abs(player1 - player2)
return int(value)


class Building:
def __init__(self,x,y,w,h,HP):
    self.x = x
    self.y = y
    self.w = w #width
    self.h = h #height
    self.HP = int(HP)
    self.mob_position = pg.rect.Rect((self.x,self.y,self.w,self.h))


def draw(self,surface,a,b,c):
        pg.draw.rect(screen,(a,c),self.mob_position)


def health_bar(self,max_HP):
        pg.draw.rect(screen,[255,0],[self.x,self.y - 40,max_HP,10])
        pg.draw.rect(screen,[0,255,self.HP,10])

class Mob:
    def __init__(self,moving_x_position,moving_y_position,HP):
    self.x = x
    self.y = y
    self.HP = int(HP)
    self.moving_x_position = moving_x_position
    self.moving_y_position = moving_y_position
    self.Creating_mob = pg.rect.Rect((self.x,50,50))
    #self.speed = 10
    


def detection(self,mobs_number,other_mobs):
    enemy_detected = False


    if enemy_detected == False:
        self.Creating_mob.move_ip(0,self.moving_y_position)

    if enemy_detected == True:
        self.Creating_mob.move_ip(0,0)

    
    liste = []
    for i in other_mobs:
            Coordinate = (i.Creating_mob[0],i.Creating_mob[1])
            liste.append(Coordinate)
        
    ny_liste = []
    for i in other_mobs:
            distance_x = collide(self.Creating_mob[0],i.Creating_mob[0])
            distance_y = collide(self.Creating_mob[1],i.Creating_mob[1])
            distance = math.sqrt((distance_x)**2+((distance_y)**2))
            if distance < 500 and distance > 100:
                retning_x,retning_y = 0,10
                self.Creating_mob.move_ip(retning_x,retning_y)
                i.Creating_mob.move_ip(retning_x,-retning_y)
            if distance < 99 or distance == 100:
                enemy_detected = True
                self.Creating_mob.move_ip(0,0)
                i.Creating_mob.move_ip(0,0)

            
    
                    

    
        
    
def health_bar(self,max_HP):
    pg.draw.rect(screen,self.y- 40,10]) #max_HP maybe
    pg.draw.rect(screen,10])
  
def draw(self,c):
    pg.draw.rect(screen,self.Creating_mob)



Player1_mobs = []
mobs_number = 0

COmpuTER_mobs = []
COmpuTER_timer = 30
COmpuTER_mobs_number = 0









Player1_building1 = Building(width_height[0]/8,width_height[1]-(width_height[1]/3),75,75)                     
Player1_building2 = Building((width_height[0]-(width_height[0]/8)-100),width_height[1]- 
(width_height[1]/3),75)
Player1_building3 = Building((width_height[0]/6+width_height[0]-width_height[0]/8-100)/2-50,width_height[1]-(width_height[1]/4),100,100)

COmpuTER_building1 = Building(width_height[0]/8,width_height[1]-(width_height[1]/4)-500,75)
COmpuTER_building2 = Building((width_height[0]-(width_height[0]/8)-100),width_height[1]- 
(width_height[1]/4)-500,75)
COmpuTER_building3 = Building((width_height[0]/6+width_height[0]-width_height[0]/8-100)/2- 
50,width_height[1]-(width_height[1]/3)-500,100)

FPS = 100

state = "START"
running = True
tick = 0
while running:
     tick = tick + 1
 


 if state == "START":
    for event in pg.event.get():
        if event.type == pg.QUIT:
            running = False
        elif event.type == pg.KEYDOWN:
            if event.key == pg.K_SPACE:
                pass
            elif event.key == pg.K_ESCAPE:
                pg.quit()




    if mobs_number != 0:
        for mobs_drawing in range(len(Player1_mobs)):
            Player1_mobs[mobs_drawing].draw(screen,200)
            Player1_mobs[mobs_drawing].health_bar(100)


    
    click = (1,0)
    if pg.mouse.get_pressed() == click:
        event.pos = pg.mouse.get_pos()
        if Player1_building1.mob_position.collidepoint(event.pos):   #Central position                  
            Player1_mobs.append(Mob(Player1_building1.mob_position[0]+12.5,Player1_building1.mob_position[1],-10,100))
            mobs_number += 1
            time.sleep(0.05)
        if Player1_building2.mob_position.collidepoint(event.pos):   #Central position
            Player1_mobs.append(Mob(Player1_building2.mob_position[0]+12.5,Player1_building2.mob_position[1],100))
            mobs_number += 1
            time.sleep(0.05)
        if Player1_building3.mob_position.collidepoint(event.pos):   #Central position
            Player1_mobs.append(Mob(Player1_building3.mob_position[0]+25,Player1_building3.mob_position[1],100))
            mobs_number += 1
            time.sleep(0.05)
        




    if COmpuTER_mobs_number != 0:
        for mobs_drawing in range(len(COmpuTER_mobs)):
            COmpuTER_mobs[mobs_drawing].draw(screen,200,0)
            COmpuTER_mobs[mobs_drawing].health_bar(100)
        if COmpuTER_mobs[mobs_drawing].Creating_mob[1] > width_height[1] or COmpuTER_mobs[mobs_drawing].Creating_mob[1] == width_height[1]:
            COmpuTER_mobs.remove(COmpuTER_mobs[-1])
            COmpuTER_mobs_number -= 1
        
    


    if COmpuTER_timer > 0:
        COmpuTER_timer -= 1
        if COmpuTER_timer == 0:
            COmpuTER_random_choice = random.choice(["enemy_startpos1","enemy_startpos2","enemy_startpos3"])
            if COmpuTER_random_choice == "enemy_startpos1":
                COmpuTER_mobs.append(Mob(COmpuTER_building1.mob_position[0]+12.5,COmpuTER_building1.mob_position[1],10,100))
                COmpuTER_mobs_number += 1
                COmpuTER_timer = 100   #måske noget som ''difficulty level input''
            elif COmpuTER_random_choice == "enemy_startpos2":
                COmpuTER_mobs.append(Mob(COmpuTER_building2.mob_position[0]+12.5,COmpuTER_building2.mob_position[1],100))
                COmpuTER_mobs_number += 1
                COmpuTER_timer = 100  #måske noget som ''difficulty level input''
            elif COmpuTER_random_choice == "enemy_startpos3":
                COmpuTER_mobs.append(Mob(COmpuTER_building3.mob_position[0]+25,COmpuTER_building3.mob_position[1],100))
                COmpuTER_mobs_number += 1
                COmpuTER_timer = 100   #måske noget som ''difficulty level input''

           



    if mobs_number != 0:
        if Player1_mobs[0].Creating_mob[1] == 0 or Player1_mobs[0].Creating_mob[1] < 0:
            Player1_mobs.remove(Player1_mobs[0])
            mobs_number -= 1

   



    for mob in COmpuTER_mobs:
        mob.detection(mobs_number,Player1_mobs)

    for mob in Player1_mobs:
        mob.detection(COmpuTER_mobs_number,COmpuTER_mobs)


    





    Player1_building1.draw(screen,200)
    Player1_building2.draw(screen,200)
    Player1_building3.draw(screen,200)
    COmpuTER_building1.draw(screen,0)
    COmpuTER_building2.draw(screen,0)
    COmpuTER_building3.draw(screen,0)

    Player1_building1.health_bar(75)
    Player1_building2.health_bar(75)
    Player1_building3.health_bar(100)
    COmpuTER_building1.health_bar(75)
    COmpuTER_building2.health_bar(75)
    COmpuTER_building3.health_bar(100)



    pg.display.update()


    
    screen.blit(background_image,0))
    pg.time.Clock().tick(FPS)

#Vigtig

#print(Player1_building1.y)> 533.3333333

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)