为什么在实现滚动时 "move 5 - if touching wall - move back 5" 逻辑不起作用?
Why does the "move 5 - if touching wall - move back 5" logic not work when scrolling is implemented?
我知道这种墙壁检测逻辑在大多数游戏中都能正常工作,但我想要更多的活力。所以,我实现了滚动,玩家总是在中间,背景移动。
keys=pygame.key.get_pressed()
if keys[pygame.K_w]:
y-=5
if rect.colliderect(wall):
y+=5
我的滚动工作方式是所有对象都是相对于变量 scrollx
和 scrolly
绘制的。按下按键时,scrollx
或 scrolly
会发生变化。但是,当碰撞实际发生时,玩家似乎会卡在物体中。这是完整的代码。
import pygame
import random
pygame.init()
win_height=600
win_width=600
win=pygame.display.set_mode((win_width,win_height))
pygame.display.set_caption("YourCraft")
white=(255,255,255)
black=(0,0,0)
green=(0,255,0)
clock=pygame.time.Clock()
debris_list=[]
player=pygame.Rect(win_width/2,win_height/2,20,20)
scrolly=0
scrollx=0
size=1000
speed=5
class debris_class():
def __init__(self):
self.x=random.randrange(0,size-20)
self.y=random.randrange(0,size-20)
self.rect=pygame.Rect(self.x,self.y,20,20)
def update(self):
pygame.draw.rect(win,white,self.rect)
self.rect.y=scrolly+self.y
self.rect.x=scrollx+self.x
for i in range(10):
debris=debris_class()
debris_list.append(debris)
def collision():
for i in debris_list:
if i.rect.colliderect(player):
return 1
return 0
while True:
clock.tick(60)
for event in pygame.event.get():
if event.type==pygame.QUIT:
pygame.quit()
key=pygame.key.get_pressed()
if key[pygame.K_s]:
scrolly-=speed
collide=collision()
if collide==1:
scrolly+=speed
if key[pygame.K_w]:
scrolly+=speed
collide=collision()
if collide==1:
scrolly-=speed
if key[pygame.K_d]:
scrollx-=speed
collide=collision()
if collide==1:
scrollx+=speed
if key[pygame.K_a]:
scrollx+=speed
collide=collision()
if collide==1:
scrollx-=speed
win.fill(black)
pygame.draw.rect(win,green,(scrollx,scrolly,size,size)) #background
pygame.draw.rect(win,white,player)
for i in debris_list:
i.update()
pygame.display.update()
您执行碰撞测试太早了。当碰撞测试为运行时,物体和地图还没有滚动
将update
和draw
分开class debris_class
:
class debris_class():
def __init__(self):
self.x=random.randrange(0,size-20)
self.y=random.randrange(0,size-20)
self.rect=pygame.Rect(self.x,self.y,20,20)
def update(self):
self.rect.y=scrolly+self.y
self.rect.x=scrollx+self.x
def draw(self):
pygame.draw.rect(win,white,self.rect)
根据按下的键和速度获取移动:
key=pygame.key.get_pressed()
move_x = (key[pygame.K_d] - key[pygame.K_a]) * speed
move_y = (key[pygame.K_s] - key[pygame.K_w]) * speed
复制plyer并移动播放器:
player_copy = player.copy()
player.x += move_x
player.y += move_y
执行碰撞测试并撤消玩家的移动:
collide = collision()
player = player_copy
如果没有检测到碰撞,滚动地图和对象:
if collide == 0:
scrollx -= move_x
scrolly -= move_y
for i in debris_list:
i.update()
循环绘制对象:
for i in debris_list:
i.draw()
完整代码:
import pygame
import random
pygame.init()
win_height=600
win_width=600
win=pygame.display.set_mode((win_width,win_height))
pygame.display.set_caption("YourCraft")
white=(255,255,255)
black=(0,0,0)
green=(0,255,0)
clock=pygame.time.Clock()
debris_list=[]
player=pygame.Rect(win_width/2,win_height/2,20,20)
scrolly=0
scrollx=0
size=1000
speed=5
class debris_class():
def __init__(self):
self.x=random.randrange(0,size-20)
self.y=random.randrange(0,size-20)
self.rect=pygame.Rect(self.x,self.y,20,20)
def update(self):
self.rect.y=scrolly+self.y
self.rect.x=scrollx+self.x
def draw(self):
pygame.draw.rect(win,white,self.rect)
for i in range(10):
debris=debris_class()
debris_list.append(debris)
def collision():
for i in debris_list:
if i.rect.colliderect(player):
return 1
return 0
while True:
clock.tick(60)
for event in pygame.event.get():
if event.type==pygame.QUIT:
pygame.quit()
key=pygame.key.get_pressed()
move_x = (key[pygame.K_d] - key[pygame.K_a]) * speed
move_y = (key[pygame.K_s] - key[pygame.K_w]) * speed
player_copy = player.copy()
player.x += move_x
player.y += move_y
collide = collision()
player = player_copy
if collide == 0:
scrollx -= move_x
scrolly -= move_y
for i in debris_list:
i.update()
win.fill(black)
pygame.draw.rect(win,green,(scrollx,scrolly,size,size)) #background
pygame.draw.rect(win,white,player)
for i in debris_list:
i.draw()
pygame.display.update()
我知道这种墙壁检测逻辑在大多数游戏中都能正常工作,但我想要更多的活力。所以,我实现了滚动,玩家总是在中间,背景移动。
keys=pygame.key.get_pressed()
if keys[pygame.K_w]:
y-=5
if rect.colliderect(wall):
y+=5
我的滚动工作方式是所有对象都是相对于变量 scrollx
和 scrolly
绘制的。按下按键时,scrollx
或 scrolly
会发生变化。但是,当碰撞实际发生时,玩家似乎会卡在物体中。这是完整的代码。
import pygame
import random
pygame.init()
win_height=600
win_width=600
win=pygame.display.set_mode((win_width,win_height))
pygame.display.set_caption("YourCraft")
white=(255,255,255)
black=(0,0,0)
green=(0,255,0)
clock=pygame.time.Clock()
debris_list=[]
player=pygame.Rect(win_width/2,win_height/2,20,20)
scrolly=0
scrollx=0
size=1000
speed=5
class debris_class():
def __init__(self):
self.x=random.randrange(0,size-20)
self.y=random.randrange(0,size-20)
self.rect=pygame.Rect(self.x,self.y,20,20)
def update(self):
pygame.draw.rect(win,white,self.rect)
self.rect.y=scrolly+self.y
self.rect.x=scrollx+self.x
for i in range(10):
debris=debris_class()
debris_list.append(debris)
def collision():
for i in debris_list:
if i.rect.colliderect(player):
return 1
return 0
while True:
clock.tick(60)
for event in pygame.event.get():
if event.type==pygame.QUIT:
pygame.quit()
key=pygame.key.get_pressed()
if key[pygame.K_s]:
scrolly-=speed
collide=collision()
if collide==1:
scrolly+=speed
if key[pygame.K_w]:
scrolly+=speed
collide=collision()
if collide==1:
scrolly-=speed
if key[pygame.K_d]:
scrollx-=speed
collide=collision()
if collide==1:
scrollx+=speed
if key[pygame.K_a]:
scrollx+=speed
collide=collision()
if collide==1:
scrollx-=speed
win.fill(black)
pygame.draw.rect(win,green,(scrollx,scrolly,size,size)) #background
pygame.draw.rect(win,white,player)
for i in debris_list:
i.update()
pygame.display.update()
您执行碰撞测试太早了。当碰撞测试为运行时,物体和地图还没有滚动
将update
和draw
分开class debris_class
:
class debris_class():
def __init__(self):
self.x=random.randrange(0,size-20)
self.y=random.randrange(0,size-20)
self.rect=pygame.Rect(self.x,self.y,20,20)
def update(self):
self.rect.y=scrolly+self.y
self.rect.x=scrollx+self.x
def draw(self):
pygame.draw.rect(win,white,self.rect)
根据按下的键和速度获取移动:
key=pygame.key.get_pressed()
move_x = (key[pygame.K_d] - key[pygame.K_a]) * speed
move_y = (key[pygame.K_s] - key[pygame.K_w]) * speed
复制plyer并移动播放器:
player_copy = player.copy()
player.x += move_x
player.y += move_y
执行碰撞测试并撤消玩家的移动:
collide = collision()
player = player_copy
如果没有检测到碰撞,滚动地图和对象:
if collide == 0:
scrollx -= move_x
scrolly -= move_y
for i in debris_list:
i.update()
循环绘制对象:
for i in debris_list:
i.draw()
完整代码:
import pygame
import random
pygame.init()
win_height=600
win_width=600
win=pygame.display.set_mode((win_width,win_height))
pygame.display.set_caption("YourCraft")
white=(255,255,255)
black=(0,0,0)
green=(0,255,0)
clock=pygame.time.Clock()
debris_list=[]
player=pygame.Rect(win_width/2,win_height/2,20,20)
scrolly=0
scrollx=0
size=1000
speed=5
class debris_class():
def __init__(self):
self.x=random.randrange(0,size-20)
self.y=random.randrange(0,size-20)
self.rect=pygame.Rect(self.x,self.y,20,20)
def update(self):
self.rect.y=scrolly+self.y
self.rect.x=scrollx+self.x
def draw(self):
pygame.draw.rect(win,white,self.rect)
for i in range(10):
debris=debris_class()
debris_list.append(debris)
def collision():
for i in debris_list:
if i.rect.colliderect(player):
return 1
return 0
while True:
clock.tick(60)
for event in pygame.event.get():
if event.type==pygame.QUIT:
pygame.quit()
key=pygame.key.get_pressed()
move_x = (key[pygame.K_d] - key[pygame.K_a]) * speed
move_y = (key[pygame.K_s] - key[pygame.K_w]) * speed
player_copy = player.copy()
player.x += move_x
player.y += move_y
collide = collision()
player = player_copy
if collide == 0:
scrollx -= move_x
scrolly -= move_y
for i in debris_list:
i.update()
win.fill(black)
pygame.draw.rect(win,green,(scrollx,scrolly,size,size)) #background
pygame.draw.rect(win,white,player)
for i in debris_list:
i.draw()
pygame.display.update()