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

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):

        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):

        pass



class Enemy:

    pass


class Background:

    pass


class Obstacles:

    pass


class Camera:

    pass


def score():

    pass


def 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,非常感谢与此代码相关的有关最佳实践的任何其他建议或链接。


LEATH
浏览 122回答 2
2回答

千巷猫影

首先,您必须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.dirYclass 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 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, 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):        passclass Enemy:    passclass Background:    passclass Obstacles:    passclass Camera:    passdef score():    passdef 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()

FFIVE

在您的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状态。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python