python - Rect Errors on Pygame -
hi have been creating game player has dodge oil barrels , have been working on getting rect can create when 2 sprites collide. seems collision boxes messed because whenever start game automatically detect collision between player , barrel.
this code:
import pygame import os import time import sys import pyganim import random global rand threading import thread class updatethread(thread): def __init__(self): self.stopped = false thread.__init__(self) def run(self): while not self.stopped: self.downloadvalue() time.sleep(2) def downloadvalue(self): rand=random.randrange(1, 10) class oil(object): def __init__(self): self.image = pygame.image.load('oil.png') self.image = pygame.transform.scale(self.image,(300,300)) self.rect = self.image.get_rect() self.x = 1600 self.y = 400 def handle_keys(self): key = pygame.key.get_pressed() distance = 10 self.x -= distance def draw(self, surface): surface.blit(self.image, (self.x, self.y)) def checkcollision(self, oil, sprite): col = sprite.colliderect(oil) if col == true: print ("gameover") def blit_alpha(target, source, location, opacity): x = location[0] y = location[1] temp = pygame.surface((source.get_width(), source.get_height())).convert() temp.blit(target, (-x, -y)) temp.blit(source, (0, 0)) temp.set_alpha() target.blit(temp, location) class sprite(object): def __init__(self): self.image = pygame.image.load('image1.png') self.rect = self.image.get_rect() self.x = 0 self.y = 0 def handle_keys(self): key = pygame.key.get_pressed() distance = 10 if key[pygame.k_down]: self.y += distance if key[pygame.k_up]: self.y -= distance if key[pygame.k_right]: self.x += distance if key[pygame.k_left]: self.x -= distance def draw(self, surface): #surface.blit(self.image, (self.x, self.y)) anim.blit(surface, (self.x, self.y)) anim = pyganim.pyganimation([("image1.png", 0.5), ("image2.png", 0.5)]) pygame.init() screen = pygame.display.set_mode((1600, 800)) oil=oil() sprite=sprite() clock = pygame.time.clock() backgroundo= pygame.image.load('background.png') background = pygame.transform.scale(backgroundo, (1600, 800)) anim.play() mythread = updatethread() mythread.start() oil.checkcollision(oil.rect,sprite.rect) while true: event in pygame.event.get(): if event.type == pygame.quit: pygame.quit() running = false sprite.handle_keys() oil.handle_keys() screen.fill((255,255,255)) blit_alpha(screen, background, (0, 0), 128) sprite.draw(screen) oil.draw(screen) pygame.display.update() clock.tick(30)
any appreciated.
since oil
, sprite
classes aren't derived pygame.rect
class, believe need testing collisions between them this:
def checkcollision(self, sprite): if self.rect.colliderect(sprite.rect): print ("gameover")
and should called this:
oil.checkcollision(sprite)
instead of have:
oil.checkcollision(oil.rect, sprite.rect)
in object-oriented programming called "has_a" relationship between classes verses "is_a" relationship 1 gets through subclassing or deriving class.
btw, according pep 8 - style guide python code, strongly recommend follow, 2 classnames should have been capitalized, , named oil
, sprite
respectively.
Comments
Post a Comment