【问题标题】:PyGame - Image stopped moving after new image is createdPyGame - 创建新图像后图像停止移动
【发布时间】:2015-09-16 15:10:12
【问题描述】:

我从网上获取了一个简单的PyGame 游戏,我正在做一些更改以学习游戏编程。

这是一个非常简单的游戏。一个角色(Player 类)显示在关卡中,如果您按下CTRL,他射击一颗子弹(这是从Bullet 类加载的图像)。子弹只是占据角色的位置并增加它的X 轴(水平移动)直到永远。

例如,如果我按两次CTRL,第一个子弹会卡住,第二个子弹会继续移动,直到我再次按CTRL,依此类推。

到目前为止,这是我的代码。很抱歉发布所有内容,但由于我是 PyGame 的新手,我无法区分哪些代码可能与问题相关。

#! /usr/bin/python

import pygame
from pygame import *

#WIN_WIDTH = 800
#WIN_HEIGHT = 640
WIN_WIDTH = 400
WIN_HEIGHT = 340
HALF_WIDTH = int(WIN_WIDTH / 2)
HALF_HEIGHT = int(WIN_HEIGHT / 2)

DISPLAY = (WIN_WIDTH, WIN_HEIGHT)
DEPTH = 32
FLAGS = 0
CAMERA_SLACK = 30

def main():
    global cameraX, cameraY
    pygame.init()
    screen = pygame.display.set_mode(DISPLAY, FLAGS, DEPTH)
    pygame.display.set_caption("Use arrows to move!")
    timer = pygame.time.Clock()

    up = down = left = right = running = shoot = False
    bg = Surface((32,32))
    bg.convert()
    bg.fill(Color("#000000"))
    entities = pygame.sprite.Group()
    player = Player(32, 32)
    #bullet = Bullet(30,7)
    platforms = []

    x = y = 0
    level = [
        "PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP",
        "P                                          P",
        "P                                          P",
        "P                                          P",
        "P         PP         PPPPPPPPPPP           P",
        "P                                          P",
        "P                                          P",
        "P                                          P",
        "P    PPPPPPPP                              P",
        "P                                          P",
        "P                          PPPPPPP         P",
        "P                 PPPPPP                   P",
        "P                                          P",
        "P         PPPPPPP                          P",
        "P                                          P",
        "P                     PPPPPP               P",
        "P                                          P",
        "P   PPPPPPPPPPP                            P",
        "P                                          P",
        "P                 PPPPPPPPPPP              P",
        "P                                          P",
        "P                                          E",
        "P                                          E",
        "P                                          E",
        "PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP",]
    # build the level
    for row in level:
        for col in row:
            if col == "P":
                p = Platform(x, y)
                platforms.append(p)
                entities.add(p)
            if col == "E":
                e = ExitBlock(x, y)
                platforms.append(e)
                entities.add(e)
            x += 32
        y += 32
        x = 0

    total_level_width  = len(level[0])*32
    total_level_height = len(level)*32
    camera = Camera(complex_camera, total_level_width, total_level_height)
    entities.add(player)

    while 1:
        timer.tick(60)

        for e in pygame.event.get():
            if e.type == QUIT: raise SystemExit, "QUIT"
            if e.type == KEYDOWN and e.key == K_ESCAPE:
                raise SystemExit, "ESCAPE"
            if e.type == KEYDOWN and e.key == K_UP:
                up = True
            if e.type == KEYDOWN and e.key == K_DOWN:
                down = True
            if e.type == KEYDOWN and e.key == K_LEFT:
                left = True
            if e.type == KEYDOWN and e.key == K_RIGHT:
                right = True
            if e.type == KEYDOWN and e.key == K_SPACE:
                running = True
            if e.type == KEYDOWN and e.key == K_LCTRL:
                shoot = True
                player_pos = player.returnPlayerPos()
                bullet = Bullet(player_pos[0]+50, player_pos[1]+30)
                entities.add(bullet)

            if e.type == KEYUP and e.key == K_UP:
                up = False
            if e.type == KEYUP and e.key == K_DOWN:
                down = False
            if e.type == KEYUP and e.key == K_RIGHT:
                right = False
            if e.type == KEYUP and e.key == K_LEFT:
                left = False

        # draw background
        for y in range(32):
            for x in range(32):
                screen.blit(bg, (x * 32, y * 32))
        camera.update(player)
        #camera.update(bullet)

        # update player, draw everything else
        player.update(up, down, left, right, running, platforms)

        # update bullet
        if shoot == True:
            bullet.update()

        for e in entities:
            screen.blit(e.image, camera.apply(e))
        pygame.display.update()


