鱼C论坛

 找回密码
 立即注册
查看: 718|回复: 7

[作品展示] 当你将堆叠法伪3d运用到实操当中。。。。

[复制链接]
发表于 2024-8-28 17:36:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 cjjJasonchen 于 2024-8-28 17:38 编辑

旋转的伪3d史莱姆

旋转的伪3d史莱姆




俯仰正负90度(后续可能改成360度全向),绕X轴旋转360度

通过pygame的get_at和set_at函数,设置史莱姆的表情

  1. """
  2. 俯视视角下的伪3D实现测试(切片堆叠法
  3. """

  4. import pygame
  5. import sys, pickle
  6. from typing import List
  7. from pygame.locals import *


  8. class Sprites3D:
  9.     X, Y, Z = 0, 1, 2

  10.     def __init__(
  11.             self,
  12.             images: [],  # 图像列表[image1, image2, ...] 从上到下
  13.             angle: [],  # 角度列表 图片中心为中心,俯仰角度
  14.             position: [],  # 位置 x, y
  15.     ):
  16.         self.images = images
  17.         self.angle = angle
  18.         self.rect = self.images[-1].get_rect()
  19.         self.rect.center = position
  20.         self.height = len(self.images)

  21.     def set_face(self, image, width=15):
  22.         """设置表情,接受一张高度、宽度与自身相同的图片"""
  23.         rect = image.get_rect()
  24.         images = self.images
  25.         range_x = range(rect[2])
  26.         range_w = range(87,95)
  27.         for index in range(len(images)):  # 被替换的图片的索引
  28.             for x in range_x:  # 表情的x轴位置
  29.                 for width in range_w:
  30.                     images[index].set_at((x, width), image.get_at((x, index)))



  31.     def update(self):
  32.         pass

  33.     def draw(self, screen):
  34.         h = self.height
  35.         angle = self.angle
  36.         shift = 0  # 每张图片向上的偏移量
  37.         for index in range(h-1, -1, -1):
  38.             image = self.images[index]
  39.             image = pygame.transform.rotate(image, angle[0])

  40.             # 俯仰
  41.             if -45 <= angle[1] <= 45:
  42.                 shift += (angle[1] / 45) * 0.75
  43.             elif -90 <= angle[1] < -45:
  44.                 shift += ((angle[1] + 45) / 45) * 0.25 - 0.75
  45.             elif 45 < angle[1] <= 90:
  46.                 shift += ((angle[1] - 45) / 45) * 0.25 + 0.75

  47.             rect = image.get_rect()
  48.             image = pygame.transform.smoothscale(image,[rect[2], rect[3] * (1 - abs(angle[1] / 90))])
  49.             rect = image.get_rect()
  50.             rect.center = self.rect.centerx, self.rect.centery
  51.             rect.y += shift

  52.             screen.blit(image, rect)



  53. # 颜色常量
  54. WHITE = (255,255,255)
  55. BLACK = (0,0,0)


  56. size = width, height = 800,600

  57. screen = pygame.display.set_mode(size)

  58. pygame.display.set_caption("title")

  59. clock = pygame.time.Clock()

  60. delay = 60 # 延时计时器(1秒)

  61. # 是否全屏
  62. fullscreen = False
  63. screen_change = False

  64. # 背景颜色设定
  65. bg_color = WHITE

  66. running = True

  67. # 伪3d对象
  68. image_list = []
  69. for i in range(12):
  70.     image_list.append(pygame.image.load("images/top.png"))
  71. for i in range(75):
  72.     image_list.append(pygame.image.load("images/center.png"))
  73. for i in range(13):
  74.     image_list.append(pygame.image.load("images/top.png"))
  75. s3d = Sprites3D(image_list,[30,-50],[200,200])
  76. s3d.set_face(pygame.image.load("images/face1.png"))

  77. while running:

  78.     # 设定帧数
  79.     clock.tick(60)

  80.     # 延时计时器刷新
  81.     if delay == 0:
  82.         delay = 60

  83.     delay -= 1

  84.     # 检测是否全屏
  85.     if fullscreen and screen_change:
  86.         screen = pygame.display.set_mode(size,FULLSCREEN,HWSURFACE)
  87.         screen_change = False
  88.     elif screen_change:
  89.         screen = pygame.display.set_mode(size)
  90.         screen_change = False

  91.     # 事件检测
  92.     for event in pygame.event.get():
  93.         if event.type == QUIT:
  94.             pygame.quit()
  95.             sys.exit()

  96.         # 鼠标
  97.         if event.type == MOUSEBUTTONDOWN:
  98.             print(1)
  99.             

  100.         # 按键按下事件
  101.         if event.type == KEYDOWN:
  102.             if event.key == K_ESCAPE:
  103.                 pygame.quit()
  104.                 sys.exit()
  105.                
  106.             #F11切换全屏
  107.             if event.key == K_F11:
  108.                 fullscreen = not fullscreen
  109.                 screen_change = True

  110.             if event.key == K_UP:
  111.                 print("up1")
  112.                 if s3d.angle[1] > -85:
  113.                    s3d.angle[1] -= 5
  114.                    print("up2")
  115.                   
  116.             elif event.key == K_DOWN:
  117.                 if s3d.angle[1] < 85:
  118.                    s3d.angle[1] += 5

  119.             elif event.key == K_LEFT:
  120.                    s3d.angle[0] -= 5

  121.             elif event.key == K_RIGHT:
  122.                    s3d.angle[0] += 5

  123.             elif event.key == K_1:
  124.                 s3d.set_face(pygame.image.load("images/face1.png"))

  125.             elif event.key == K_2:
  126.                 s3d.set_face(pygame.image.load("images/face2.png"))

  127.             elif event.key == K_3:
  128.                 s3d.set_face(pygame.image.load("images/face3.png"))

  129.         # 按键抬起事件
  130.         if event.type == KEYUP:
  131.             pass

  132.     #画背景
  133.     screen.fill(bg_color)

  134.     # 刷新xxx
  135.     s3d.update()

  136.     #画 xxxx
  137.     s3d.draw(screen)
  138.    
  139.     # 刷新界面
  140.     pygame.display.update()


