需要帮助找出如何碰撞这两个对象

时间:2019-05-28 18:24:08

标签: python-3.x class pygame sprite collision-detection

我正在尝试碰撞这两个图像,但由于某种原因,它并非如此。我想知道如何修复程序,以免图像冲突。

我尝试过在周围移动敌人的精灵,尝试从if语句中删除并使用变量。我没有太多的知识,据我所知。

from time import sleep as s
import random
import pygame
import time

pygame.init()

window = pygame.display.set_mode((1000, 500))
pygame.display.set_caption("Practice Game")
image = pygame.image.load('pixel6.png')
image = pygame.transform.scale(image, (1000, 500))

jumpv1 = [pygame.image.load('adventurer-jump-00.png'),pygame.image.load('adventurer-jump-01.png'),pygame.image.load('adventurer-jump-02.png'),pygame.image.load('adventurer-jump-03.png'), pygame.image.load('adventurer-smrslt-00.png'),pygame.image.load('adventurer-smrslt-01.png'),pygame.image.load('adventurer-smrslt-02.png'),pygame.image.load('adventurer-smrslt-03.png')]
jumpv2 = [pygame.image.load('adventurer-smrslt-00.png'),pygame.image.load('adventurer-smrslt-01.png'),pygame.image.load('adventurer-smrslt-02.png'),pygame.image.load('adventurer-smrslt-03.png')]
jumpv3 = [pygame.image.load('adventurer-smrslt-00.png'),pygame.image.load('adventurer-smrslt-01.png'),pygame.image.load('adventurer-smrslt-02.png'),pygame.image.load('adventurer-smrslt-03.png')]
jumpv4 = [pygame.image.load('adventurer-smrslt-00.png'),pygame.image.load('adventurer-smrslt-01.png'),pygame.image.load('adventurer-smrslt-02.png'),pygame.image.load('adventurer-smrslt-03.png')]
jump1 = jumpv1+jumpv2+jumpv3+jumpv4

run2 = [pygame.image.load('adventurer-run-00.png'), pygame.image.load('adventurer-run-01.png'),pygame.image.load('adventurer-run-02.png'),pygame.image.load('adventurer-run-03.png')]

slide1 = [pygame.image.load('adventurer-slide-00.png'),pygame.image.load('adventurer-slide-01.png'),pygame.image.load('adventurer-stand-00.png'),pygame.image.load('adventurer-stand-01.png'),pygame.image.load('adventurer-stand-02.png')]

firstattack = [pygame.image.load('adventurer-attack3-00.png'),pygame.image.load('adventurer-attack3-01.png'),pygame.image.load('adventurer-attack3-02.png'),pygame.image.load('adventurer-attack3-03.png'),pygame.image.load('adventurer-attack3-04.png'),pygame.image.load('adventurer-attack3-05.png')]
secondattack = [pygame.image.load('adventurer-attack2-00.png'),pygame.image.load('adventurer-attack2-01.png'),pygame.image.load('adventurer-attack2-02.png'),pygame.image.load('adventurer-attack2-03.png'),pygame.image.load('adventurer-attack2-04.png'),pygame.image.load('adventurer-attack2-05.png')]
thirdattack = [pygame.image.load('adventurer-attack1-00.png'),pygame.image  .load('adventurer-attack1-01.png'),pygame.image.load('adventurer-attack1-02.png'),pygame.image.load('adventurer-attack1-03.png'), pygame.image.load('adventurer-attack1-04.png')]


falling = [pygame.image.load('adventurer-fall-00.png'), pygame.image.load('adventurer-fall-01.png')]                               

attack = firstattack+secondattack+ thirdattack

run = True
for i in range (20):
    jump1[i] = pygame.transform.scale(jump1[i],(90,90))

for i in range(3):
    run2[i] = pygame.transform.scale(run2[i],(90,90))
    runq = pygame.sprite.Sprite()
    runq.rect = pygame.Rect(40,391,90,90)

for i in range (4): 
    slide1[i] = pygame.transform.scale(slide1[i],(90,90))
for i in range (1):
    falling[i] = pygame.transform.scale(falling[i],(90,90))
