【问题标题】:Why is my sprite bouncing?为什么我的精灵弹跳?
【发布时间】:2017-02-06 19:51:41
【问题描述】:

我尝试关注这个视频:https://www.youtube.com/watch?v=pN9pBx5ln40&index=20&list=PLsk-HSGFjnaH5yghzu7PcOzm9NhsW0Urw

但是,当我运行我的程序时,我的角色应该保持静止,但由于某种原因它会弹跳

这就是它的样子:https://gyazo.com/015b20c0e4ad64ff3905cbef5865eedc

main.py

import pygame
from map import *
from char import *

pygame.init()

class game():
    def __init__(self):
        self.width = 1280
        self.height = 720
        self.gameRunning = True
        self.clock = pygame.time.Clock()
        self.FPS = 60
        self.screen = pygame.display.set_mode((self.width, self.height))
        self.loadMapData()

    def update(self):

        self.screen.fill(white)
        self.screen.blit(self.map_img, (0,528))
        playerGroup.draw(self.screen)
        pygame.display.update()


    def gameLoop(self):

        self.clock.tick(self.FPS)
        self.event()
        player1.move()
        self.update()

    def event(self):

            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    self.gameRunning = False

    def loadMapData(self):

        self.map = TiledMap()
        self.map_img = self.map.make_mapSurface()
        for tile_object in self.map.gameMap.objects:
            if tile_object.name == "Floor":
                Collision(tile_object.x, tile_object.y + 528, tile_object.width, tile_object.height)


g = game()
player1 = player()
while g.gameRunning == True:
    g.gameLoop()

map.py

import pygame
import pytmx
from char import *

pygame.init()

class TiledMap():
    def __init__(self):
        self.gameMap = pytmx.load_pygame("CollisionMap.tmx")
        self.mapwidth = self.gameMap.tilewidth * self.gameMap.width
        self.mapheight = self.gameMap.tileheight * self.gameMap.height

    def renderMap(self, surface):
        for layer in self.gameMap.visible_layers:
            if isinstance(layer, pytmx.TiledTileLayer):
                for x,y,gid in layer:
                    tile = self.gameMap.get_tile_image_by_gid(gid)
                    surface.blit(tile, (x * self.gameMap.tilewidth, y * self.gameMap.tileheight))

    def make_mapSurface(self):

        mapSurface = pygame.Surface((self.mapwidth, self.mapheight), pygame.SRCALPHA)
        self.renderMap(mapSurface)
        return mapSurface

class Collision(pygame.sprite.Sprite):
    def __init__(self, x, y, width, height):
        self.groups = SolidGroup
        pygame.sprite.Sprite.__init__(self, self.groups)
        self.rect = pygame.Rect(x, y, width, height)

char.py

import pygame

pygame.init()

black = (0, 0, 0)
white = (255, 255, 255)
red = (255, 0, 0)
green = (0, 255, 0)
blue = (0, 0, 255)
playerGroup = pygame.sprite.Group()
SolidGroup = pygame.sprite.Group()

class player(pygame.sprite.Sprite):
    def __init__(self):
        self.groups = playerGroup
        pygame.sprite.Sprite.__init__(self, self.groups)
        self.image = pygame.Surface((50, 50))
        self.image.fill(blue)
        self.rect = self.image.get_rect()
        self.rect.center = (1280/2, 720/2)
        self.position = pygame.math.Vector2(400, 300)
        self.acceleration = pygame.math.Vector2(0, 0)
        self.velocity = pygame.math.Vector2(0, 0)
        self.friction = -0.18

    def move(self):
        self.acceleration = pygame.math.Vector2(0, 0.5)
        key = pygame.key.get_pressed()
        if key[pygame.K_RIGHT]:
            self.acceleration.x = 1
        if key[pygame.K_LEFT]:
            self.acceleration.x = -1

        self.acceleration.x += self.velocity.x * self.friction
        self.velocity += self.acceleration
        self.position += self.velocity + 0.5 * self.acceleration

        hits = pygame.sprite.spritecollide(self, SolidGroup, False)
        if hits:
            self.position.y = hits[0].rect.top
            self.velocity.y = 0

        self.rect.midbottom = self.position

【问题讨论】:

    标签: python python-3.x pygame collision-detection collision


    【解决方案1】:

    问题是当它像这样点击时,您的精灵被设置在平台顶部:

    self.position.y = hits[0].rect.top
    

    但这只是把它放得太高了,所以它又掉下来了,等等。简单修复:

    self.position.y = hits[0].rect.top + 1
    

    【讨论】:

    • 我知道这会阻止精灵窗体弹跳,但是当我尝试添加“self.velocity.y = -13”来添加跳跃时,它会在它接触地面时停止跳跃。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-11
    相关资源
    最近更新 更多