首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >电子游戏中自制的2D碰撞检测

电子游戏中自制的2D碰撞检测
EN

Stack Overflow用户
提问于 2018-09-09 19:11:25
回答 1查看 109关注 0票数 1

我正在制作一个类似于磁控管的游戏,两个玩家用player1的w,a,s,d键控制他们的角色,player2用上、下、左、右键控制他们的角色。在玩家的移动中,用户做了一个轨迹,如果对方的玩家接触到了玩家的轨迹,他们就“退出”了。

游戏代码:

代码语言:javascript
复制
from steel2D import *

window = Window(600, 450, "Steel 2D Tutorial")
running = True
char1 = Rect(window, 0, 0, 5, 5, (255, 0, 0))
char2 = Rect(window, 595, 445, 5, 5, (0, 0, 255))
trail1 = []
trail2 = []
red = 0
blue = 0

while running:
    sleep(2)
    keys = OnKeyInput()

    if keys[pygame.K_w]:
        char1.y -= 2.2
        trail1.append(char1)
    if keys[pygame.K_a]:
        char1.x -= 2.2
        trail1.append(char1)
    if keys[pygame.K_s]:
        char1.y += 2.2
        trail1.append(char1)
    if keys[pygame.K_d]:
        char1.x += 2.2
        trail1.append(char1)

    if keys[pygame.K_UP]:
        char2.y -= 2.2
        trail2.append(char2)
    if keys[pygame.K_LEFT]:
        char2.x -= 2.2
        trail2.append(char2)
    if keys[pygame.K_DOWN]:
        char2.y += 2.2
        trail2.append(char2)
    if keys[pygame.K_RIGHT]:
        char2.x += 2.2
        trail2.append(char2)

    if char1.x >= 595:
        char1.x = 595
    if char1.x <= 0:
        char1.x = 0
    if char1.y >= 445:
        char1.y = 445
    if char1.y <= 0:
        char1.y = 0

    if char2.x >= 595:
        char2.x = 595
    if char2.x <= 0:
        char2.x = 0
    if char2.y >= 445:
        char2.y = 445
    if char2.y <= 0:
        char2.y = 0

    char1.draw()
    char2.draw()
    Update()

    for t1, t2 in zip(trail1, trail2):
        if OnRectCollison(t1, t2):
            exit()

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
            pygame.quit()

在每个按键上,用户跟踪被附加到一个列表,然后它被循环通过以检查是否有冲突。现在似乎只有当玩家的第一次接触时,才会发现碰撞,而不是其他的。

steel2D代码(我的游戏引擎):

代码语言:javascript
复制
import pygame
from threading import Thread

pygame.init()


def sleep(ms):
    pygame.time.delay(ms)


def Window(w, h, title="steel2D"):
    window = pygame.display.set_mode((w, h))
    pygame.display.set_caption(title)
    return window


def Update():
    pygame.display.update()


def OnKeyInput():
    return pygame.key.get_pressed()


class Rect:
    def __init__(self, window, x, y, w, h, color=(0, 0, 0)):
        self.window = window
        self.x = x
        self.y = y
        self.w = w
        self.h = h
        self.color = color

    def draw(self):
        pygame.draw.rect(self.window, self.color, (self.x, self.y, self.w, self.h))


class Circle:
    def __init__(self, window, x, y, r, color=(0, 0, 0)):
        self.window = window
        self.x = x
        self.y = y
        self.r = r
        self.color = color

    def draw(self):
        pygame.draw.circle(self.window, self.color, (self.x, self.y), self.r, self.r)


def Line(window, color, sx, sy, ex, ey, width=2):
    pygame.draw.line(window, color, (sx, sy), (ex, ey), width)


def OnRectCollison(rect1, rect2):
    if rect1.x < rect2.x + rect2.w and rect1.x + rect1.w > rect2.x and rect1.y < rect2.y + rect2.h and rect1.y + rect1.h > rect2.y:
        return True
    else:
        return False

任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-09 23:13:39

有几个问题:

  1. 如果您想将ziptrail1trail2中的每一个rect进行比较,那么trail1是一个错误的函数。在相同的索引中只会得到一对rects,还会删除较长列表中的元素。看看这个例子:trail1 = 1,2,3 >>> trail2 = 'a','b','c','d','e‘>>> list(zip(trail1,trail2)) (1,'a'),(2,'b'),(3,'c') 只需遍历跟踪列表中的rects,并检查char1char2是否与它们发生冲突。我通过切片列表跳过最后几次重划,否则它们会立即发生碰撞。对于尾迹1:-5: if OnRectCollison(char1,trail):trail2中的trail : if OnRectCollison(char1,trail):print(碰撞)
  2. 移动时,将相同的Rect对象(char1char2)附加到跟踪列表中,因此列表中只包含对头坐标的引用,因此只有路径的头部才能发生碰撞。 后缀(Char1) 附加(浅)副本代替: 后缀(copy.copy(Char1))

边注:碰撞拼写不正确。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52247828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档