复制代码



按键:

1:方眼睛方嘴巴
2:委屈脸
3:笑脸
上:抬头
下:低头
左:左旋转
右:右旋转

素材:

center.png

center.png

face1.png

face1.png

face2.png

face2.png

top.png

top.png

face3.png

face3.png



注意:这个帖子会持续更新,欢迎大家借鉴,后续会将这个角色作为我下一个游戏实操项目的主角

求评分啦~




评分

参与人数 8荣誉 +23 鱼币 +23 贡献 +15 收起 理由
某一个“天” + 5 高手
python爱好者. + 5 + 1 + 3 鱼C有你更精彩^_^
Lynn_oyl + 1 + 1 鱼C有你更精彩^_^
不二如是 + 2 + 3 + 3 鱼C有你更精彩^_^
Ewan-Ahiouy + 5 + 5 感谢楼主无私奉献!
zhangchenyvn + 5 + 5 + 3 666,牛哇!
yinda_peng + 3 + 3 感谢楼主无私奉献!
小甲鱼 + 2 + 3 + 3 无条件支持楼主!

查看全部评分

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-8-28 17:37:01 | 显示全部楼层
堆叠法伪3D是一种通过在2D平面上堆叠多个图层来模拟3D效果的技术。以下是如何将堆叠法伪3D运用到实际项目中的简要步骤:

1. **准备图层**:将每个图层的图像准备好,这些图像将代表不同的深度。

2. **设置图层位置**:根据每个图层的深度,设置它们在2D平面上的位置。通常,较远的图层会放置在较低的位置。

3. **调整透明度**:为了增强3D效果,可以调整每个图层的透明度,使得较远的图层更加透明。

4. **添加交互**:如果需要交互效果,可以通过鼠标或触摸事件来改变图层的位置或透明度,从而模拟视角的变化。

以下是一个简单的HTML和CSS示例,展示了如何使用堆叠法伪3D效果:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>Stacked Pseudo 3D</title>
  7.     <style>
  8.         .layer {
  9.             position: absolute;
  10.             width: 100%;
  11.             height: 100%;
  12.             background-size: cover;
  13.         }
  14.         .layer1 { background-image: url('layer1.png'); z-index: 1; opacity: 0.9; }
  15.         .layer2 { background-image: url('layer2.png'); z-index: 2; opacity: 0.7; }
  16.         .layer3 { background-image: url('layer3.png'); z-index: 3; opacity: 0.5; }
  17.     </style>
  18. </head>
  19. <body>
  20.     <div class="layer layer1"></div>
  21.     <div class="layer layer2"></div>
  22.     <div class="layer layer3"></div>
  23. </body>
  24. </html>
复制代码


这个示例中,我们使用了三个图层,每个图层都有不同的透明度和z-index,以模拟深度效果。你可以根据需要调整图层的数量、位置和透明度,以实现更复杂的3D效果。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-28 20:45:15 | 显示全部楼层
有意思!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-31 22:12:21 | 显示全部楼层
可爱的史莱姆)
开学咯,最近我好久没来论坛了,忙着预习哇...
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-31 22:12:57 | 显示全部楼层
期待真3d(bushi
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-9-1 09:49:03 | 显示全部楼层

真3d试过了,感觉只用pygame的画太麻烦了,长方体的八个顶点还比较好算,但是把图片渲染到长方体上非常困难

可能还是需要使用opengl。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-2-6 21:29:12 | 显示全部楼层
FishC 发表于 2024-8-28 17:37
堆叠法伪3D是一种通过在2D平面上堆叠多个图层来模拟3D效果的技术。以下是如何将堆叠法伪3D运用到实际项目中 ...

太厉害了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-2-6 21:29:18 | 显示全部楼层
孙文博 发表于 2025-02-06 21:29
FishC 发表于 2024-8-28 17:37
堆叠法伪3D是一种通过 ...


谢谢夸奖!如果你在运用堆叠法伪3D时遇到任何问题,欢迎随时提问。我会尽力帮助你解答。祝你项目顺利!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-6 02:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表