Habib Ismail
Habib Ismail

Reputation: 47

Projectiles Wont Turn Into An Image Error How To Fix?

I have my projectile class here and when I try to turn it into an image it doesn't work idk why I have tried doing this V

class projectile(object):
    def __init__(self,x,y,radius,color):
        self.x = x
        self.y = y
        self.radius = radius
        self.color = color
        self.toxic = pygame.image.load("toxic.png")
        self.speed = 10
    def draw(self,win):
        pygame.draw.circle(win, self.color, (self.x,self.y), self.radius)
window.blit(win, self.color, (self.x,self.y), self.radius)

and also I tried this

window.blit(self.toxics, (self.color, (self.x,self.y)), self.radius)

I am getting this error and idk how to fix it

  File "C:\Users\Habib\Desktop\PYTHONGGAME\py.py", line 58, in draw
    window.blit(self.toxics, (self.color, (self.x,self.y)), self.radius)
TypeError: invalid destination position for blit

my full code

import pygame
pygame.init()

window = pygame.display.set_mode((500,500))
pygame.display.set_caption("Game")

plat = pygame.image.load("gt.png")
coinss = pygame.image.load("coin_gold.png")
slash1 = pygame.image.load("slash.png")

lefts = [pygame.image.load("Sprite-0001.png"),
        pygame.image.load("Sprite-0002.png"),
        pygame.image.load("Sprite-0003.png"),
        pygame.image.load("Sprite-0004.png"),
        pygame.image.load("Sprite-0005.png"),
        pygame.image.load("Sprite-0006.png"),
        pygame.image.load("Sprite-0007.png"),
        pygame.image.load("Sprite-0008.png"),
        pygame.image.load("Sprite-0009.png")

         ]
toxics = pygame.image.load("toxic.png")

stand = pygame.image.load("stands.png")


rights = [pygame.image.load("Sprite-50.png"),
         pygame.image.load("Sprite-51.png"),
         pygame.image.load("Sprite-52.png"),
         pygame.image.load("Sprite-53.png"),
         pygame.image.load("Sprite-54.png"),
         pygame.image.load("Sprite-55.png"),
         pygame.image.load("Sprite-56.png"),
         pygame.image.load("Sprite-57.png"),
         pygame.image.load("Sprite-58.png")


         ]

right = [
            pygame.image.load("enemy.png"),
            pygame.image.load("enemys1.png"),
             pygame.image.load("enemys2.png"),
             pygame.image.load("enemys3.png"),
             pygame.image.load("enemys4.png"),
             pygame.image.load("enemys5.png")
            ]

class projectile(object):
    def __init__(self,x,y,radius,color):
        self.x = x
        self.y = y
        self.radius = radius
        self.color = color
        self.toxics = pygame.image.load("toxic.png")
        self.speed = 10
    def draw(self,win):
        window.blit(window, self.color, (self.x,self.y), self.radius)



