我想编写碰撞代码。我有2个班级,如果它们相撞,其中一个应取消拉动1秒钟
#Laden der Pygame Bibliothek
import pygame
import time
import random
#Initialisierung der Pygame Bibliothek
pygame.init()
# Spiel-Fenster erstellen
size = [700, 500]
screen = pygame.display.set_mode(size)
screen.fill((255,255,255))
# Noetig um die fps zu begrenzen
clock = pygame.time.Clock()
# Speichert ob das Spiel-Fenster geschlossen wurde
done = False
第一类产生只能左右移动的对象
class Schlitten():
def __init__(self, px, py, pscreen):
self.FARBE1 = (139,87,66)
self.FARBE2 = (139,90,43)
self.braun = (104,73,71)
self.x = px
self.grau = (118,122,121)
self.y = py
self.red = (255,0,0)
self.screen = pscreen
self.hit = False
def draw(self):
if self.hit == False:
pygame.draw.rect(self.screen, self.FARBE2, [self.x,self.y,5,75])
pygame.draw.rect(self.screen, self.FARBE2, [self.x+29,self.y,5,75])
pygame.draw.rect(self.screen, self.braun, [self.x+5,self.y+20,24,3])
pygame.draw.rect(self.screen, self.braun, [self.x+5,self.y+55,24,3])
pygame.draw.rect(self.screen, self.FARBE1, [self.x+6,self.y+15,3,50])
pygame.draw.rect(self.screen, self.FARBE1, [self.x+12,self.y+15,3,50])
pygame.draw.rect(self.screen, self.FARBE1, [self.x+18,self.y+15,3,50])
pygame.draw.rect(self.screen, self.FARBE1, [self.x+24,self.y+15,3,50])
pygame.draw.rect(self.screen, self.grau, [self.x+5,self.y+10,24,2])
def kollision(self):
self.hit = True
def movemint(self):
keys = pygame.key.get_pressed()
if keys [pygame.K_LEFT] :
self.x -= 4
if keys [pygame.K_RIGHT] :
self.x += 4
if self.x < 0:
self.x += 4
if self.x > 665:
self.x -= 4
def left(self):
return self.x
def right(self):
return self.x+34
def up(self):
return self.y
def down(self):
return self.y+75
产生从上方来的树的第二类
class Baum():
def __init__(self ,pos_x , pos_y ,pscreen ,pschlitten):
self.green = (0,100,0)
self.braun = (139,69,19)
self.red = (255,0,0)
self.x = pos_x
self.y = pos_y
self.screen = pscreen
self.Schlitten = pschlitten
def draw(self):
pygame.draw.polygon(self.screen ,self.green , [(self.x+50 ,self.y-95),(self.x+0 , self.y-10),
(self.x+100,self.y-10)])
pygame.draw.rect(self.screen , self.braun , [self.x+43,self.y-10,15,30])
pygame.draw.polygon(self.screen , self.green , [(self.x+50 , self.y-95), (self.x+5 , self.y-
25), (self.x+95,self.y-25)])
pygame.draw.polygon(self.screen , self.green , [(self.x+50 , self.y-95), (self.x+10 , self.y-
40), (self.x+90,self.y-40)])
pygame.draw.polygon(self.screen , self.green , [(self.x+50 , self.y-95), (self.x+15, self.y-
53), (self.x+85,self.y-53)])
def bewegung(self):
self.y += 5
def spawn(self):
if self.y > 600:
self.y = -50
self.x = random.randrange(0,700)
这是碰撞,但未完成
def collision(self):
if self.y > 385:
self.Schlitten.hit()
#Objekt der Klasse Schlitten erzeugen
spieler1 = Schlitten(350,400,screen)
Score = score(Baum)
#Objekt der Klasse Baum erzeugen
Baum1 = Baum(500,0 ,screen , spieler1)
Baum2 = Baum(300,-525 , screen , spieler1)
Baum3 = Baum(100,-1050 , screen, spieler1)
schrift = pygame.font.SysFont("comicsans" , 30 , True )
# -------- Haupt-Schleife -----------
while not done:
# Ändert den Wert von done auf True, falls Spiel-Fenster geschlossen wird
for event in pygame.event.get():
if event.type == pygame.QUIT:
done = True
# --- hier Zeichenbefehle ergänzen---
# Screen mit weiß fuellen
screen.fill((255,255,255))
pygame.mixer.music.set_volume(0.1)
Score.anzeigen()
# Schlitten zeichnen
spieler1.draw()
spieler1.movemint()
# Baeume zeichnen
Baum1.draw()
Baum1.bewegung()
Baum1.spawn()
Baum1.collision()
Baum2.draw()
Baum2.bewegung()
Baum2.spawn()
Baum2.collision()
Baum3.draw()
Baum3.bewegung()
Baum3.spawn()
Baum3.collision()
[好,首先是对这些问题的标准回答:如果使用PyGame Sprite函数,则在最初进行一些额外的工作之后,您的程序将更易于编写和维护。
要在任意对象上产生良好的碰撞,首先需要一个“边界框”。这是一个围绕您对象的矩形。
查看Schlitten / Sleigh的代码,我必须根据各种绘图坐标来计算(但是我只是在做快速/粗暴的工作)。从Schlitten.x
和Schlitten.y
看起来,渲染在x
中又扩展了31个像素,在y
中又扩展了75个像素。您可能需要临时添加一些代码来绘制边框以进行检查。
因此,为了定义碰撞函数,我们需要一个PyGame Rect。
class Schlitten:
def __init__( self ):
self.x = px
self.y = py
self.width = 31
self.height = 75
self.rect = pygame.Rect( px, py, self.width, self.height )
您可以从代码中看到,PyGame Rect仅需要坐标。当对象移动时,.rect
将需要更新,但是我们可以在碰撞测试之前立即进行更新。我们添加了self.width
和self.height
,因此我们的代码不会到处都是毫无意义的数字。同样,如果雪橇的图形发生变化,则仅在one位置需要调整这些数字。
无论如何,现在有碰撞功能:
class Schlitten:
...
def collideWith( self, other_rect ):
""" Has the sleigh collided with the other object """
self.rect.x = self.x # update the rect position
self.rect.y = self.y
collision = self.rect.colliderect( other_rect )
return collision
对Baum
类进行类似的更改-至少在代码具有baum.rect
的位置进行。
class Baum():
def __init__( self, pos_x, pos_y, pscreen, pschlitten ):
self.x = pos_x
self.y = pos_y
self.width = 50
self.height = 95
self.rect = pygame.Rect( pos_x, pos_y, self.width, self.height )
def bewegung( self ):
self.y += 5
self.rect.y += 5
def spawn( self ):
if self.y > 600:
self.y = -50
self.x = random.randrange(0,700)
self.rect.x = x
self.rect.y = y
然后这允许代码快速和轻松检查冲突:
alles_baumen = [ Baum1, Baum2, Baum3 ] # all tree objects
# main loop
while not exiting:
...
for baum in alles_baumen: # for each tree
baum.draw()
baum.bewegung()
baum.spawn()
if ( speiler1.collideWith( baum.rect ) ): # player hits tree?
speiler1.kollision() # Oh-noes!
注:如果y
坐标为左下角,则树绘制功能会将树绘制为。我所做的更改没有考虑到这一点,因此请更改绘图代码或更改Baum.rect
的位置以适合此负-y布局。