首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >游戏中集合与碰撞的摄像机问题

游戏中集合与碰撞的摄像机问题
EN

Stack Overflow用户
提问于 2017-11-16 14:16:41
回答 1查看 51关注 0票数 0

我目前正试图在游戏中编写一个简单的平台游戏,但是当我尝试将相机功能添加到游戏中时,我遇到了冲突问题。

这是我的代码:

为了不使问题太大,我将削减代码的部分,包括运动,碰撞和绘图。

Index.py

  • 删除、init、和setup_tiles函数。 从设置导入*从tiles导入*从播放器导入*从摄像机导入* pygame.init()类窗口: def game_loop(self):而不是self.crashed: pygame.event.get()中的事件: if event.type == pygame.QUIT: self.crashed = True self.movement() self.window.blit(self.background,(0 ),(0) self.all_sprites.clear(self.window,self.background) self.player.update(self.all_sprites) self.camera.update(self.player) self.player.draw(self.window) # self.all_sprites.draw(self.window)self.camera.apply( sprite )) pygame.display.flip() self.clock.tick(60) for () pygame.quit() def移动(Self):keys = pygame.key.get_pressed()如果keyspygame.K_w: self.player.velocity_y = -3 self.player.矩形和+= self.player.velocity_y ( self.all中的sprite)_sprites: if self.player.collide_Y( sprite ):auto.player.矩形.y=Sel.player.矩形- self.player.velocity_y elif keyspygame.K_s: self.player.velocity_y =3 elif.player.矩形.y += self.player.velocity_y for sprite in self.all_sprites: if self.player.collide_Y( sprite ):sprite.player.矩形.y=Sel.player.矩形.y- self.player.velocity_y if keyspygame.K_a: self.player.velocity_x = -3 auto.player.矩形.x += self.player.velocity_x for sprite in self.all_sprites: if self.player.collide_X(sprite):self.player。self.player.velocity_x elif keyspygame.K_d: self.player.velocity_x =3_x窗口= Window() window.game_loop()

Tiles.py

代码语言:javascript
运行
复制
import pygame
from settings import *

class Tiles(pygame.sprite.Sprite):

    def __init__(self, file, pos):
        pygame.sprite.Sprite.__init__(self)
        self.bitmap = pygame.image.load(file)
        self.bitmap = pygame.transform.scale(self.bitmap, (TILE_SIZE, TILE_SIZE))
        self.image = pygame.Surface((TILE_SIZE, TILE_SIZE), pygame.HWSURFACE | pygame.SRCALPHA)
        self.image.blit(self.bitmap, (0, 0))
        self.rect = self.image.get_rect()
        self.rect.x, self.rect.y = pos

Player.py

  • 删除init函数 从设置导入* class Player(pygame.sprite.Sprite):def绘图(self,window):window.blit(self.image,(Sel.矩形,Sel.矩形)),def collide_X(self,):if (Sel.矩形.x+ self.width >= sprite.矩形.x >= Sel.矩形.x和Sel.矩形+ self.height >= sprite.矩形.y+ TILE_SIZE >= sel.矩形.y)或(Sel.矩形.x+ self.width >= sprite.矩形.x+ TILE_SIZE >= Sel.矩形.x和Sel.矩形+ self.height >= sprite.矩形.y+ TILE_SIZE >= sel.y)或(self .矩形+self.width>=sprite.矩形x+TILE_SIZE>=Sel.矩形x和Sel.矩形+self.height>=sprite.矩形.y+TILE_SIZE>=sel.y)或(self.矩形+self.width>=sprite.矩形x+TILE_SIZE>=Sel.矩形.x和Sel.矩形+self.height>=sprite.矩形.y+TILE_SIZE>=Sel.y)或(self.矩形+self.width>=sprite.矩形x+TILE_SIZE>=Sel.矩形x和Sel.矩形+self.height>=sprite..rect.x + self.width >= sprite.矩形.x >= Sel.矩形.x和sprite.矩形+ TILE_SIZE >= self.y+ self.height >= sprite.矩形.y):打印“True”返回True其他:返回False def collide_Y(self,(自.矩形+ self.height + self.velocity_y >= sprite.矩形+ self.velocity_y和Sel.矩形.x+ self.width >= sprite.矩形.x >= sprite.矩形)或(sprite.矩形+ self.height >= sprite.矩形.y+ TILE_SIZE >= sprite.矩形+self.velocity_y和sprite.矩形+ self.width >= sprite.矩形.x >= Sel.矩形.x)):返回True else:返回False

Camera.py

代码语言:javascript
运行
复制
import pygame
from settings import *


class Camera:
    def __init__(self, width, height):
        self.camera = pygame.Rect(0, 0, width, height)
        self.width = width
        self.height = height

    def apply(self, target):
        return target.rect.move(self.camera.topleft)

    def update(self, target):
        x = - target.rect.x + int(WIDTH/2)
        y = - target.rect.y + int(HEIGHT/2)
        self.camera = pygame.Rect(x, y, self.width, self.height)

Settings.py

代码语言:javascript
运行
复制
WIDTH = 800
HEIGHT = 600

TILE_SIZE = 32

LEVEL_1 = [
    'TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT',
    'B                             V                       V',
    'B                             V                       V',
    'B                             V                       V',
    'B                             V                       V',
    'TTTTTTTTTB                    V                       V',
    'B                             V                       V',
    'B                             V                       V',
    'B                             V                       V',
    'B                             V                       V',
    'B                             V                       V',
    'B                             V                       V',
    'B                                                     V',
    'B                                                     V',
    'B                                                     V',
    'B              VTTTTTTTTTTTTTTTTTTTTTTTTB             V',
    'B                             V                       V',
    'B                             V                       V',
    'TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT'
]

LEVEL_1_WIDTH = len(LEVEL_1[0])*TILE_SIZE
LEVEL_1_HEIGHT = len(LEVEL_1)*TILE_SIZE

无相机碰撞

这是没有相机的碰撞,因为你可以看到它工作得很好。

与照相机的碰撞

当我添加相机功能时,就会发生这样的情况

如果您想测试它,请从game_loop中删除#并使用相机应用对绘图进行注释。

代码语言:javascript
运行
复制
    # self.all_sprites.draw(self.window)
    for sprite in self.all_sprites:
        self.window.blit(sprite.image, self.camera.apply(sprite))

我在Window 10 x64机器中使用python2.7。

EN

回答 1

Stack Overflow用户

发布于 2017-11-16 19:10:23

您只是没有将相机转换应用于您的player实例:它是在绝对游戏坐标中绘制的,而其他所有内容都是在摄像机坐标中绘制的。

另一方面,碰撞检查总是在游戏的绝对坐标下进行。

你必须把相机应用到你的球员,然后再画它。正如您的代码所示,看起来您只需将播放器添加到all_sprites组中,并完全删除Player.draw方法。然后,如果您愿意,纠正Camera.update方法上的一些内容,以便当在地图的边框时,播放机并不总是以屏幕为中心。

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

https://stackoverflow.com/questions/47331961

复制
相关文章

相似问题

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