当朝相反方向推时,如何正确地对自由浮动空间物体施加重力并产生某种摩擦

切什科夫斯基

我正在尝试编写基本类似于小行星的运动,在该运动中,一旦按下UP按钮,您便会加速至一定速度,然后因为在太空中您不会停下来,只能朝相反的方向减速才能减速。最重要的是,我希望重力将您拉向屏幕底部。我已经完成了大部分工作,但是我遇到的问题是:

  1. 当我转弯并向相反方向推时,它不会先减速后退,然后再开始向前移动,它只会以全速向相反方向射击

关于如何处理并总体上使运动更平稳的任何建议?

import pygame as pg
import os
vec = pg.math.Vector2

TITLE = "GRAVITAR"
WIDTH = 800
HEIGHT = 600
FPS = 60
GREY = (211, 211, 211)

# Player properties
ROCKET_SHIP = 'Images/Rocket_Ship.png' # <a href='https://pngtree.com/so/spaceship-clipart'>spaceship 
                                       # clipart png from pngtree.com</a>
PLAYER_ACC = 0.5
PLAYER_FRICTION = -0.00
PLAYER_GRAV = 0.1
PLAYER_ROT_SPEED = 200
PLAYER_SPEED = 5

class Player(pg.sprite.Sprite):
    def __init__(self, game, x, y):
        pg.sprite.Sprite.__init__(self)
        self.game = game
        self.image = game.rocket_ship
        self.rect = self.image.get_rect()
        self.rect.center = (x, y)
        self.vel = vec(0, 0)
        self.pos = vec(x, y)
        self.rot = 0

    def get_keys(self):
        self.rot_speed = 0
        self.acc = vec(0, PLAYER_GRAV)
        keys = pg.key.get_pressed()
        if keys[pg.K_LEFT]:
            self.rot_speed = PLAYER_ROT_SPEED
        if keys[pg.K_RIGHT]:
            self.rot_speed = -PLAYER_ROT_SPEED
        if keys[pg.K_UP]:
            self.vel = vec(PLAYER_SPEED, 0).rotate(-self.rot)
        if keys[pg.K_SPACE]:
            self.shoot()
        self.acc += self.vel * PLAYER_FRICTION
        self.vel += self.acc
        if self.vel[1] >= 2:
            self.vel[1] = 2
        self.pos += self.vel + 0.5 * self.acc

    def shoot(self):
        pass

    def update(self):
        self.get_keys()
        self.rot = (self.rot + self.rot_speed * self.game.dt) % 360
        self.image = pg.transform.rotate(self.game.rocket_ship, self.rot - 90)
        self.rect = self.image.get_rect()
        self.rect.center = self.pos
        self.pos += self.vel * self.game.dt
        if self.pos.x > WIDTH:
            self.pos.x = 0
        if self.pos.x < 0:
            self.pos.x = WIDTH
        if self.pos.y > HEIGHT:
            self.pos.y = 0
        if self.pos.y < 0:
            self.pos.y = HEIGHT

class Game:
    def __init__(self):
        # Initialize pygame and create window
        pg.init()
        pg.mixer.init()
        pg.key.set_repeat(10, 50)
        os.environ['SDL_VIDEO_WINDOW_POS'] = '568, 101'
        self.screen = pg.display.set_mode((WIDTH, HEIGHT))
        pg.display.set_caption(TITLE)
        self.clock = pg.time.Clock()
        self.running = True
        self.load_data()

    def load_data(self):
        self.rocket_ship = pg.image.load(ROCKET_SHIP).convert_alpha()
        self.rocket_ship = pg.transform.scale(self.rocket_ship, (32, 32))

    def new(self):
        # Start a new game
        self.all_sprites = pg.sprite.Group()
        self.player = Player(self, WIDTH / 2, HEIGHT / 4)
        self.all_sprites.add(self.player)
        self.run()

    def run(self):
        # Game loop
        self.playing = True
        while self.playing:
            self.dt = self.clock.tick(FPS) / 1000.0
            self.events()
            self.update()
            self.draw()

    def update(self):
        # Game loop update
        self.all_sprites.update()

    def events(self):
        # Game loop events
        for event in pg.event.get():
            if event.type == pg.QUIT:
                if self.playing:
                    self.playing = False
                self.running = False

    def draw(self):
        # Game loop draw
        pg.display.set_caption("{:.2f}".format(self.clock.get_fps()))
        self.screen.fill(GREY)
        self.all_sprites.draw(self.screen)

        # After drawing everything, flip display
        pg.display.flip()

    def show_start_screen(self):
        pass

    def show_go_screen(self):
        pass

