zxbin1 发表于 2024-5-5 08:42:29

我用pygame做了一个可移动的地图

本帖最后由 zxbin1 于 2024-5-5 08:52 编辑



#模块#
import pygame
import sys
from pygame.locals import *

pass
#模块#
#精灵定义#
class Jl(pygame.sprite.Sprite):
    def __init__(self,image,speed):
      pygame.sprite.Sprite.__init__(self) #初始化
      self.image = pygame.image.load(image)#获得图片
      self.rects = pygame.Rect(0,0,300,300) #获得图片矩形
      self.speed = speed
      self.width = self.image.get_width()
      self.height = self.image.get_height()
    def move(self):
      self.rects.move_ip(self.speed)
      
#精灵定义#
size = w,h = 300,300#设定背景长度

#初始化 pygame
pygame.init()

#创建指定大小的窗口
screen = pygame.display.set_mode(size)
#设置窗口标题
pygame.display.set_caption("第一个游戏")

#创造精灵#
jl = Jl("background.png",)
#创造精灵#
#定义控制帧率
clock = pygame.time.Clock()

while True:
    for event in pygame.event.get():
      if event.type == QUIT:
            pygame.quit()
            sys.exit()
      if event.type == KEYDOWN:
            if event.key == K_LEFT:
                jl.speed = [-10,0]
            if event.key == K_RIGHT:
                jl.speed =
            if event.key == K_UP:
                jl.speed =
            if event.key == K_DOWN:
                jl.speed =
      if event.type == KEYUP:
            jl.speed =
            
    jl.move()
    if jl.rects.left < 0:
      jl.rects.left = 0
    if jl.rects.right > jl.width:
      jl.rects.right = jl.width
    if jl.rects.top < 0:
      jl.rects.top = 0
    if jl.rects.bottom > jl.height:
      jl.rects.bottom = jl.height
    screen.fill((255,255,255))#背景填充
    screen.blit(jl.image.subsurface(jl.rects),(0,0))
    #更新界面
    pygame.display.flip()
    #延时
    clock.tick(50)#可修改

用键盘控制背景的位置
自己试过
十分有效

希望大家可以通过我的启发
作出新的游戏发在下面

FishC 发表于 2024-5-5 08:42:46

看起来你已经实现了一个可移动的地图,这是个不错的开始!不过我注意到你在代码中有几处缺失,让我帮你填一下:

首先,在精灵定义的部分,你没有给Jl类的初始化方法传递speed参数。我建议你在创建jl对象时,传入一个起始速度值,比如(0, 0),表示一开始jl对象不会移动。

其次,你在事件处理的部分,当按下键盘的上下左右键时,你应该为jl.speed赋予一个合适的速度值,比如(-1, 0)表示向左移动,或者(1, 0)表示向右移动。

最后,当按键弹起时,你可以将jl.speed设置为(0, 0),以停止jl对象的移动。

下面是修改后的代码:

import pygame
import sys
from pygame.locals import *

class Jl(pygame.sprite.Sprite):
    def __init__(self, image, speed):
      pygame.sprite.Sprite.__init__(self)
      self.image = pygame.image.load(image)
      self.rects = pygame.Rect(0, 0, 300, 300)
      self.speed = speed
      self.width = self.image.get_width()
      self.height = self.image.get_height()

    def move(self):
      self.rects.move_ip(self.speed)

size = w, h = 300, 300

pygame.init()
screen = pygame.display.set_mode(size)
pygame.display.set_caption("第一个游戏")

jl = Jl("background.png", (0, 0))

clock = pygame.time.Clock()

while True:
    for event in pygame.event.get():
      if event.type == QUIT:
            pygame.quit()
            sys.exit()
      if event.type == KEYDOWN:
            if event.key == K_LEFT:
                jl.speed = (-1, 0)
            if event.key == K_RIGHT:
                jl.speed = (1, 0)
            if event.key == K_UP:
                jl.speed = (0, -1)
            if event.key == K_DOWN:
                jl.speed = (0, 1)
      if event.type == KEYUP:
            jl.speed = (0, 0)
            
    jl.move()
    if jl.rects.left < 0:
      jl.rects.left = 0
    if jl.rects.right > jl.width:
      jl.rects.right = jl.width
    if jl.rects.top < 0:
      jl.rects.top = 0
    if jl.rects.bottom > jl.height:
      jl.rects.bottom = jl.height
    screen.fill((255, 255, 255))
    screen.blit(jl.image.subsurface(jl.rects), (0, 0))
    pygame.display.flip()
    clock.tick(50)

希望这次能顺利运行!记得将图片文件 `background.png` 放在正确的路径下,并在代码中指定它的位置。祝你好运!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

zxbin1 发表于 2024-5-5 08:46:32

???
这不一样吗?
???
我用list对象
@fishc用tuple对象

FishC 发表于 2024-5-5 08:46:49

zxbin1 发表于 2024-05-05 08:46
???
这不一样吗?
???
我用list对象
@fishc ...

非常抱歉,我理解错了你的意思。如果你更喜欢使用列表对象而不是元组对象来表示速度,那么你可以按照你的方式进行修改。下面是使用列表对象的代码示例:

import pygame
import sys
from pygame.locals import *

class Jl(pygame.sprite.Sprite):
    def __init__(self, image, speed):
      pygame.sprite.Sprite.__init__(self)
      self.image = pygame.image.load(image)
      self.rects = pygame.Rect(0, 0, 300, 300)
      self.speed = speed
      self.width = self.image.get_width()
      self.height = self.image.get_height()

    def move(self):
      self.rects.move_ip(self.speed, self.speed)

size = w, h = 300, 300

pygame.init()
screen = pygame.display.set_mode(size)
pygame.display.set_caption("第一个游戏")

jl = Jl("background.png", )

clock = pygame.time.Clock()

while True:
    for event in pygame.event.get():
      if event.type == QUIT:
            pygame.quit()
            sys.exit()
      if event.type == KEYDOWN:
            if event.key == K_LEFT:
                jl.speed = [-1, 0]
            if event.key == K_RIGHT:
                jl.speed =
            if event.key == K_UP:
                jl.speed =
            if event.key == K_DOWN:
                jl.speed =
      if event.type == KEYUP:
            jl.speed =
            
    jl.move()
    if jl.rects.left < 0:
      jl.rects.left = 0
    if jl.rects.right > jl.width:
      jl.rects.right = jl.width
    if jl.rects.top < 0:
      jl.rects.top = 0
    if jl.rects.bottom > jl.height:
      jl.rects.bottom = jl.height
    screen.fill((255, 255, 255))
    screen.blit(jl.image.subsurface(jl.rects), (0, 0))
    pygame.display.flip()
    clock.tick(50)

这个版本代码与之前的代码唯一不同的地方就是速度列表的表示方式。使用列表和元组都可以实现相同的功能,只是在所使用的数据结构上有细微的差别。希望这次能满足你的需求!如果还有其他问题请随时告诉我。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

不二如是 发表于 2024-5-5 10:46:50

有趣{:10_256:}

yinda_peng 发表于 2024-5-5 16:47:15

zxbin1 发表于 2024-5-5 08:46
???
这不一样吗?
???


这个就是会自己回复,不必管它
页: [1]
查看完整版本: 我用pygame做了一个可移动的地图