- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
当 food.rect
和 snake.rect
发生碰撞时,我尝试向我的蛇克隆中的玩家添加一段片段。但是函数内的代码将不会执行。
def add_segment(self,food):
if self.rect.colliderect(food.rect):
snake_segment = Snake(GREEN,RECTANGLE_WIDTH,RECTANGLE_HEIGHT)
self.body.append(snake_segment)
print('this code works!')
如果您需要的话,这是我的其余代码。我已经为这个问题苦苦挣扎了好几天,所以任何帮助将不胜感激!
import pygame,sys,random
from pygame.locals import *
pygame.init()
WINDOW_HEIGHT = 500
WINDOW_WIDTH = 500
RECTANGLE_HEIGHT = 20
RECTANGLE_WIDTH = 20
GREEN = (0,255,0)
WHITE = (255,255,255)
BLACK = (0,0,0)
RED = (255,0,0)
clock = pygame.time.Clock()
SCREEN = pygame.display.set_mode((WINDOW_WIDTH,WINDOW_HEIGHT))
pygame.display.set_caption("Snake")
class Snake(object):
def __init__(self, color, width, height):
self.body = []
self.image = pygame.Surface((width,height))
self.image.fill(GREEN)
self.rect = self.image.get_rect()
self.speed = 20
self.direction = 'right'
self.body = []
self.living = True
self.move = (0,0)
def movement(self):
self.rect.move_ip(self.move)
self.rect.clamp_ip(SCREEN.get_rect())
def blit(self):
SCREEN.blit(self.image,self.rect)
def update(self,food):
self.add_segment(food)
self.draw_snake()
self.movement()
print(self.rect.colliderect(food.rect))
print(self.body)
def add_segment(self,food):
if self.rect.colliderect(food.rect):
snake_segment = Snake(GREEN,RECTANGLE_WIDTH,RECTANGLE_HEIGHT)
self.body.append(snake_segment)
print('this code works!')
def draw_snake(self):
if len(self.body) == 0:
self.blit()
elif len(self.body) >= 1:
for snake_segment in self.body:
snake_segment.blit()
class Food(object):
def __init__(self,color,width,height):
self.image = pygame.Surface((width,height))
self.image.fill(RED)
self.rect = self.image.get_rect()
self.rect.x = random.randrange(20,500,20)
self.rect.y = random.randrange(20,500,20)
self.state = 'uneaten'
def check_eaten(self,snake):
if snake.rect.colliderect(self.rect):
self.state = 'eaten'
def blit(self):
SCREEN.blit(self.image,self.rect)
def update_state(self,snake):
self.check_eaten(snake)
if self.state == 'uneaten':
self.blit()
elif self.state == 'eaten':
self.rect.x = random.randrange(0,500,20)
self.rect.y = random.randrange(0,500,20)
if self.rect.x == snake.rect.x or self.rect.x == snake.rect.y:
self.rect.x = random.randrange(0,500,20)
self.rect.y = random.randrange(0,500,20)
self.blit()
self.state = 'uneaten'
def update(self,snake):
self.update_state(snake)
print(self.state)
def event_loop(snake,food):
while True:
SCREEN.fill(BLACK)
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
elif event.type == KEYDOWN:
if event.key == K_RIGHT:
snake.move = (snake.speed,0)
snake.direction = 'right'
elif event.key == K_LEFT:
snake.move = (-snake.speed,0)
snake.direction = 'left'
elif event.key == K_UP:
snake.move = (0,-snake.speed)
snake.direction = 'up'
elif event.key == K_DOWN:
snake.move = (0,snake.speed)
snake.direction = 'down'
food.update(snake)
snake.update(food)
pygame.display.update()
clock.tick(5)
SNAKE = Snake(GREEN,RECTANGLE_WIDTH,RECTANGLE_HEIGHT)
FOOD = Food(RED,RECTANGLE_WIDTH,RECTANGLE_HEIGHT)
event_loop(SNAKE,FOOD)
最佳答案
这都是顺序问题。
food.update(snake)
测试食物是否与摇晃发生碰撞并将食物放置在新位置。snake.update(food)
测试是蛇与食物碰撞并向蛇追加一段。
所以如果food.update(snake)
在snake.update(food)
之前执行,那么蛇永远不会吃食物,因为食物被移走了之前:
food.update(snake)
snake.update(food)
snake.update(food)
food.update(snake)
蛇永远不会处于绘制的位置,因为蛇是在移动 self.movement()
之前绘制的 self.draw_snake()
。
您必须按以下顺序进行操作:
class Snake(object):
# [...]
def update(self,food):
self.movement()
self.add_segment(food)
self.draw_snake()
关于python - pygame.Rect.colliderect() 函数未执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55008171/
我正在制作一款经典的贪吃蛇游戏。我想绘制一个绿色矩形 (green_rect),每当我的蛇接触到它时,该绿色矩形就会移动到一个新的随机位置。当我在蠕虫的表面上运行colliderect()时,由于某种
Pygame 出现问题! Colliderect 函数无法检测两个矩形何时发生碰撞!尽管没有给出错误消息,但这些矩形只是相互穿过。这是为什么?如何解决?连续几天都在为同样的问题苦苦挣扎!假设的问题点标
谢谢 BlackJack,这是包含您的建议的代码。玩家图像仅停留在左上角 (0,0)。图像在运行者数组中循环,但按左或右不会使玩家 Sprite 移动到背景图像的边缘,或移动背景图像和 block 。
在此之前,我使用代码表示“每个按钮按下它都会移动”,但现在我已将其更改为“当您按下按钮时,它会朝一个方向移动,直到收到进一步的指示”,但现在碰撞器不起作用。它以前有效,我对 pygame 还是个新手。
当 food.rect 和 snake.rect 发生碰撞时,我尝试向我的蛇克隆中的玩家添加一段片段。但是函数内的代码将不会执行。 def add_segment(self,food): if
假设我有 2 个命中框:hbox1 和 hbox2。做 hbox1.colliderect(hbox2) 和 hbox2.colliderect(hbox1) 总是返回相同的东西? 最佳答案 方法 c
我正在尝试在 Pygame 中创建一个工作跳跃系统,但我在碰撞检测方面遇到了一些问题。我有一个级别存储在这样的列表中: level = [ "WWWWWWWWWWWWWWWWWWWW", "W
编辑:QuadTrees ( http://www.pygame.org/wiki/QuadTree?parent=CookBook ) 可能是我在这里的答案,我会尝试这个并会报告回来。无论如何请不要
我正在尝试制作一个小型的无尽奔跑者并完成了大部分工作,唯一剩下的就是碰撞检测。我知道 () 函数,但无法让它工作。我可能只是做错了,但我不知道如何解决它。 现在我有一个像这样的玩家类: class P
colliderect()函数不会返回 True和 False ;相反,它返回 0和 1 .当我使用函数类型时,它说 int而不是 bool .如果我使用 0 编码和 1代码工作而不是 bool 值,
我是一名优秀的程序员,十分优秀!