# the enemy
class enes:
    def __init__(self,x,y,width,height,end):
        self.right = [
             pygame.image.load("enemy.png"),
             pygame.image.load("enemys1.png"),
             pygame.image.load("enemys2.png"),
             pygame.image.load("enemys3.png"),
             pygame.image.load("enemys4.png"),
             pygame.image.load("enemys5.png")]
        self.right = [pygame.transform.scale(image,(image.get_width()*4,image.get_height()*4)) for image in self.right]
        self.x = x
        self.y = y
        self.height = height
        self.path = [x,end]
        self.walkCount = 0
        self.walk_so = 0
        self.so_walk = 0
        self.speed = 3
    def draw(self,window):
        self.move()
        if self.walkCount + 1 >= 33:
            self.walkCount = 0
        if self.speed > 0:
            window.blit(self.right[self.so_walk//3], (self.x,self.y))
            self.walkCount += 1
        else:
            window.blit(self.right[self.so_walk//3],(self.x,self.y))
            self.walkCount += 1
    def move(self):
        if self.speed > 0:  
            if self.x < self.path[1] + self.speed: 
                self.x += self.speed
            else:
                self.speed = self.speed * -1
                self.x += self.speed
                self.walkCount = 0
        else: 
            if self.x > self.path[0] - self.speed: 
                self.x += self.speed
            else:  
                self.speed = self.speed * -1
                self.x += self.speed
                self.walkCount = 0
    def hitbox(self):
        print('hit')
goblin = enes(100,280,64,64,200)
goby = [goblin]



# color for enems
green = (63, 190, 22)
enems1 = enes(350,259,50,50, green)
florida = [enems1]

# player class

class player:
    def __init__(self,x,y,height,width,color):
        self.x = x
        self.y = y
        self.height  = height
        self.width = width
        self.speed = 5
        self.isJump = False
        self.JumpCount = 10
        self.fall = 0
        #hit box
        self.hitbox = (self.x + 20, self.y, 28, 60)
        self.stand = pygame.image.load("stands.png")
        self.lefts = [
        pygame.image.load("Sprite-0001.png"),
        pygame.image.load("Sprite-0002.png"),
        pygame.image.load("Sprite-0003.png"),
        pygame.image.load("Sprite-0004.png"),
        pygame.image.load("Sprite-0005.png"),
        pygame.image.load("Sprite-0006.png"),
        pygame.image.load("Sprite-0007.png"),
        pygame.image.load("Sprite-0008.png"),
        pygame.image.load("Sprite-0009.png")
         ]
        self.rights = [
        pygame.image.load("Sprite-50.png"),
         pygame.image.load("Sprite-51.png"),
         pygame.image.load("Sprite-52.png"),
         pygame.image.load("Sprite-53.png"),
         pygame.image.load("Sprite-54.png"),
         pygame.image.load("Sprite-55.png"),
         pygame.image.load("Sprite-56.png"),
         pygame.image.load("Sprite-57.png"),
         pygame.image.load("Sprite-58.png")
         ]
        self.rights = [pygame.transform.scale(image,(image.get_width()*4,image.get_height()*4)) for image in self.rights]
        self.lefts = [pygame.transform.scale(image,(image.get_width()*4,image.get_height()*4)) for image in self.lefts]
        self.stand = pygame.transform.scale(self.stand,(self.stand.get_width()*4,self.stand.get_height()*4))
        self.bo_index = 0
        self.start_time = pygame.time.get_ticks()
        self.anim_fps = 400
        self.anim_index = 0
        self.stans_index = 0
        self.direction = "right"
        self.direction = "left"
        self.direction = "standing"

        self.rect = pygame.rect = pygame.Rect(self.x,self.y,width, height)
    def draw(self):
        self.rect.topleft = (self.x,self.y)

        if self.direction == "left":
             player_image = self.lefts[self.anim_index]
             self.anim_index += 1
             if self.anim_index == len(self.lefts):
                 self.anim_index = 0
        elif self.direction == "right":
            player_image = self.rights[self.anim_index]
            self.anim_index += 1
            if self.anim_index == len(self.rights):
                self.anim_index = 0
        else:
            player_image = self.stand

        player_rect = player_image.get_rect(center = self.rect.center) 
        player_rect.centerx += 10 # 10 is just an example
        player_rect.centery += -20 # 15 is just an example
        window.blit(player_image, player_rect)





# platforms
class platform:
    def __init__(self,x,y,height,width,color):
        self.x = x
        self.y = y
        self.height = height
        self.width = width
        self.color = color
        self.plat = pygame.image.load("gt.png")
        self.rect = pygame.Rect(x,y,plat.get_width(), plat.get_height())
        self.plat = pygame.transform.scale(self.plat,(self.plat.get_width()//2,self.plat.get_height()//2))
        self.rect = pygame.Rect(x,y,height,width)
    def draw(self):
        self.rect.topleft = (self.x,self.y)
        window.blit(self.plat,self.rect)

# Coins
class coin:
    def __init__(self,x,y,height,width,color):
        self.x = x
        self.y = y
        self.height = height
        self.width = width
        self.coinss = pygame.image.load("coin_gold.png")
        self.rect = pygame.Rect(x,y,coinss.get_width(), coinss.get_height())
        self.plat = pygame.transform.scale(self.coinss,(self.coinss.get_width()//2,self.coinss.get_height()//2))
        self.color = color
        self.rect = pygame.Rect(x,y,height,width)
    def draw(self):
        self.rect.topleft = (self.x,self.y)
        window.blit(self.coinss,self.rect)


# Floor
class floor:
    def __init__(self,x,y,height,width,color):
        self.x = x
        self.y = y
        self.height = height
        self.width = width
        self.color = color
        self.rect = pygame.Rect(x,y,height,width)
    def draw(self):
        self.rect.topleft = (self.x,self.y)
        pygame.draw.rect(window,self.color,self.rect)


font = pygame.font.Font('freesansbold.ttf', 30)
score = 0
text = font.render('Gold  = ' + str(score), True, (255,255,255))
textRect = text.get_rect()  
textRect.center = (100, 40)

# enemy
Sfont = pygame.font.Font('freesansbold.ttf', 30)
Kills = 0
Stext = Sfont.render('Kills  = ' + str(score), True, (255,255,255))
textRectS = Stext.get_rect()  
textRectS.center = (400, 100)


# fps
FPS = 60
clock = pygame.time.Clock()

# colors
Green = (63, 190, 22)
Blue = (22, 190, 175)
white = (240, 240, 240)

# define the enemy player coin classes
playerman = player(150,350,30,30, Blue)
enemy1 = platform(150,390,190,10, Green)
enemy2 = platform(300,310,190,10, Green)
enemy3 = platform(80,260,190,10, Green)
enemy4 = platform(250,180,190,10, Green)
enemy5 = platform(490,120,190,10, Green)
enemy6 = platform(-50,100,190,10, Green)
enemy7 = platform(180,50,190,10, Green)
platforms = [enemy1,enemy2,enemy3,enemy4,enemy5,enemy6,enemy7]

# coin class
coin1 = coin(180,320,150,150, Green)
coin2 = coin(350,250,50,50, Green)
coin3 = coin(150,200,50,50, Green)


Coins_list = [coin1,coin2,coin3]

# floor class
floor1 = floor(-1000,490,9999,50, white)
flories = [floor1]
# shoot the enmey loop
shootLoop = 0
if shootLoop > 0:
    shootLoop += 1
if shootLoop > 3:
    shootLoop = 0
#main loop
bullets = []
runninggame = True
while runninggame:
    clock.tick(FPS)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            runninggame = False


    if playerman.y < 250:
        playerman.y += 1
        for platform in platforms:
            platform.y += playerman.speed
        for coin in Coins_list:
            coin.y += playerman.speed
        for floor in flories:
            floor.y += playerman.speed
        for enes in goby:
            enes.y += playerman.speed






    if playerman.y > 450:

        playerman.y -= playerman.fall
        for platform in platforms:
            platform.y -= playerman.fall
        for coin in Coins_list:
            coin.y -= playerman.fall
        for floor in flories:
            floor.y -= playerman.fall
        for enes in goby:
            enes.y -= playerman.fall




    keys = pygame.key.get_pressed()
    playerman.direction = "standing"

    if keys[pygame.K_a] and shootLoop == 0:     
        for bullet in bullets:
            if bullet.x < 500 and bullet.x > 0:
                bullet.x += bullet.speed 
            else:
                bullets.pop(bullets.index(bullet))
        if len(bullets) < 2:  
            bullets.append(projectile(round(playerman.x+playerman.width//2), round(playerman.y + playerman.height//2), 6, (0,0,0)))
    if keys[pygame.K_d] and shootLoop == 0:     
        for bullet in bullets:
            if bullet.x < 500 and bullet.x > 0:
                bullet.x -= bullet.speed 
            else:
                bullets.pop(bullets.index(bullet))
        if len(bullets) < 2:  
            bullets.append(projectile(round(playerman.x+playerman.width//2), round(playerman.y + playerman.height//2), 6, (0,0,0)))





    if keys[pygame.K_LEFT]:
        playerman.direction = "right"
        playerman.x -= playerman.speed
        if playerman.x < 100:
            playerman.x += playerman.speed
            for platform in platforms:
                platform.x += playerman.speed
            for coin in Coins_list:
                coin.x += playerman.speed
            for enes in goby:
                enes.x += playerman.speed


    if keys[pygame.K_RIGHT]:
        playerman.direction = "left"
        playerman.x += playerman.speed
        if playerman.x > 400:
            playerman.x -= playerman.speed
            for platform in platforms:
                platform.x -= playerman.speed
            for coin in Coins_list:
                coin.x -= playerman.speed
            for enes in goby:
                enes.x -= playerman.speed




    if not playerman.isJump:
        playerman.y += playerman.fall
        playerman.fall += 1
        playerman.isJump = False
        collide = False
        for platform in platforms:
            if playerman.rect.colliderect(platform.rect):
                collide = True
                playerman.isJump = False
                playerman.y = platform.rect.top - playerman.height + 1
                if playerman.rect.right > platform.rect.left and playerman.rect.left < platform.rect.left - playerman.width:
                    playerman.x = platform.rect.left - playerman.width
                if playerman.rect.left < platform.rect.right and playerman.rect.right > platform.rect.right + playerman.width:
                    playerman.x = platform.rect.right


            for i in range(len(Coins_list)-1,-1,-1):
                if playerman.rect.colliderect(Coins_list[i].rect):
                    del Coins_list[i]
                    score += 1
                    text = font.render('Score = ' + str(score), True, (255,255,255))
                    textRect = text.get_rect()  
                    textRect.center = (100, 40)





        for floor in flories:
            if playerman.rect.colliderect(floor.rect):
                collide = True
                playerman.isJump = False
                playerman.y = floor.rect.top - playerman.height + 1
                if playerman.rect.right > floor.rect.left and playerman.rect.left < floor.rect.left - playerman.width:
                    playerman.x = floor.rect.left - playerman.width
                if playerman.rect.left < floor.rect.right and playerman.rect.right > floor.rect.right + playerman.width:
                    playerman.x = floor.rect.right





            if playerman.rect.bottom >= 490:
                collide = True
                playerman.isJump = False
                playerman.JumpCount = 10
                playerman.y = 490 - playerman.height

            if collide:
                if keys[pygame.K_UP]:
                    playerman.isJump = True
                playerman.fall = 0


    else:
        if playerman.JumpCount > 0:
            playerman.y -= (playerman.JumpCount*abs(playerman.JumpCount))*0.3
            playerman.JumpCount -= 1
        else:
            playerman.JumpCount = 10
            playerman.isJump = False

    window.fill((74, 107, 104))
    goblin.draw(window)
    window.blit(Stext,textRectS)
    for bullet in bullets:
        bullet.draw(window)
    window.blit(text,textRect)
    for platform in platforms:
        platform.draw()
    for coin in Coins_list:
        coin.draw()
    playerman.draw()
    for floor in flories:
        floor.draw()



    pygame.display.update()
pygame.quit()
















Upvotes: 1

Views: 36

Answers (1)

Kingsley
Kingsley

Reputation: 14916

Basically your calls to blit() have the wrong arguments.

From the manual:

pygame.Surface.blit

draw one image onto another
blit(source, dest, area=None, special_flags=0) -> Rect

Draws a source Surface onto this Surface. The draw can be positioned with the dest argument. Dest can either be pair of coordinates representing the upper left corner of the source. A Rect can also be passed as the destination and the topleft corner of the rectangle will be used as the position for the blit. The size of the destination rectangle does not effect the blit.

It's probably best to keep your co-ordinates in a pygame Rect, and also use these for the blit destination.

class projectile(object):
    def __init__(self, x, y):
        self.toxic = pygame.image.load("toxic.png")
        self.rect  = self.toxic.get_rect()
        self.rect.topleft = ( x, y )
        self.speed = 10

    def draw(self, window):
        window.blit( self.toxic, self.rect )

    def moveTo(self, x, y):
        self.rect.topleft = ( x, y )

Upvotes: 2

Related Questions