for i in range(16):
    attack[i] = pygame.transform.scale(attack[i],(90,90))
imagex = 0
imagex2 = image.get_width()
clock = pygame.time.Clock()



img1 = pygame.image.load('imgg.png')

class obstacles(object):
    global runq,jumpq,enemy
    img = [pygame.image.load('imgg.png'),pygame.image.load('imgg.png')]
    def __init__(self, x,y, width1, height):
        global runq,jumpq,enemy
        self.x = x
        self.y =y
        self.width1 = width1
        self.height = height
        self.hitbox = (x,y,width1,height)
        self.count = 0

        enemy = pygame.sprite.Sprite()
        enemy.rect = pygame.Rect(self.x, self.y, 150, 100)

    def draw(self, window):
        global runq,jumpq,enemy
        if self.count >=1:
            self.count = 0
        self.count +=1
        window.blit(pygame.transform.scale(self.img[self.count], (150,100)), (self.x, self.y))

class player(object):
    def __init__(self, x,y):
        self.vel = 0.5
        self.run1 = True
        self.jump2 = True
        self.slide2 = True
        self.attack1 = True
        self.isJump = False
        self. jumps = True
        self.falling1 = True
        self.player_x = 40
        self.player_y = 391
        self.x = 40
        self.y = 391
        self.width = 391
        self.speed = 0.6
        self.jumpcount = 10
        self.jumpcount1 = 0
        self.runcount = 0
        self.attack2 = 0
        self.slide = 0       
        self.fallspeed = 0.3
        self.falling2 = 0

    def movement(self, window):
        pygame.time.delay(20)
        if self.runcount >= 3:
            self.runcount = 0

        if self.run1 == True:
            window.blit(run2[self.runcount],(int(self.player_x),int(self.player_y)))
            self.runcount +=1

        if keys[pygame.K_DOWN]:
            if self.player_y == 391:
                self.run1 = False
                if self.slide >= 4:
                    self.slide = 0

                if self.slide2:  
                    window.blit(slide1[self.slide],(int(self.player_x),int(self.player_y)))
                    self.slide +=1

        if event.type == pygame.KEYDOWN:
            if (event.key == pygame.K_DOWN )and self.player_y < self.width:
                self.run1 = False
                self.jump2 = False
                self.fallspeed += 0.2

                if self.falling2 >= 1:
                    self.falling2 = 0
                if self.falling1:
                    window.blit(falling[self.falling2], (int(self.player_x),int(self.player_y)))
                    self.falling2 +=1


        if keys[pygame.K_UP]:
            self.fallspeed = 0.3
            self.run1 = False
            if self.jumpcount1 >= 20:
                self.jumpcount1 = 0

            if self.jump2:  
                window.blit(jump1[self.jumpcount1],(int(self.player_x),int(self.player_y)))
                self.jumpcount1 +=1
                self.fallspeed = 0.3

        if keys[pygame.K_p]:
            self.run1 = False
            self.jump2 = False
            self.slide2 = False
            self.falling = False
            if self.attack2 >= 16:
                self.attack2 = 0

            if self.attack1: 
                window.blit(attack[self.attack2],(int(self.player_x),int(self.player_y)))
                self.attack2 += 1
            if keys[pygame.K_DOWN] and keys[pygame.K_UP]:
                self.run1 = False

        if event.type == pygame.KEYUP:
            if event.key == pygame.K_DOWN:
                self.run1 = True
                self.jump2 = True
                self.fallspeed = 0.3

            if event.key == pygame.K_UP:
                self.run1=True
            if event.key == pygame.K_p:
                self.run1 = True
                self.jump2 = True
                self.slide2 = True
                self.falling = True