g = Game()
g.show_start_screen()
while g.running:
    g.new()
    g.show_go_screen()

pg.quit()


      
拉比德76

按下UP时无需更改速度,但必须设置加速度:

self.vel = vec(PLAYER_SPEED, 0).rotate(-self.rot)

self.acc += vec(PLAYER_ACC, 0).rotate(-self.rot)

将加速度加到速度上:

self.vel += self.acc

我建议限制最大值。但是,我建议针对每个方向分别执行此操作:

max_vel = 2
self.vel[0] = max(-max_vel, min(max_vel, self.vel[0]))
self.vel[1] = max(-max_vel, min(max_vel, self.vel[1]))

将此应用于方法get_keys

class Player(pg.sprite.Sprite):
    # [...]

    def get_keys(self):
        self.rot_speed = 0
        self.acc = vec(0, PLAYER_GRAV)
        keys = pg.key.get_pressed()
        if keys[pg.K_LEFT]:
            self.rot_speed = PLAYER_ROT_SPEED
        if keys[pg.K_RIGHT]:
            self.rot_speed = -PLAYER_ROT_SPEED
        if keys[pg.K_UP]:
            self.acc += vec(PLAYER_ACC, 0).rotate(-self.rot)
        if keys[pg.K_SPACE]:
            self.shoot()
        self.vel += self.acc + self.vel * PLAYER_FRICTION
        max_vel = 2
        self.vel[0] = max(-max_vel, min(max_vel, self.vel[0]))
        self.vel[1] = max(-max_vel, min(max_vel, self.vel[1]))
        self.pos += self.vel

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使我的js滑块向相反方向移动?

来自分类Dev

如何将颜色的色调向相反方向移动

来自分类Dev

当我想使用键盘上的箭头向相反方向行驶时,该如何使汽车转弯

来自分类Dev

AS3向导弹施加重力

来自分类Dev

没有摩擦的 Box2d 物体在碰撞时以某种方式获得速度

来自分类Dev

如果有可用空间,请朝相反方向推动元件

来自分类Dev

在修改容器时如何正确地遍历容器?

来自分类Dev

如何正确地“setMutableVisiblity”?

来自分类Dev

如何正确地将Mpmath矩阵强制转换为numpy ndarray(并使mpmath.mpf浮动)

来自分类Dev

使精灵沿矢量的相反方向移动

来自分类Dev

多态关联导轨的相反方向

来自分类Dev

禁用范围滑块中的相反方向

来自分类Dev

D3.js如何使用基本SVG元素向相反方向过渡

来自分类Dev

如何在相反方向垂直移动两个列表

来自分类Dev

如何在Shiny中包含2个沿相反方向移动的滑块?

来自分类Dev

D3.js如何使用基本SVG元素向相反方向过渡

来自分类Dev

生成砌体布局,然后对其施加重力

来自分类Dev

JS如何正确地替换引号

来自分类Dev

如何正确地使视图的宽度相对

来自分类Dev

如何正确地组织较少的班级

来自分类Dev

如何正确地迭代结构

来自分类Dev

如何正确地从innerXMl获取值

来自分类Dev

如何正确地从NSTextField查看数据?

来自分类Dev

PHPMailer-如何正确地从“发送”

来自分类Dev

如何正确地从.csv创建XML?

来自分类Dev

Mediapipe:如何正确地释放MPPGraph

来自分类Dev

如何正确地从QGraphicsLineItem派生/继承?

来自分类Dev

如何更正确地近似点

来自分类Dev

如何正确地从蚀提交?

Related 相关文章

热门标签

归档