2017-03-14 19 views
0

私は現在、プロジェクト用のゲームを作成する必要があるAレベルのコンピュータサイエンスコースを受講しています。私はこのコードがおそらく効率的ではないことを知っていますが、私はそれを自分の仕事にとどめようとしており、私が混乱している1ビットの手が欲しいです。pygame.sprite.collision正しい位置で実行されていません

このコードは現在、ロボットとプラットフォーム用のスプライトを作成しています。このコードは、2つの間の衝突を解決しようとしています。現時点では、ロボットのトップがプラットフォームの底面に接触したときにのみ衝突しますが、その時点では画面上には表示されません。衝突が機能していますが、現在使用されている矩形のが紛失しなければならないか、または

任意のアイデアやヘルプを働いていない

いただければ幸いです。

import pygame as pg 
import time 
import random 

pg.init()#initiates pygame 

display_height = 690#Creates width and height of screen 
display_width = 1024 
#Colours 
white = (255,255,255) 
black = (0,0,0) 
red = (255,0,0) 
green = (0,255,0) 
blue = (0,0,255) 
sky = (73,71,65) # grey 

Robot_height = 100#Height of robot 
Robot_width = 112 #Width of robot 
lives = 3 #Robot Lives 
Bullet_Fired = False 
PowerUp_Active = False 
Robot_acc = 0.3 #Robot Acceleration 
vec = pg.math.Vector2 

gameDisplay = pg.display.set_mode((display_width,display_height)) #Sets display properties of window 
pg.display.set_caption ("Game") #Title on window 
clock = pg.time.Clock() 
robotImg = pg.image.load("robot1.png") #Loads robots image 

#Class for platforms 
class Platform(pg.sprite.Sprite): 
    def __init__(self, x,y,w,h): 
     pg.sprite.Sprite.__init__(self) 
     self.image = pg.Surface((w,h)) 
     self.image.fill(blue) 
     self.rect = self.image.get_rect() 
     self.rect.x = x 
     self.rect.y = y 

#class for robot 
class RobotClass(pg.sprite.Sprite): 
    def __init__(self): 
     pg.sprite.Sprite.__init__(self) 
     self.image = pg.Surface((Robot_width,Robot_height)) 
     self.rect = self.image.get_rect() 
     self.rect.center = (display_width/2, display_height/2) 
     self.RobotPos = vec(display_width/2, display_height/2) 
     self.bottom = (0,0) 
     self.vel = vec(0, 0) 
     self.acc = vec(0, 0.005) 

#creates platform 1 
p1 = Platform(0,display_height - 40,display_width,40) 

#creates a sprite group for platforms 
platforms = pg.sprite.Group() 
#Adds platform 1 
platforms.add(p1) 

#game loop 
def game_loop(): 
    Robot = RobotClass() 
    Robot_friction = -0.3 #Friction value 
    vec = pg.math.Vector2 #Setting vec as vector quantity 
    while True: 
     for event in pg.event.get(): 
      if event.type == pg.QUIT: 
       pg.quit 
       quit() 
      #Starts acceleration when key is pressed 
      if event.type == pg.KEYDOWN: 
       if event.key == pg.K_LEFT: 
        Robot.acc.x = -Robot_acc 
       elif event.key == pg.K_RIGHT: 
        Robot.acc.x = Robot_acc 
      #Adds friction to accleration to slow robot down when key is not being pressed 
      if event.type == pg.KEYUP: 
       if event.key == pg.K_LEFT or event.key == pg.K_RIGHT: 
        Robot.acc.x = Robot.acc.x * Robot_friction 

     #Adjusts velocity of robot by adding the acceleration on each cycle 
     Robot.vel = Robot.vel+ Robot.acc 
     #Fills background 
     gameDisplay.fill(sky) 
     #Draws the platform p1 to the screen 
     pg.draw.rect(gameDisplay, blue, (p1)) 
     #Changes Robot position according to its velocity,acceleration and the friction 
     Robot.RobotPos = Robot.RobotPos + Robot.vel + 0.5 * Robot.acc 
     #Loads robot onto screen 
     gameDisplay.blit(robotImg,(Robot.RobotPos)) 
     #Updates display 
     pg.display.update() 
     clock.tick(60) 

     #Sets bottom of robot to its position 
     Robot.rect.midbottom = Robot.RobotPos 

     #Collision detection 
     hits = pg.sprite.spritecollide(Robot , platforms, False) 
     if hits: 
      print ("Collision") 
      #Puts Robot on top of platform 
      Robot.RobotPos.y = hits[0].rect.top + 1 
      Robot.vel.y = 0 

     #Sets top velocity of robot  
     if Robot.vel.x > 6: 
      Robot.vel.x = 6 
     if Robot.vel.x < -6: 
      Robot.vel.x = -6 
     #Makes robot velocity = 0 when it is close to 0 
     if Robot.vel.x < 0.05 and Robot.vel.x > -0.05: 
      Robot.acc.x = 0 
      Robot.vel.x = 0 


game_loop() 
pg.quit() 
quit()  
+0

変数名に関しては、関数、変数、インスタンス、および属性には、小文字の名前にアンダースコア(snake_case)を付ける必要があります。アッパーとキャメルケースはクラス用です。 – skrx

+0

http://codereview.stackexchange.com/をご覧ください。 – skrx

答えて

0

ロボットの四角形を描くと、間違っていることがわかります。

pg.draw.rect(gameDisplay, red, Robot.rect, 2) 

イメージを間違った位置でブリッティングしています。 Robot.RobotPosは、Robot.rect.midbottom = Robot.RobotPosを実行しているため、rectのmidbottom posです。代わりにgameDisplay.blit(Robot.image, Robot.rect)のrectのtopleft位置でイメージをblitします。矩形とイメージのサイズが異なる場合は、blitの位置を調整する必要があります。

+1

ありがとうございました。実際には画像のサイズを調整するだけです。手伝ってくれてありがとう :) –

関連する問題