##        
##class enemy(object):
##    walkright = [pygame.image.load('R1E.png'), pygame.image.load('R2E.png'), pygame.image.load('R3E.png'), pygame.image.load('R4E.png'), pygame.image.load('R5E.png'), pygame.image.load('R6E.png'), pygame.image.load('R7E.png'), pygame.image.load('R8E.png'), pygame.image.load('R9E.png'), pygame.image.load('R10E.png'), pygame.image.load('R11E.png')]
##    walkleft = [pygame.image.load('L1E.png'), pygame.image.load('L2E.png'), pygame.image.load('L3E.png'), pygame.image.load('L4E.png'), pygame.image.load('L5E.png'), pygame.image.load('L6E.png'), pygame.image.load('L7E.png'), pygame.image.load('L8E.png'), pygame.image.load('L9E.png'), pygame.image.load('L10E.png'), pygame.image.load('L11E.png')]
##    for i in range (10):
##        walkright[i] = pygame.transform.scale(walkright[i],(70,70))
##    for i in range(10):
##        walkleft[i] = pygame.transform.scale(walkleft[i],(70,70))
##
##    def __init__(self,enemy_x,enemy_y, end):
##        self.x = enemy_x
##        self.y = enemy_y             
##        self.end = end
##        self.path = [self.x,self.end]
##        self.walkcount = 0
##        self.vel = 3
##    
##    def draw_enemy(self,window):
##        self.move()
##        if self.walkcount+1 >= 33:
##            self.walkcount = 0
##        #walking right
##        if self.vel > 0:
##            window.blit(self.walkright[self.walkcount//3], (self.x,self.y))
##            self.walkcount += 1
##        #walking left
##        else:
##            window.blit(self.walkleft[self.walkcount//3], (self.x,self.y))
##            self.walkcount += 1
##
##    def move(self):
##        if self.vel > 0:
##            #see if position + movement space is < the end, then it is able to move
##            if self.x + self.vel < self.path[1]:
##                self.x += self.vel
##            #past end point and turns 180
##            else:
##                self.vel = self.vel*-1
##                self.walkcount = 0
##        #see if position is smaller than starting position
####        else:
####            if self.x - self.vel < self.path[0]:
####                #vel is already negative
####                self.x += self.vel
####            else:
####               #Truns 180 agian
####               self.vel = self.vel*-1
####               self.walkcount = 0

objects = []

def keepdrawing():
    global enemy
    window.blit(image, (imagex,0))
    window.blit(image, (imagex2,0))
    for object1 in objects:
        object1.draw(window)
    adventurer.movement(window)
##    attacker.draw_enemy(window)
    pygame.display.update()
    if pygame.sprite.collide_rect(runq, enemy) == True:
        print(1)

##enemy = enemy(501,391,540)
adventurer = player(391,40)
pygame.time.set_timer(pygame.USEREVENT+2,random.randrange(2000, 5000))

obj = True

while run:
    clock.tick(60)
    imagex -= 2
    imagex2 -= 2
    if imagex < image.get_width() * -1:
        imagex = image.get_width()
    if imagex2 < image.get_width() * -1:
        imagex2 = image.get_width()

    for event in pygame.event.get():

        if event.type == pygame.QUIT:
            run = False
        if event.type == pygame.USEREVENT+1:
            adventurer.speed += 1
        if event.type == pygame.USEREVENT+2:
            new_obstacle = obstacles(1050,390,64,64)
            objects.append(new_obstacle)

    for object1 in objects:
        object1.x -= 10
        if object1.x < -100:
            objects.pop(objects.index(object1))

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    keys = pygame.key.get_pressed()

    if not(adventurer.isJump):

        if keys[pygame.K_UP]:
            adventurer.isJump =True

    else:

        if adventurer.jumpcount >= -10:
            neg=1
            if adventurer.player_y > adventurer.width:
                adventurer.player_y = adventurer.width
            if adventurer.jumpcount <0:
                neg = -1
##                s(0.01)
            adventurer.player_y -= (adventurer.jumpcount**2)*adventurer.fallspeed*neg
##            s(0.01)
            adventurer.jumpcount -=1
            if adventurer.player_y > adventurer.width:
                adventurer.player_y=adventurer.width

        else:
            adventurer.isJump = False
            adventurer.jumpcount = 10
            if adventurer.player_y > adventurer.width:
                player_y = adventurer.width
                adventurer.fallspeed = 0.3
    keepdrawing()

预期结果应为1

0 个答案:

没有答案