pygame raycasting纹理

在这里插入图片描述
在这里插入图片描述
插值原理
原理
在这里插入图片描述
在这里插入图片描述
color(x)=(x-x1)/(x2-x1)(color2-color1)+color1 x1<x<x2
假如说x伪3 那么color=(3-x1)/(x2-x1)
(color2-color1)+color
在这里插入图片描述

可是图片纹理 这里不需要两种颜色,只需要获得碰撞点坐标后,如果是水平位置的墙,绿色方块,获取碰撞点x就是纹理的x坐标,也就是uv坐标中的u坐标,v坐标需要计算上面提到的差值,纹理是64X64像素,高度是64,。
这里先看下绘制投影墙是怎么做到的

center = 300h1 = 64 / dis * 277gao = h1 / 2kai = center - gaoen = center + h1
pygame.draw.line(screen, (55,40,140), (x + 100, kai), (x + 100, en))

在这里插入图片描述
计算每一列的高度后,定义从哪里是墙的中间点center,gao是一列的一半,加减gao计算每一列墙的起点与结束点这一列墙其实就是一条线,多条线绘制成投影墙。1起点是kai,结束点是en
碰撞点变量zx,zy
u=zx%64 这里%纹理宽度是为了不超出纹理大小

在这里插入图片描述
在这里插入图片描述
上面图片说明了我们只需要纹理的高度酒能正确映射纹理了,因为纹理横坐标就是碰撞点x坐标%纹理宽度,v需要计算差值color(x)=(x-x1)/(x2-x1)(color2-color1)+color1 x1<x<x2
先开始一个循环,遍历每一列投影墙的y坐标,oy,然后根据差值用当前点oy减去起点kai/结束点en-kai后乘上纹理高度64,原公式(x-x1)/(x2-x1)
(color2-color1)+color1是为了在两种颜色进行渐变,在这里不需要两种颜色,只要知道纹理纵坐标y或者v的起始点与结束点就能差值这一列纹理的颜色
在这里插入图片描述

                for oy in range(int(kai),int(en)):v=(oy-kai)/(en-kai)*64u=zx%64#print(v,oy,en-kai,int(v)%64,ix)#print(zx, zy,cx,cy)#tex_x = int(test_x % 1 * tex_width)  # 使用固定纹理宽度来映射screen.set_at((x, oy), img.get_at((int(u), int(v)%64)))

