为了账号安全,请及时绑定邮箱和手机立即绑定

OOP Pygame 平台游戏:控制和移动屏幕上的正方形

OOP Pygame 平台游戏:控制和移动屏幕上的正方形

LEATH 2023-03-01 16:17:30
import pygameimport randomimport mathimport sysscreenWidth = 1200screenHeight = 600class Hero:    def __init__(self, pos):        self.pos = pos        self.width = 30        self.height = 30        self.color = (0, 0, 0)        self.dirX = 0        self.dirY = 0    def move(self):        for event in pygame.event.get():            if event.type == pygame.QUIT:                pygame.quit()                sys.exit()            elif event.type == pygame.KEYDOWN:                if event.key == pygame.K_RIGHT:                    self.dirX = 1                elif event.key == pygame.K_LEFT:                    self.dirX = -1    def draw(self, display):        x = self.pos[0]        y = self.pos[1]        pygame.draw.rect(display, self.color, (x + self.dirX, y + self.dirY, self.width, self.height))        print(self.pos, self.dirX, self.dirY)        def jump(self):        pass    def die(self):        passclass Enemy:    passclass Background:    passclass Obstacles:    passclass Camera:    passdef score():    passdef create(w, h):    display = pygame.display.set_mode((w, h))    display.fill((255, 255, 255))    #create background    #create Obstacles    #create Hero    heroOne = Hero([150, 450])    heroOne.move()    heroOne.draw(display)    #create Enemy    pygame.display.update()def main():    pygame.init()    clock = pygame.time.Clock()    running = True    while running:        clock.tick(300)        create(screenWidth, screenHeight)main()嗨,我正在使用 Pygame 制作一个 OOP 游戏,其中一个方块将由用户控制并沿着地板移动,跳过障碍物和其他敌人方块。我希望它的工作方式:当我按下 K_LEFT 时,dirX = 1它将添加到的 x 坐标pos,因此正方形的 x 位置将被更新并且正方形将开始向右滑动。当我按下时dir = -1,方形会向左移动。它的工作方式:否我认为问题是pos主多维数据集似乎没有更新,并且dirX更新从0到1并返回到0。我想改变函数下变量的值__init__()是在我做的时候完成的,或者它可能是完全错误的。这是使我的代码按照我尝试的方式工作的任何方法,还是完全错误的方法并且还有其他方法?我正在学习 OOP 和 python,非常感谢与此代码相关的有关最佳实践的任何其他建议或链接。
查看完整描述

2 回答

?
千巷猫影

TA贡献1829条经验 获得超7个赞

首先,您必须move在主应用程序循环中调用:


def main():

    pygame.init()

    display = pygame.display.set_mode((screenWidth, screenHeight))

    clock = pygame.time.Clock()


    heroOne = Hero([150, 450])

    running = True

    while running:

        clock.tick(300)


        display.fill((255, 255, 255))

        heroOne.move()

        heroOne.draw(display)

        pygame.display.update()        

您必须在每一帧中通过self.dirX和更改播放器的位置:self.dirY


class Hero:

    # [...]


    def move(self):

        for event in pygame.event.get():

            if event.type == pygame.QUIT:

                pygame.quit()

                sys.exit()


            elif event.type == pygame.KEYDOWN:

                if event.key == pygame.K_RIGHT:

                    self.dirX = 1

                elif event.key == pygame.K_LEFT:

                    self.dirX = -1


        new_x = self.pos[0] + self.dirX

        new_y = self.pos[1] + self.dirY

        self.pos = [new_x , new_y]


    def draw(self, display):

        pygame.draw.rect(display, self.color, (*self.pos, self.width, self.height))

如果你想移动矩形,就在按下一个键的时候,那么我建议使用pygame.key.get_pressed而不是KEYDOWN事件:


class Hero:

    # [...]


    def move(self):

        for event in pygame.event.get():

            if event.type == pygame.QUIT:

                pygame.quit()

                sys.exit()


        keys = pygame.key.get_pressed()

        if keys[pygame.K_LEFT]:

            self.pos[0] -= 1 

        if keys[pygame.K_RIGHT]:

            self.pos[0] += 1

        if keys[pygame.K_UP]:

            self.pos[1] -= 1 

        if keys[pygame.K_DOWN]:

            self.pos[1] += 1

完整代码:


import pygame

import random

import math

import sys


screenWidth = 1200

screenHeight = 600


class Hero:

    def __init__(self, pos):

        self.pos = pos

        self.width = 30

        self.height = 30

        self.color = (0, 0, 0)

        self.dirX = 0

        self.dirY = 0


    def move(self, events):

        keys = pygame.key.get_pressed()

        if keys[pygame.K_LEFT]:

            self.pos[0] -= 1 

        if keys[pygame.K_RIGHT]:

            self.pos[0] += 1

        if keys[pygame.K_UP]:

            self.pos[1] -= 1 

        if keys[pygame.K_DOWN]:

            self.pos[1] += 1


    def draw(self, display):

        pygame.draw.rect(display, self.color, (*self.pos, self.width, self.height))

    

    def jump(self):

        pass



    def die(self):

        pass



class Enemy:

    pass


class Background:

    pass


class Obstacles:

    pass


class Camera:

    pass


def score():

    pass



def main():

    pygame.init()

    display = pygame.display.set_mode((screenWidth, screenHeight))

    clock = pygame.time.Clock()


    heroOne = Hero([150, 450])

    running = True

    while running:

        clock.tick(300)

        events = pygame.event.get()

        for event in events:

            if event.type == pygame.QUIT:

                pygame.quit()

                sys.exit()


        heroOne.move(events)


        display.fill((255, 255, 255))

        heroOne.draw(display)

        pygame.display.update()   


main()



查看完整回答
反对 回复 2023-03-01
?
FFIVE

TA贡献1797条经验 获得超6个赞

在您的create函数中,您正在创建Hero每次调用时的新实例。


相反,在 中初始化 heroOne main,并将其作为参数传递,以便您可以使用它:


def main():

    pygame.init()

    heroOne = Hero([150, 450])

    clock = pygame.time.Clock()


    running = True

    while running:


        clock.tick(30)


        create(screenWidth, screenHeight, heroOne)

还要在move方法中添加增量:


self.dirX += 1

和:


self.dirX -= 1

现在对象将by one在每次按键时移动。


如果你想要连续移动,你应该放一些flag,例如,如果它是True +=1和“False” -=1,按键将改变flag状态。


查看完整回答
反对 回复 2023-03-01
  • 2 回答
  • 0 关注
  • 82 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信