class Camera(object):
    def __init__(self, camera_func, width, height):
        self.camera_func = camera_func
        self.state = Rect(0, 0, width, height)

    def apply(self, target):
        return target.rect.move(self.state.topleft)

    def update(self, target):
        self.state = self.camera_func(self.state, target.rect)

def simple_camera(camera, target_rect):
    l, t, _, _ = target_rect
    _, _, w, h = camera
    return Rect(-l+HALF_WIDTH, -t+HALF_HEIGHT, w, h)

def complex_camera(camera, target_rect):
    l, t, _, _ = target_rect
    _, _, w, h = camera
    l, t, _, _ = -l+HALF_WIDTH, -t+HALF_HEIGHT, w, h

    l = min(0, l)                           # stop scrolling at the left edge
    l = max(-(camera.width-WIN_WIDTH), l)   # stop scrolling at the right edge
    t = max(-(camera.height-WIN_HEIGHT), t) # stop scrolling at the bottom
    t = min(0, t)                           # stop scrolling at the top
    return Rect(l, t, w, h)

class Entity(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)

class Player(Entity):
    def __init__(self, x, y):
        Entity.__init__(self)
        self.xvel = 0
        self.yvel = 0
        self.onGround = False
        self.image = pygame.image.load('images/character.png')  # @UndefinedVariable
        self.rect = Rect(x, y, 75, 89)


    def update(self, up, down, left, right, running, platforms):
        if up:
            # only jump if on the ground
            if self.onGround: self.yvel -= 10
        if down:
            pass
        if running:
            self.xvel = 12
        if left:
            self.xvel = -8
        if right:
            self.xvel = 8
        if not self.onGround:
            # only accelerate with gravity if in the air
            self.yvel += 0.3
            # max falling speed
            if self.yvel > 100: self.yvel = 100
        if not(left or right):
            self.xvel = 0
        # increment in x direction
        self.rect.left += self.xvel 
        # do x-axis collisions
        self.collide(self.xvel, 0, platforms)
        # increment in y direction
        self.rect.top += self.yvel
        # assuming we're in the air
        self.onGround = False;
        # do y-axis collisions
        self.collide(0, self.yvel, platforms)

    def returnPlayerPos(self):
        m = []
        m.append(self.rect[0])
        m.append(self.rect[1])
        return m  

    def collide(self, xvel, yvel, platforms):
        for p in platforms:
            if pygame.sprite.collide_rect(self, p):
                if isinstance(p, ExitBlock):
                    pygame.event.post(pygame.event.Event(QUIT))
                if xvel > 0:
                    self.rect.right = p.rect.left
                    print "collide right"
                if xvel < 0:
                    self.rect.left = p.rect.right
                    print "collide left"
                if yvel > 0:
                    self.rect.bottom = p.rect.top
                    self.onGround = True
                    self.yvel = 0
                if yvel < 0:
                    self.rect.top = p.rect.bottom

class Bullet(Entity):
    def __init__(self, x, y):
        Entity.__init__(self)
        self.image = pygame.image.load('images/bullet.png')  
        self.rect = Rect(x, y, 30, 7)

    def update(self):
        self.rect.right += 4


class Platform(Entity):
    def __init__(self, x, y):
        Entity.__init__(self)
        self.image = Surface((32, 32))
        self.image.convert()
        self.image.fill(Color("#DDDDDD"))
        self.rect = Rect(x, y, 32, 32)

    def update(self):
        pass

class ExitBlock(Platform):
    def __init__(self, x, y):
        Platform.__init__(self, x, y)
        self.image.fill(Color("#0033FF"))

if __name__ == "__main__":
    main()

所以我想知道是否有人可以帮助我并告诉我如何在我的游戏中射击无限子弹并同时保持所有水平移动,而不仅仅是一个.

提前致谢,

【问题讨论】:

    标签: python python-2.7 pygame


    【解决方案1】:

    问题出在第 101 和 124 行

    bullet = Bullet(player_pos[0]+50, player_pos[1]+30)
    entities.add(bullet)
    ...
    # update bullet
    if shoot == True:
        bullet.update()
    

    您将新项目符号添加到实体列表(第 102 行)。但是,当需要移动项目符号时(第 125 行),您只移动最近的一个(项目符号是最新的)。

    您必须更新列表中的每个项目符号,直到它们离开屏幕。

    我不会在这里进行完整的代码审查;我们为此设立了一个单独的小组。但是,请注意“== True”总是是多余的。在这里,只需说“如果拍摄:”

    【讨论】:

    • 我通过制作一个项目符号列表并将所有项目符号添加到列表中来归档它。然后,updating 列表中的每个 bullet
    猜你喜欢
    • 1970-01-01
    • 2018-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多