简体   繁体   English

怪物大通pygame

[英]Monster Chase pygame

So here is my problem , I'm at the (very) beginning of making my Rogue like game and i'm stuck at making an enemy chase the player , it must be something easy and obvious but my skills are pretty low ... So here is my Monster class 所以这是我的问题,我处于使我的Rogue像游戏一样(非常)的开始,而我一直坚持让敌人追逐玩家,这一定很容易而且很明显,但是我的技能却很低...这是我的怪物课程

class monster():
  def __init__(self , mright, mleft, mup, mdown):
    self.mright = pygame.image.load(mright).convert_alpha()
    self.mleft = pygame.image.load(mleft).convert_alpha()
    self.mup = pygame.image.load(mup).convert_alpha()
    self.mdown = pygame.image.load(mdown).convert_alpha()

    self.sqrx = 7 
    self.sqry = 2
    self.x = 210
    self.y = 60
    self.direction = self.mdown

    char = character(right , left , up , down , Level)

def chase(self,direction):
    if self.sqrx > char.sqrx :
        self.sqrx -= 1
        self.x = self.sqrx * size_sprite 
    self.direction = self.mleft

    if self.sqrx < char.sqrx :
        self.sqrx += 1
        self.x = self.sqrx * size_sprite 
    self.direction = self.mright

    if self.sqry > char.sqry :
        self.sqry -= 1
        self.y = self.sqry * size_sprite
    self.direction = self.mup

    if self.sqry < char.sqry :
        self.sqry += 1
        self.y = self.sqry * size_sprite
    self.direction = self.mdown

And the Game Loop 和游戏循环

while gameon:


    pygame.time.Clock().tick(30)

    for event in pygame.event.get():

        if event.type == QUIT:
            gameon = 0
            on = 0

        elif event.type == KEYDOWN:

            if event.key == K_ESCAPE:
                gameon = 0

            elif event.key == K_RIGHT:
                char.move('right')  
            elif event.key == K_LEFT:
                char.move('left')
            elif event.key == K_UP:
                char.move('up')
            elif event.key == K_DOWN:
                char.move('down')

    level.display(window)
    window.blit(monst.direction , (monst.x , monst.y))
    window.blit(char.direction , (char.x , char.y))
    pygame.display.flip()

You should use chase() in mainloop - see comment in code 您应该在mainloop中使用chase() -请参见代码中的注释

while gameon:

    pygame.time.Clock().tick(30)

    # --- events ---

    for event in pygame.event.get():

        if event.type == QUIT:
            gameon = 0
            on = 0

        elif event.type == KEYDOWN:

            if event.key == K_ESCAPE:
                gameon = 0

            elif event.key == K_RIGHT:
                char.move('right')  
            elif event.key == K_LEFT:
                char.move('left')
            elif event.key == K_UP:
                char.move('up')
            elif event.key == K_DOWN:
                char.move('down')
        # - object events ---

        # char.handle_event(event)

    # --- updates ---

    # HERE put all functions which change elements
    #      (but don't depend on events) like:
    # - chasing player, 
    # - moving mosters, 
    # - detecting collisions, 
    # - animating other elements (ie. fire, water, etc.)

    # --- draws all elements ---

    level.display(window)
    window.blit(monst.direction , (monst.x , monst.y))
    window.blit(char.direction , (char.x , char.y))
    pygame.display.flip()

See some templates of PyGame code 查看一些PyGame代码模板


In Moster I would use char (player instance) as argument in 在Moster中,我将使用char (玩家实例)作为参数

def __init__(self , char, ...):
    self.char = char

to have access to its position all the time 一直可以访问其位置

or at least 或至少

def chase(self, direction, char):

to have access to player when you call chase() 调用chase()时可以访问播放器


BTW: instead of gameon = 0 more readable is gameon = False (and gameon = True ) 顺便说一句: gameon = False (and gameon = True )而不是gameon = 0


You could create draw() in Moster() and do 您可以在Moster()创建draw() Moster()并执行

 monst.draw(window)

instead of 代替

 window.blit(monst.direction , (monst.x , monst.y))

Use CamelCase names for classes ( class Monster(): ) and lower_case names for variables ( moster = Moster() ). 使用CamelCase的类名( class Monster():lower_case变量名称( moster = Moster() It makes code more readable. 它使代码更具可读性。 See PEP 8 -- Style Guide for Python Code 请参阅PEP 8-Python代码样式指南

Like someone mentioned above - your indentation of setting the direction is causing it to call all 4 of the assignments every time chase is called. 像上面提到的人-你的设置方向的压痕导致它调用任务每次的所有4 chase被调用。 This essentially always sets direction = self.mdown 这基本上总是将方向设置为self.mdown

def chase(self,direction):
    if self.sqrx > char.sqrx :
        self.sqrx -= 1
        self.x = self.sqrx * size_sprite 
        self.direction = self.mleft

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM