pygame raycasting纹理

news2025/3/15 0:20:27

在这里插入图片描述
在这里插入图片描述
插值原理
原理
在这里插入图片描述
在这里插入图片描述
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()

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

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

相关文章

腾讯面试:如何提升Kafka吞吐量?

面试题大全&#xff1a;www.javacn.site Kafka 是一个分布式流处理平台和消息系统&#xff0c;用于构建实时数据管道和流应用。它最初由 LinkedIn 开发&#xff0c;后来成为 Apache 软件基金会的顶级项目。 Kafka 特点是高吞吐量、分布式架构、支持持久化、集群水平扩展和消费组…

uniapp 对接 微信App/支付宝App 支付

相关文档&#xff1a;uni.requestPayment(OBJECT) | uni-app官网 示例代码&#xff1a; import qs from qsasync aliPay(){const { provider } await uni.getProvider({ service:payment })if(provider.includes(alipay)){uni.request({url:后端接口地址,data:{ //传参 },suc…

Linux服务升级:Twemproxy 升级 Redis代理

目录 一、实验 1.环境 2.多实例Redis部署 3.Twemproxy 升级Redis代理 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 系统版本软件IP备注CentOS7.9Twemproxy192.168.204.200 Redis代理 Redis127.0.0.1:6379第一个Redis实例 Redis127.0.0.1:6380第二个…

ssm141餐厅点菜管理系统+vue

餐厅点菜管理系统的设计与实现 摘 要 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&#xff0c;尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代&#xff0c;所以对于信息的宣传和管…

2024年山东省安全员C证证考试题库及山东省安全员C证试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年山东省安全员C证证考试题库及山东省安全员C证试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作业人员上岗证考试大…

如何选择一款安全高效的数据自动同步工具?

随着科技的不断发展&#xff0c;企业处理的数据量愈发庞大。数字化浪潮的涌现使得数据在业务活动和决策中的角色变得日益重要&#xff0c;然而这些数据往往分布在不同的位置&#xff0c;需要进行同步和分类&#xff0c;以便更有效地利用。以下是一些常见的数据自动同步场景&…

快速分析变量间关系(Boruta+SHAP+RCS)的 APP(streamlit)

快速分析变量间关系&#xff08;BorutaSHAPRCS&#xff09;的 APP&#xff08;streamlit&#xff09; 以下情况下&#xff0c;你需要这个快速分析的APP: 正式分析之前的预分析&#xff0c;有助于确定分析的方向和重点变量&#xff1b;收集变量过程中&#xff0c;监测收集的变量…

专业渗透测试 Phpsploit-Framework(PSF)框架软件小白入门教程(十一)

本系列课程&#xff0c;将重点讲解Phpsploit-Framework框架软件的基础使用&#xff01; 本文章仅提供学习&#xff0c;切勿将其用于不法手段&#xff01; 接上一篇文章内容&#xff0c;讲述如何进行Phpsploit-Framework软件的基础使用和二次开发。 我们&#xff0c;继续讲一…

销量翻倍不是梦!亚马逊速卖通自养号测评实战技巧分享!

在亚马逊、速卖通这些跨境电商平台上&#xff0c;卖家们都在想各种办法让自己的产品卖得更好。现在&#xff0c;有一种叫做“自养号测评”的方法特别火。简单来说&#xff0c;就是自己养一些买家账号&#xff0c;然后让这些账号来给你的产品写好评。这样&#xff0c;你的产品就…

Flume 的基本介绍和安装部署

一、Flume 概述 Flume 是 Cloudera 提供的一个高可用的&#xff0c;高可靠的&#xff0c;分布式的海量日志采集、聚合和传输的框架服务 Flume 基于流式架构&#xff0c;灵活简单&#xff0c;能够实时读取服务器本地磁盘的数据&#xff0c;将数据写入到 HDFS 二、Flume 基础架构…

依赖的各种java库(工具类) :fastjson,lombok,jedis,druid,mybatis等

lombok 功能&#xff1a; Lombok 是一个实用的Java类库&#xff0c;可以通过简单的注解来简化和消除一些必须有但显得很臃肿的Java代码。 导入包&#xff1a;使用Lombok首先要将其作为依赖添加到项目中&#xff0c;在pom.xml文件中手动添加 <dependency><groupId&g…

深入探索Python基础:两个至关重要的函数

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、初学者的基石&#xff1a;print与input函数 二、类型转换&#xff1a;从字符串到浮点数…

【论文阅读】使用深度学习及格子玻尔兹曼模拟对SEM图像表征粘土结构及其对储层的影响

文章目录 0、论文基本信息1、深度学习2、可运行程序—Matlab3、深度切片3、LBM模拟4、局限性 0、论文基本信息 论文标题&#xff1a;Characterizing clay textures and their impact on the reservoir using deep learning and Lattice-Boltzmann simulation applied to SEM i…

Android Gradle开发、应用、插件发布(六)—实现打包自动复制文件插件

1. 前言 项目中遇到了一个问题 : 其中一个模块MyLibrary的assets文件夹中&#xff0c;需要存放很多文件(每个文件对应一个功能)。 这样导致的问题是MyLibrary打出的这个aar包体积特别大。 如果把MyLibrary严谨地拆解成若干个Module又比较费时&#xff0c;对于现在业务现状来…

HTML静态网页成品作业(HTML+CSS)——宠物狗介绍网页(3个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有3个页面。 二、作品演示 三、代…

轻松调用其他工程的Python文件,提升编程效率

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 一、前言 在Python开发过程中&#xff0c;经常会遇到需要在一个工程中调用另一个工程的Python文件的情况。这种情况通常发生在需要复用已有代码或者进行模块化开发时。那么&#xff0c;如何实现这一目标呢&#xff…

JVM(三)

在上一篇中&#xff0c;介绍了JVM组件中的类加载器&#xff0c;以及相关的双亲委派机制。这一篇主要介绍运行时的数据区域 JVM架构图&#xff1a; JDK1.8后的内存结构&#xff1a; (图片来源&#xff1a;https://github.com/Seazean/JavaNote) 而在运行时数据区域中&#…

SpringBoot+Vue开发记录(五)-- 数据库设计

我去&#xff0c;时隔这么久又开始了QAQ。主要是还是自己太懒了。 本篇文章的主要内容是数据库设计。 先简单创建个数据库&#xff1a; 这是创建好了的&#xff1a; 一、数据库设计 先就做一个很简单的设计&#xff0c;里面就只有用户和题。 大概就这样&#xff1a; 二、创…

【学习笔记】Windows GDI绘图目录

题外话 不知几时开始&#xff0c;觉得学习过程中将内容记录下来&#xff0c;有助于加强记忆&#xff0c;还方便后续查找&#xff0c;顺便帮助有需要的人&#xff0c;更有来自您阅读、点赞、收藏和评论时给我带来的动力与兴奋。 目录 【学习笔记】Windows GDI绘图(一)图形概述…

如何从U盘恢复误删除的文件

在许多情况下&#xff0c;用户可能会发现其U盘上的数据误删&#xff0c;并且无法访问或恢复它。在这篇文章中&#xff0c;我们将看到如何使用命令提示符尝试从U盘恢复损坏的文件和数据。我们还将列出一些免费的U盘恢复软件及其独特的功能&#xff0c;以便在前一种方法无法产生所…