亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 149 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號