import pygame
from pygame.locals import *
import sys
import mathpygame.init()width, height = 900, 600
screen = pygame.display.set_mode((width, height))
c=pygame.time.Clock()
q = [[1, 1, 1,1, 1, 1, 1, 1],#0 x坐标[1, 0, 0, 0, 0, 0, 0, 1],#1x坐标[1, 0, 0, 0, 0, 0, 0, 1],#2x坐标[1, 0, 0, 0, 0, 0, 0, 1],#3x坐标[1, 0, 0, 0, 0, 0, 0, 1],#4x坐标[1, 0, 0, 0, 0, 1, 0, 1],#5x坐标[1, 0, 0, 0, 0, 0, 0, 1],[1, 0, 0, 0, 0, 0, 0, 1],[1, 0, 0, 0, 0, 0, 0, 1],[1, 0, 0, 0, 0, 0, 0, 1],[1, 0, 0, 0, 0, 0, 0, 1],#上     下[1, 0, 0, 0, 0, 0, 0, 1],[1,1, 1, 1, 1, 1, 1, 1]#右]px=180
py=270
du=0
left=False
right=False
down=False
up=False
img = pygame.image.load("4.png")  # 替换为您自己的图像文件路径
img=pygame.transform.scale(img,(30,30))xuanzhuanjiao=70
img=pygame.image.load("1.png").convert_alpha()
def player(x,y,zhuan):#pygame.draw.line(screen, (40, 140, 40), (x, y), (74, 713))#print(du)screen.blit(zhuan,(x,y))
while True:screen.fill((255, 255, 255))x = 0#c.tick(70)for event in pygame.event.get():if event.type == QUIT:pygame.quit()sys.exit()keys = pygame.key.get_pressed()if keys[pygame.K_UP]:#print("up")py=py -10if keys[pygame.K_LEFT]:#zuopx=px-1if keys[pygame.K_DOWN]:#xia#print("up")py = py + 10print(q[int(px//60)][int(py//60)],"0控 1强 角色格子",int(px//60),int(py//60))if keys[pygame.K_RIGHT]:#you#xuanzhuanjiao=xuanzhuanjiao+1px=px+1#print(q[int(px // 60)][int(py // 60)], "0控 1强 角色格子", int(px // 60), int(py // 60))#print(sz)#在这直接写会变成子弹,写成函数qiang(ci)就能画成一次,不会移动的墙if keys[pygame.K_a]:xuanzhuanjiao=xuanzhuanjiao+1right=Trueif event.type == pygame.KEYUP:right = Falseif keys[pygame.K_l]:xuanzhuanjiao=xuanzhuanjiao-10#if keys[pygame.K_SPACE]:for h in range(len(q)):#画墙#print(q[h],"行",h)for g in range(len(q[h])):if q[h][g]==1:#print(q[h][g],"个",g,h)pz=pygame.draw.rect(screen, (140, 240, 40), (0+h*60, 0+g*60, 60, 60))screen.blit(img, (180, 0))#qsz.append(pz)#player(px, py, img)for x in range(190):dis=0while True:angle= xuanzhuanjiao - 30 + (x / width) * 60dis=dis+0.1#self.x = dis + math.cos(math.radians(self.xuanzhuanjiao)) * 90#self.y = dis - math.sin(math.radians(self.xuanzhuanjiao)) * 90zx=px+math.cos(math.radians(angle)) * diszy=py - math.sin(math.radians(angle)) * dis#print(dis)#if zx//60<13 and zy//60<7:if q[int(zx//60)][int(zy//60)]==1 :#子弹超出没有强后会显示错误 超出墙索引max_wall_height = height   # 设置墙的最大高度为屏幕高度的2/3# 计算墙的高度,并确保不超过最大墙高wall_height = min(height / dis, max_wall_height)ceiling = (height - wall_height) // 2floor = height - ceilingtex_width = img.get_width()  # 纹理宽度不变#tex_x = int(test_x % 1 * tex_width)  # 使用固定纹理宽度来映射#pygame.draw.line(screen, (140, 40, 40), (x, int(ceiling)*1), (x, int(floor)*1))center = 300h1 = 64 / dis * 277gao = h1 / 2kai = center - gaoen = center + h1pygame.draw.line(screen, (40, 40, 40), (px, py),(zx ,zy))#ix = int(zx % 1 * 64)0#iy = int(300 + gao) % 64cx=zx-math.floor(zx)cy=zy-math.floor(zy)ix = int(zx)%64iy = int(cy*64)%64u=zx#print(kai-en,en,kai)#print(zx,zy)#print(zx % 64, int(zx % 64)%255)#print(zx, zy, zx % 60, x, int(u * 10) % 255)#tex_x = int(zx % 1 * tex_width)  # 使用固定纹理宽度来映射#pygame.draw.line(screen, (int(zx%64)%255,40,140), (x + 100, kai), (x + 100, en))tex_x = int(zx % 64)  # 使用固定纹理宽度来映射# for y in range(int(ceiling), int(floor)):#     tex_y = int((y - ceiling) / (floor - ceiling) * img.get_height())#     if 0 <= tex_x < img.get_width() and 0 <= tex_y < img.get_height():#         screen.set_at((x, y*2), img.get_at((tex_x, tex_y)))for oy in range(int(kai),int(en)):v=(oy-kai)/(en-kai)*64u=cx#print(v,oy,en-kai,int(v)%64,ix)#print(zx, zy,cx,cy)#tex_x = int(test_x % 1 * tex_width)  # 使用固定纹理宽度来映射#pygame.draw.line(screen, (img.get_at((int(ix)%64,int(v)%64))), (x+100,kai), (x+100, en))screen.set_at((x, oy), img.get_at((ix, int(v)%64)))#print(ix,v)#print(dis)breakpygame.display.flip()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/15357.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安卓玩机搞机技巧综合资源----自己手机制作证件照的几种方法 免费制作证件照

接上篇 安卓玩机搞机技巧综合资源------如何提取手机分区 小米机型代码分享等等 【一】 安卓玩机搞机技巧综合资源------开机英文提示解决dm-verity corruption your device is corrupt. 设备内部报错 AB分区等等【二】 安卓玩机搞机技巧综合资源------EROFS分区格式 小米红…

ES基础概念

本文不介绍如何使用ES&#xff08;使用ES见&#xff1a;&#xff09; 1.ES生态圈 ES&#xff1a; Logstash&#xff1a;数据处理服务程序&#xff0c;解析转换加工数据&#xff1b; Kibana&#xff1a;数据展示、集群管理&#xff0c;数据可视化、ES管理与监控、报表等&#xf…

Nature期刊的等级和分类

Nature期刊不用过多介绍&#xff0c;学术界人员都对其有所了解&#xff0c;可以和Science&#xff0c;Cell比肩&#xff0c;Nature旗下创办了很多子刊&#xff0c;系列期刊有一百多种&#xff0c;当然其含金量各有不同&#xff0c;nature旗下的期刊等级你是否都了解了。 Nature…

设计模式——概述

1.设计模式定义 ​ 设计模式是软件设计中常见问题的典型解决方案,可用于解决代码中反复出现的设计问题。设计模式的出现可以让我们站在前人的肩膀上&#xff0c;通过一些成熟的设计方案来指导新项目的开发和设计&#xff0c;以便于我们开发出具有更好的灵活性和可扩展性&#…

JAVAEE之线程(10)_线程池、线程池的创建、实现线程池

一 线程池 1.1为什么要有线程池&#xff1f; 线程池顾名思义是由多个线程所组成&#xff0c;作用就是减少线程的建立与销毁&#xff0c;与数据库连接池相同概念&#xff0c;为了减少连接与释放&#xff0c;从而降低消耗提升效率。 1.2 线程池的优势 总体来说&#xff0c;线程…

【数据分析面试】53.推送消息的分布情况(SQL)

题目 我们有两个表&#xff0c;一个是 notification_deliveries 表&#xff0c;另一个是包含 created 和购买 conversion dates 的 users 表。如果用户没有购买&#xff0c;那么 conversion_date 列为 NULL。 编写一个查询&#xff0c;以获取用户转换前的推送通知总数的分布情…

Java反射角度简单理解spring IOC容器

概述 Java反射&#xff08;Reflection&#xff09;是Java编程语言的一个特性&#xff0c;它允许在运行时对类、接口、字段和方法进行动态查询和操作。反射提供了一种在运行时查看和修改程序行为的能力&#xff0c;这通常用于实现一些高级功能&#xff0c;如框架(Spring)、ORM&…

算法:树状数组

文章目录 面试题 10.10. 数字流的秩327. 区间和的个数315. 计算右侧小于当前元素的个数 树状数组可以理解一种数的存储格式。 面试题 10.10. 数字流的秩 假设你正在读取一串整数。每隔一段时间&#xff0c;你希望能找出数字 x 的秩(小于或等于 x 的值的个数)。 请实现数据结构…

网络信息安全

目录 引言 网络信息安全的基本概念 定义 主要目标 网络信息安全的范围 主要威胁 恶意软件 黑客攻击 拒绝服务攻击 社交工程 内部威胁 常用技术和防护措施 加密技术 防火墙 入侵检测和防御系统 访问控制 多因素认证 安全审计和监控 安全培训和意识提升 未来发…

无人机支持下的自然灾害风险评估技术应用

张老师&#xff08;副教授&#xff09;&#xff0c;长期从事无人机遥感技术与应用&#xff0c;主持多项国家级科研项目&#xff0c;编写著作2部&#xff0c;第一作者发表科研论文20余篇。对无人机遥感的多平台、多传感应用现状以及涉及的核心技术具有很深的理解&#xff0c;精通…

失业潮中如何突围?优秀PPT案例助你职场逆袭

在这个变幻莫测的时代&#xff0c;失业潮像一场突如其来的暴风雨&#xff0c;许多人在职场的大海中迷失方向。但别担心&#xff0c;即使风浪再大&#xff0c;总有勇敢的航海者能够乘风破浪&#xff0c;找到属于自己的那片新大陆。 今天&#xff0c;我们就来聊聊&#xff0c;在…

MyBatis 学习笔记(一)

MyBatis 封装 JDBC :连接、访问、操作数据库中的数据 MyBatis 是一个持久层框架。 MyBatis 提供的持久层框架包括 SQLMaps 和 Data Access Objects&#xff08;DAO&#xff09; SQLMaps&#xff1a;数据库中的数据和 Java数据的一个映射关系 封装 JDBC 的过程Data Access Ob…

C++入门:从C语言到C++的过渡(3)

目录 1.内联函数 1.1内联函数的定义 1.2特性 2.auto关键字 2.1auto的简介 2.2注意事项 3.范围for 4.nullptr空指针 1.内联函数 在C语言中&#xff0c;无论使用宏常量还是宏函数都容易出错&#xff0c;而且无法调试。而C为了弥补这一缺陷&#xff0c;引入了内联函数的概…

为了“降本增效”,我用AI 5天将SpringBoot迁移到了Nodejs

背景 大环境不好&#xff0c;各行各业都在流行“降本增效”&#xff0c;IT行业大肆执行“开猿节流”&#xff0c;一顿操作效果如何&#xff1f;普通搬砖人谁会在乎呢。 为了收紧我的口袋&#xff0c;决定从头学习NodejsTypeScript&#xff0c;来重写我的Java后端服务。 其实这…

浅谈面向对象--知识补充

This关键字 this 内存图 this关键字表示当前对象本身&#xff0c;一般用于类的内部&#xff0c;其内部存在一个地址&#xff0c;指向当前初始化的对象本身。 当new一个对象时&#xff0c;实际上产生了两个引用&#xff0c;一个是供类Dog内部调用其成员变量和成员方法的this关键…

kotlinx.coroutines.debug.AgentPremain

大家好 我是苏麟 . 项目引入AI大模型 debug 出现报错 设置 勾选

配置docker阿里云镜像地址

一、安装docker的步骤&#xff1a; 1.yum install -y yum-utils 2.yum-config-manager --add-repo http://mirrors.aliyun.com/docker- ce/linux/centos/docker-ce.repo --配置阿里云仓库3.yum makecache fast4.yum install docker-ce -y5.docker version …

Vue3实战笔记(43)—Vue3组合式API下封装可复用ECharts图表组件

文章目录 前言一、封装echart图标钩子二、使用步骤总结 前言 接上文&#xff0c;已经安装好了ECharts&#xff0c;开始封装组件方便使用。 一、封装echart图标钩子 首先应用我们之前学习的钩子方式&#xff0c;在hooks目录下创建一个名为 useECharts.js 的文件&#xff0c;用…

【机器学习300问】97、机器学习中哪些是凸优化问题,哪些是非凸优化问题?

在机器学习的领域中&#xff0c;多数模型的参数估计问题实质上可以转化为优化问题。鉴于机器学习模型的多样性&#xff0c;不同的模型会对应着不同的损失函数&#xff0c;进而形成各具特色的优化问题。了解优化问题的形式和特点&#xff0c;对于提升我们求解模型参数的效率和准…

微信好友这样打标签更高效!

为什么要做标签管理? ① 通过标签管理&#xff0c;可以清晰的知道每个私域好友的关系程度&#xff0c;如哪些是忠诚客户&#xff0c;哪些是意向客户&#xff0c;哪些是刚加上的客户等等。 这样就知道下一步要怎么操作&#xff0c;做到精细化运营。如忠诚客户跟进维护&#x…