簡體   English   中英

pygame我的敵人階級移動后消失

[英]Pygame my enemy class disappears after movement

首次加載游戲時,該代碼工作正常,兩個矩形位於其中,但是當玩家移動時,敵人矩形消失了。

擴展我試圖使敵人的班級不斷地上下移動,而無需按下任何鍵。

import pygame
import os 
import random 
from pygame.locals import * # Constants
import math
import sys
import random

pygame.init()  

screen=pygame.display.set_mode((1280,720)) #(length,height)
screen_rect=screen.get_rect()
background = pygame.Surface(screen.get_size())
background = pygame.image.load('stage.png').convert()
screen.blit(background, (0, 0))

class Player(pygame.sprite.Sprite):
    def __init__(self):
        self.rect = pygame.draw.rect(screen, (0,0,128), (50,560,50,25)) #(colour)(x-position,y-position,width,height)
        self.dist = 100

    def draw_rect(self,x,y):    # This is my code which should make the player move
        screen.blit(background, (0, 0)) #If this isn't included then when the rectangle moves it's old positon will still be on the screen
        self.rect = self.rect.move(x*self.dist, y*self.dist); pygame.draw.rect(screen, (0, 0, 128), self.rect)
        pygame.display.update()

    def handle_keys(self): # code to make the character move when the arrow keys are pressed
        keys = pygame.key.get_pressed()
        if keys[K_LEFT]:
            self.draw_rect(-0.05,0)
        elif keys[K_RIGHT]:
            self.draw_rect(0.05,0)
        elif keys[K_UP]:
            self.draw_rect(0,-0.05)
        elif keys[K_DOWN]:
            self.draw_rect(0,0.05)
        elif keys[K_SPACE]:
            self.draw_rect(0.05,-0.05)
        if self.rect.right > 1280:
            self.rect.right = 1280
        if self.rect.left < 0:
            self.rect.left = 0
        if self.rect.bottom > 720:
            self.rect.bottom = 720
        if self.rect.top < 0:
            self.rect.top = 0

class Enemy(pygame.sprite.Sprite): # the enemy class which works fine
    def __init__(self):
        x = random.randint(50,450)
        self.rect = pygame.draw.rect(screen, (128,0,0), (300,x,50,25))


player = Player()
enemy = Enemy()

def main():  #my main loop 
    running = True
    while running:
        player.handle_keys()
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
        pygame.display.flip()   #updates the whole screen

if __name__ == '__main__': main()

您只在__init__()中使類無效時才繪制精靈

您需要在pygame.display.flip()之前的main()函數的每個循環中繪制它們

按照目前的情況,玩家和敵人都不應該在第一幀之外顯示

您必須每幀清除屏幕-您可以通過使背景模糊來完成此操作-然后繪制精靈。 將運動與圖形代碼分開,以便在清除屏幕后可以使精靈變白。

class Player(pygame.sprite.Sprite):
    def __init__(self):
        self.rect = pygame.draw.rect(screen, (0,0,128), (50,560,50,25))
        self.dist = 100

    # Separate the movement and the drawing.
    def move(self, x, y):
        self.rect = self.rect.move(x*self.dist, y*self.dist)

    def draw(self, screen):
        pygame.draw.rect(screen, (0, 0, 128), self.rect)

    def handle_keys(self):
        keys = pygame.key.get_pressed()
        if keys[K_LEFT]:
            self.move(-0.05,0)
        elif keys[K_RIGHT]:
            self.move(0.05,0)
        elif keys[K_UP]:
            self.move(0,-0.05)
        elif keys[K_DOWN]:
            self.move(0,0.05)
        elif keys[K_SPACE]:
            self.move(0.05,-0.05)
        if self.rect.right > 1280:
            self.rect.right = 1280
        if self.rect.left < 0:
            self.rect.left = 0
        if self.rect.bottom > 720:
            self.rect.bottom = 720
        if self.rect.top < 0:
            self.rect.top = 0


class Enemy(pygame.sprite.Sprite):

    def __init__(self):
        self.x = random.randint(50,450)  # x is now an attribute.

    def draw(self, screen):
        self.rect = pygame.draw.rect(screen, (128,0,0), (300, self.x, 50, 25))


def main():
    clock = pygame.time.Clock()  # A clock to limit the frame rate.
    player = Player()
    enemy = Enemy()

    running = True
    while running:
        player.handle_keys()
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False

        # Clear the screen every frame by blitting the background.
        screen.blit(background, (0, 0))
        # Then draw the enemy and the player.
        enemy.draw(screen)
        player.draw(screen)
        pygame.display.flip()
        clock.tick(60)  # Limit the frame rate to 60 FPS.

我還建議您檢查Sprite組的工作方式,然后您可以擺脫draw方法,而只需調用sprite_group.draw(screen)即可繪制每個包含的sprite。 這是一個教程

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM