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 = 300
				h1 = 64 / dis * 277
                gao = h1 / 2
                kai = center - gao
                en = 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)*64
                    u=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 math

pygame.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 -10
        if keys[pygame.K_LEFT]:#zuo
            px=px-1
        if keys[pygame.K_DOWN]:#xia
            #print("up")
            py = py + 10
            print(q[int(px//60)][int(py//60)],"0控 1强 角色格子",int(px//60),int(py//60))
        if keys[pygame.K_RIGHT]:#you
            #xuanzhuanjiao=xuanzhuanjiao+1
            px=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+1

            right=True
        if event.type == pygame.KEYUP:
            right = False
        if 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=0
        while True:
            angle= xuanzhuanjiao - 30 + (x / width) * 60
            dis=dis+0.1
            #self.x = dis + math.cos(math.radians(self.xuanzhuanjiao)) * 90
            #self.y = dis - math.sin(math.radians(self.xuanzhuanjiao)) * 90
            zx=px+math.cos(math.radians(angle)) * dis
            zy=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) // 2
                floor = height - ceiling
                tex_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 = 300
                h1 = 64 / dis * 277
                gao = h1 / 2
                kai = center - gao
                en = center + h1
                pygame.draw.line(screen, (40, 40, 40), (px, py),
                                (zx ,zy))
                #ix = int(zx % 1 * 64)0
                #iy = int(300 + gao) % 64

                cx=zx-math.floor(zx)
                cy=zy-math.floor(zy)
                ix = int(zx)%64
                iy = int(cy*64)%64
                u=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)*64
                    u=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)
                break

    pygame.display.flip()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

golang中的字节序 binary BigEndian 大端 , LittleEndian 小端 理解与write写入注意事项

在golang的binary包中有2个字节系的变量定义BigEndian和LittleEndian 这个东西是go里面很有特点的玩意&#xff0c;我们在java, php等语言中是基本看不到&#xff0c;因为大部分的语言默认使用的是BigEndian 大端模式&#xff0c; 而go语言里面是你自己可选的。 这个字节系大小…

[激光原理与应用-93]:激光焊接检测传感器中常用的聚焦镜、分色镜、分光镜、滤波镜

目录 一、聚焦镜 1.1 原理及作用 1.2 性能指标 1.3 应用 1.4 类型 二、分色镜 2.1 原理及应用 2.2 种类 2.3 特点 2.4 注意事项 2.5 性能指标 三、分光镜 ​编辑 3.1 分光镜的类型 3.2 分光镜的工作原理 3.3 分光镜的应用 3.4 分光镜的参数 3.5 分光镜的优点…

【30天精通Prometheus:一站式监控实战指南】第8天:redis_exporter从入门到实战:安装、配置详解与生产环境搭建指南,超详细

亲爱的读者们&#x1f44b;   欢迎加入【30天精通Prometheus】专栏&#xff01;&#x1f4da; 在这里&#xff0c;我们将探索Prometheus的强大功能&#xff0c;并将其应用于实际监控中。这个专栏都将为你提供宝贵的实战经验。&#x1f680;   Prometheus是云原生和DevOps的…

CSDN 自动评论互动脚本

声明 该脚本的目的只是为了提升博客创作效率和博主互动效率,希望大家还是要尊重各位博主的劳动成果。 数据库设计 尽量我们要新建一个数据库csdn_article,再在其中建一个数据表article -- csdn_article-- article-- 需要进行自动评论的表格信息...CREATE TABLE `article`…

弱密码系统登录之后强制修改密码

在你登录的时候&#xff0c;获取到弱密码&#xff0c;然后将他存到vuex里面&#xff0c;在登录进去之后&#xff0c;index页面再去取&#xff0c;思路是这样的 一、vuex里面定义密码字段 我是直接在user.js里面写的 import { login, logout, getInfo } from /api/login impo…

pyqt6入门案例

效果预览 hello.ui <?xml version"1.0" encoding"UTF-8"?> <ui version"4.0"><class>Dialog</class><widget class"QDialog" name"Dialog"><property name"geometry"><…

View function mapping is overwriting an existing endpoint function: home_page

这个错误是因为在你的 Flask 应用中,你定义了两个或多个视图函数,它们使用了相同的 endpoint 名称。Flask 不允许多个视图函数使用相同的 endpoint 名称,因为这会导致冲突。 通常,这个错误会出现在以下几种情况下: 你在不同的路由装饰器中使用了相同的 endpoint 名称。你…

不知道是该怎么引用多个函数片段?具体示例如代码

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

C++字符编码 cppp-reiconv库使用详解

经常写一些控制台小程序&#xff0c;常常会遇到输出中文乱码的问题&#xff0c;在windwos下可以使用MultiByteToWideChar转换字符编码&#xff0c;但跨平台就需要cppp-reiconv这样的第三方字符编码处理库&#xff0c;且开源。 一、下载cppp-reiconv库的源码和静/动态库 GitHu…

从0开始实现一个博客系统 (SSM 实现)

相关技术 Spring Spring Boot Spring MVC MyBatis Html Css JS pom 文件我就不放出来了, 之前用的 jdk8 做的, MySQL 用的 5.7, 都有点老了, 你们自己看着配版本就好 实现功能 用户注册 - 密码加盐加密 (md5 加密)前后端用户信息存储 - 令牌技术用户登录 - (使用 拦截…

Java进阶学习笔记15——接口概述

认识接口&#xff1a; Java提供了一个关键字Interface&#xff0c;用这个关键字我们可以定义一个特殊的结构&#xff1a;接口。 接口不能创建对象。 注意&#xff1a;接口不能创建对象&#xff0c;接口是用来被类实现&#xff08;implements&#xff09;的&#xff0c;实现接口…

04Django项目基本运行逻辑及模板资源套用

对应视频链接点击直达 Django项目用户管理及模板资源 对应视频链接点击直达1.基本运行逻辑Django的基本运行路线&#xff1a;视图views.py中的 纯操作、数据返回、页面渲染 2.模版套用1.寻找一个好的模版2.模板部署--修改适配联动 OVER&#xff0c;不会有人不会吧不会的加Q1394…

光伏项目怎么做预算?

随着可再生能源行业的蓬勃发展&#xff0c;光伏行业也得到了扩张。许多想要加入光伏项目投资的人&#xff0c;都在为怎样为项目做预算而苦恼&#xff0c;今天我就来跟大家分析下可以怎么做。 一、了解市场需求&#xff0c;确定预算目标 在制定光伏项目预算方案之前&#xff0c…

三前奏:获取/ 读取/ 评估数据【数据分析】

各位大佬好 &#xff0c;这里是阿川的博客 &#xff0c; 祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 前面的博客 数据分析—技术栈和开发环境搭建 …

NASA数据——AIRS 颗粒地图产品包括 PDF 和 JPG 格式的颗粒覆盖图像

AIRS/Aqua Granule map product V005 (AIRXAMAP) at GES DISC 美国国家航空航天局 Aqua 卫星上的大气红外探测器 AIRS是美国宇航局Aqua卫星上的大气红外探测器&#xff0c;每天在全球范围内收集地球表面和大气层发射的红外能量。其数据提供了大气柱中温度和水蒸气的三维测量值…

服务器数据恢复—RAID5阵列崩溃如何恢复上层OA和oracle数据库的数据?

服务器数据恢复环境&故障&#xff1a; 某公司的一台服务器中的raid5磁盘阵列有两块磁盘先后掉线&#xff0c;服务器崩溃。故障服务器的操作系统为linux&#xff0c;操作系统部署了oa&#xff0c;数据库为oracle。oracle数据库已经不再对该oa系统提供后续支持&#xff0c;用…

解决移植Metasploitable3到VM虚拟机无网络的问题

第一步 导入后不要开机&#xff0c;先在虚拟机设置里面将原有的两个网络适配器移除。 第二步 接着在选项里面&#xff0c;在客户机操作系统里面&#xff0c;选择Microsoft Windwos(W)&#xff0c; 版本选择Windows Server 2008 R2 x64 第三步 先打开虚拟机&#xff0c;然后…

2024-05学习笔记

最近的学习大多都是和mysql的索引相关的 1.mvcc mvcc是不需要手动配置&#xff0c;是mysql的一个机制 在事务开启时&#xff0c;对涉及到的数据加一个隐藏列&#xff0c;隐藏列对应的值&#xff0c;就是事务id 如果当前是修改操作&#xff0c;就copy一份原来的数据到新的一行…

网络安全架构之零信任安全

网络安全架构之零信任安全 文章目录 网络安全架构之零信任安全零信任安全时代背景安全世界“新旧时代”各种攻击风险层出不穷网络安全边界逐渐瓦解内外部威胁愈演愈烈 零信任架构零信任的理念在不可信的网络环境下重建信任构建自适应内生安全机制以身份为基石业务安全访问持续信…

躺赚零撸项目,看广告赚红包,零门槛提现,秒到账,单机每日100+

这个项目是跟广告商直接对接的&#xff0c;跟以前小游戏看广告差不多&#xff0c;看完广告得金币5000个兑换5毛钱。 不过这个是可以直接提现&#xff0c;而是无门槛就可以提&#xff0c;有设备就可以操作&#xff0c;有空边看连续剧边刷也是挺香的&#xff0c;单机可以达到100…