在c#控制台中使用Raylib-cs库,绘制控制小球和插入音频(附带c++中小球的控制代码)

news2025/1/12 3:46:31

下载网址

GitHub - chrisdill/raylib-cs: C# bindings for raylib, a simple and easy-to-use library to learn videogames programming

克隆库

克隆GitHub仓库-CSDN博客

1 .制作dll

点击

生成之后就会多出这些东西

2.在项目中添加dll

然后就导进来了

测试一下用例代码

using Raylib_cs;

namespace HelloWorld;

class Program
{
    public static void Main()
    {
        Raylib.InitWindow(800, 480, "Hello World");

        while (!Raylib.WindowShouldClose())
        {
            Raylib.BeginDrawing();
            Raylib.ClearBackground(Color.White);

            Raylib.DrawText("Hello, world!", 12, 12, 20, Color.Black);

            Raylib.EndDrawing();
        }

        Raylib.CloseWindow();
    }
}

会发现现在还有问题

找不到dll库

是因为版本不对,这个是6.0的库

右键->管理 NuGet 程序包(N)

下载第二个,下载完以后就不会报错了

运行

小框出来哩

游戏:视觉,操作,音频

 3.Raylib基本图形绘制方法

3.1二维图形绘制基础

// 初始化窗口参数
int screenWidth = 800;
int screenHeight = 450;
InitWindow(screenWidth, screenHeight, "Example Window");
 
// 设置绘图颜色
SetTargetFPS(60); // 设置帧率
Color color = new Color(255, 0, 0, 255); // 红色
 
// 主循环
while (!WindowShouldClose()) // 检查窗口是否关闭
{
    // 绘制背景色
    ClearBackground(RAYWHITE); // 清除屏幕为白色
 
    // 绘制一条线
    DrawLine(10, 10, screenWidth - 10, screenHeight - 10, color);
 
    // 更新屏幕
    BeginDrawing();
    EndDrawing();
}
 
// 关闭窗口并释放资源
CloseWindow();

 3.1.1绘制线条、圆形和多边形

绘制一条从坐标(100,100)到(200,200)的线条

DrawLine(100, 100, 200, 200, Color.RED);

绘制一个位于坐标(160, 160)、半径为60像素

DrawCircle(160, 160, 60, Color.BLUE);

绘制一个四边形( DrawPoly函数需要一系列的点来定义多边形的形状和顶点。这些点是按照顺序连接的)

Vector2[] points = { new Vector2(200, 200), new Vector2(250, 300), new Vector2(300, 200), new Vector2(250, 100) };
DrawPoly(points, 4, Color.GREEN);

3.1.2 颜色设置和纹理贴图(即,插入图片)

红、绿、蓝以及透明度(RGBA)

Color myColor = new Color(255, 165, 0, 255); //橙色,不透明

Raylib支持纹理贴图,使用 DrawTexture 函数可以将纹理绘制到屏幕上,此函数需要一个 Texture2D对象和两个点坐标作为参数,这两个点定义了纹理在屏幕上的位置。

例如,加载一张名为"myTexture"的纹理并将其绘制到屏幕上的坐标(100,100)可以这样操作:(Color.WHITE 代表贴图颜色)

Texture2D myTexture = LoadTexture("myTexture.png");
DrawTexture(myTexture, 100, 100, Color.WHITE);

交互式图形元素的创建

 鼠标和键盘事件响应

鼠标事件处理通常涉及 WindowShouldClose 、 IsMouseButtonPressed 、 GetMousePosition 等函数。例如,要创建一个简单的交互式图形元素,当用户点击该元素时,执行某些操作,可以编写如下代码:

Vector2 position = new Vector2(300, 200); //元素位置
Vector2 size = new Vector2(50, 50); //元素大小
 
// 检测鼠标点击
if(IsMouseButtonPressed(MouseButton.MOUSE_LEFT_BUTTON) && 
CheckCollisionPointRec
(GetMousePosition(), 
   new Rectangle(position.X,
    position.Y, size.X, size.Y)))
{
    // 在此处添加点击后的操作代码
}

对于键盘事件, IsKeyPressed 和 GetKeyPressed 等函数可以检测按键是否被按下,并可取得被按下的按键。这对于开发游戏和交互式应用尤为有用。例如,创建一个程序,当按下空格键时,输出一条消息,代码如下:

if(IsKeyPressed(KeyboardKey.KEY_SPACE))
{
    Console.WriteLine("Space key was pressed!");
}

5. 插入音频

初始化和声音加载

Raylib支持多种音频格式,包括WAV和OGG等常见格式。加载音频文件到游戏中,可以通过 LoadSound 函数实现。加载完成后,音频文件被封装为一个Sound对象,供后续播放使用

//初始化音源播放器
Raylib.InitAudioDevice();
//声音来源
Sound bgm = Raylib.LoadSound("D:\\code\\C_base_509class\\Assert\\bgm.mp3");
Sound att = Raylib.LoadSound("D:\\code\\C_base_509class\\Assert\\M4.wav");
Sound jump = Raylib.LoadSound("D:\\code\\C_base_509class\\Assert\\bam.mp3");

声音音量调节和播放

音频播放控制包括开始播放、暂停、继续播放和停止等操作。 PlaySound 函数用于开始播放音频,而 StopSound 则停止播放。音效的同步指的是确保音效与游戏中的动作一致,Raylib通过 UpdateSound 和 SetSoundVolume 等函数支持这些操作。

Raylib.SetSoundVolume(bgm, 0.1f);//调节音量
Raylib.PlaySound(bgm);//开始播放
StopSound(sound); // 停止播放

内存回收

 //内存回收
 Raylib.UnloadSound(bgm);
 Raylib.UnloadSound(att);
 Raylib.UnloadSound(jump);

 Raylib.CloseAudioDevice();

整体代码

using Raylib_cs;
class Program
{
    
    public static void Main()
    {
        int hight = 450;
        int width = 800;

        Raylib.InitWindow( width, hight ,"小游戏");

        //初始化音源播放器
        Raylib.InitAudioDevice();
        //声音来源
        Sound bgm = Raylib.LoadSound("D:\\code\\C_base_509class\\Assert\\bgm.mp3");
        Sound att = Raylib.LoadSound("D:\\code\\C_base_509class\\Assert\\M4.wav");
        Sound jump = Raylib.LoadSound("D:\\code\\C_base_509class\\Assert\\bam.mp3");

         
        float posX = 400;
        float posY = 225;
        float radiu = 50;

        float jumpForce = 50;
        float gravity = 9.8f;

        bool bgmShouldPlay = true;

        Raylib.SetSoundVolume(bgm, 0.1f);
        Raylib.PlaySound(bgm);
        

        //视窗对焦  
        while (!Raylib.WindowShouldClose())
        {
            float detaTime = Raylib.GetFrameTime();
            Raylib.BeginDrawing();
            Raylib.ClearBackground(Color.White);
            if(Raylib.IsKeyDown(KeyboardKey.Space))
            {
               // Console.WriteLine(1);
                posY=posY-jumpForce*detaTime;
                Raylib.SetSoundVolume(jump, 1.5f);
                Raylib.PlaySound(jump);
            }
            if(posY<=hight-radiu)
            {
                posY=posY+gravity*detaTime;
            }
            if(Raylib.IsMouseButtonDown(MouseButton.Left))
            {
                Raylib.PlaySound(att);
               // Console.WriteLine("射击");
            }
            if(Raylib.IsSoundPlaying(bgm)==false && bgmShouldPlay)
            {
                Raylib.PlaySound(bgm);
            }
            //画小球
            Raylib.DrawCircle((int)posX, (int)posY, radiu, Color.Orange);

            Raylib.DrawText("Hello, world!", 12, 12, 20, Color.Black);

            Raylib.EndDrawing();
        }
        //内存回收
        Raylib.UnloadSound(bgm);
        Raylib.UnloadSound(att);
        Raylib.UnloadSound(jump);

        Raylib.CloseAudioDevice();
        Raylib.CloseWindow();
    }
}

 在c++中绘制和控制小球

#ifndef CIRCLE_H_
#define CIRCLE_H_
float posX = 400;
float posY = 225;
float speed = 50.0f;
float moveX = 0;
float moveY = 0;

void ProccInput();
void DoLogic(float dt);
void Draw();

#endif





#include "../include/raylib.h"
#include <stdio.h>
#include"circle.h"

int main()
{
    

    InitWindow(800, 450, "Window");

    //===主循环
    while (!WindowShouldClose())
    {
        float deltaTime = GetFrameTime();
        //x += deltaTime * 100;

        //处理输入控制
        ProccInput();

        //===处理逻辑(不可见数据变化)
        DoLogic(deltaTime);
        


        BeginDrawing();

        ClearBackground(RAYWHITE);
        
        //===渲染
        Draw();
        
        EndDrawing();
    }


    CloseWindow();

    return 0;
}

void ProccInput()
{
     // 重置移动方向
    moveX = 0;
    moveY = 0;

    //输入控制:按住WASD控制小球
    {
        if (IsKeyDown(KEY_A))
        {
            moveX = -1;
        }else if (IsKeyDown(KEY_D))
        {
            moveX = +1;
        }
            
        if (IsKeyDown(KEY_S))
        {
            moveY = +1;
        }else if (IsKeyDown(KEY_W))
        {
            moveY = -1;
        }
    }
}

void DoLogic(float dt)
{
    //根据move移动小球
    posX = posX + moveX * speed * dt;
    posY = posY + moveY * speed * dt;
}

void Draw()
{
    //多种表现1.图像
    DrawCircle((int)posX,(int)posY,50,BLUE);

    //2.文字
    //printf("posX: %f,posY: %f",posX,posY);
}

在里面挑出来一些我能用到的,学习参考链接:https://blog.csdn.net/weixin_35826166/article/details/143823025

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

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

相关文章

11月 | Apache SeaTunnel月度进展总结

各位热爱 Apache SeaTunnel 的小伙伴们&#xff0c;社区10月份月报更新啦&#xff01;这里将记录 SeaTunnel 社区每月的重要更新&#xff0c;欢迎关注&#xff01; 月度Merge之星 感谢以下小伙伴 11 月份为 Apache SeaTunnel 所做的精彩贡献&#xff08;排名不分先后&#xf…

实数与复数频谱掩蔽在音频分离中的应用

使用实数和复数频谱掩蔽进行音频分离 频谱掩蔽是指在音频信号的频谱表示中&#xff0c;通过选择性地增强或抑制某些频率成分来改善信号质量或实现信号分离的技术。频谱掩蔽可以分为两种类型&#xff1a;实数掩蔽和复数掩蔽。 实数频谱掩蔽 实数频谱掩蔽主要关注音频信号的幅…

数学建模之RSR秩和比综合评价法(详细)

RSR秩和比综合评价法 一、概述 秩和比法(Rank-sum ratio&#xff0c;简称RSR法)是我国学者田凤调于1988年提出的&#xff0c;田教授是我国杰出的卫生统计学家&#xff0c;该方法最初提出时用于解决医学卫生领域的综合评价问题&#xff0c;后经各领域学者的补充和完善&#xf…

【贪心算法】贪心算法五

贪心算法五 1.跳跃游戏 II2.跳跃游戏3.加油站3.单调递增的数字 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f603; 1.跳跃游戏 II 题目链接&…

STM32编码器接口及编码器测速模板代码

编码器是什么&#xff1f; 编码器是一种将角位移或者角速度转换成一连串电数字脉冲的旋转式传感 器&#xff0c;我们可以通过编码器测量到底位移或者速度信息。编码器从输出数据类型上 分&#xff0c;可以分为增量式编码器和绝对式编码器。 从编码器检测原理上来分&#xff0…

经典视觉神经网络1 CNN

一、概述 输入的图像都很大&#xff0c;使用全连接网络的话&#xff0c;计算的代价较高&#xff0c;图像也很难保留原本特征。 卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;CNN&#xff09;是一种专门用于处理具有网格状结构数据的深度学习模型。主要应用…

黑马程序员MybatisPlus/Docker相关内容

Day01 MP相关知识 1. mp配置类&#xff1a; 2.条件构造器&#xff1a; 具体的实现例子&#xff1a; ①QuerryWapper&#xff1a; ②LambdaQueryWrapper: 3.MP的自定义SQL 4.MP的Service层的实现 5.IService下的Lambda查询 原SQL语句的写法&#xff1a; Lambda 查询语句的…

通讯专题4.1——CAN通信之计算机网络与现场总线

从通讯专题4开始&#xff0c;来学习CAN总线的内容。 为了更好的学习CAN&#xff0c;先从计算机网络与现场总线开始了解。 1 计算机网络体系的结构 在我们生活当中&#xff0c;有许多的网络&#xff0c;如交通网&#xff08;铁路、公路等&#xff09;、通信网&#xff08;电信、…

低级爬虫实现-记录HCIP云架构考试

因工作需要考HCIP云架构&#xff08;HCIP-Cloud Service Solution Architect&#xff09;证书, 特意在淘宝上买了题库&#xff0c; 考过了。 事后得知自己被坑了&#xff0c; 多花了几十大洋。 所以想着在授权期内将题库“爬”下来&#xff0c; 共享给大家。 因为整个过程蛮有…

最新AI问答创作运营系统(SparkAi系统),GPT-4.0/GPT-4o多模态模型+联网搜索提问+问答分析+AI绘画+管理后台系统

目录 一、人工智能 系统介绍文档 二、功能模块介绍 系统快速体验 三、系统功能模块 3.1 AI全模型支持/插件系统 AI大模型 多模态模型文档分析 多模态识图理解能力 联网搜索回复总结 3.2 AI智能体应用 3.2.1 AI智能体/GPTs商店 3.2.2 AI智能体/GPTs工作台 3.2.3 自…

借助 AI 工具,共享旅游-卡-项目助力年底增收攻略

年底了&#xff0c;大量的商家都在开始筹备搞活动&#xff0c;接下来的双十二、元旦、春节、开门红、寒假&#xff0c;各种活动&#xff0c;目的就是为了拉动新客户。 距离过年还有56 天&#xff0c;如何破局&#xff1f; 1、销售渠道 针对旅游卡项目&#xff0c;主要销售渠道…

AndroidStudio-常见界面控件

一、Button package com.example.review01import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.widget.Button import android.widget.TextViewclass Review01Activity : AppCompatActivity() {override fun onCreate(savedInstanceStat…

【SpringMVC】参数传递 重定向与转发 REST风格

文章目录 参数传递重定向与转发REST风格 参数传递 ModelAndView&#xff1a;包含视图信息和模型数据信息 public ModelAndView index1(){// 返回页面ModelAndView modelAndView new ModelAndView("视图名");// 或// ModelAndView modelAndView new ModelAndView(…

Vue网页屏保

Vue网页屏保 在vue项目中&#xff0c;如果项目长时间未操作需要弹出屏幕保护程序&#xff0c;以下为网页屏保效果&#xff0c;看板内容为连接的资源。 屏保组件 <template><div v-if"isActive" class"screensaver" click"disableScreens…

计算机网络复习5——运输层

运输层解决的是进程之间的逻辑通信问题 两个主机进行通信归根结底是两个主机中的应用程序互相通信&#xff0c;又称为“端到端的通信” 端口 运行在计算机中的进程是用进程标识符来标志的。但不同的操作系统标识进程的方法不统一&#xff0c;因特网重新以统一的方法对TCP/IP…

qtcanpool 知 10:包管理雏形

文章目录 前言痛点转机雏形实践后语 前言 曾听闻&#xff1a;C/Qt 没有包管理器&#xff0c;开发起来太不方便。这是一个有过 node.js 开发经验的人对 Qt 的吐槽。 确实&#xff0c;像 python、golang、node.js 这些编程语言都有包管理器&#xff0c;给用户带来了极佳的开发体…

ASP.NET Core 9.0 静态资产传递优化 (MapStaticAssets )

一、结论 &#x1f4a2;先看结论吧&#xff0c; MapStaticAssets 在大多数情况下可以替换 UseStaticFiles&#xff0c;它已针对为应用在生成和发布时了解的资产提供服务进行了优化。 如果应用服务来自其他位置&#xff08;如磁盘或嵌入资源&#xff09;的资产&#xff0c;则应…

LeetCode 力扣 热题 100道(十五)搜索插入位置(C++)

给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 代码如下所示&#xff1a; class Solution { public:int searchIns…

WPF+LibVLC开发播放器-音量控制和倍速控制

界面 界面上增加音量的控件和倍速控制控件 音量控制 主要也是一个Slider进度条控件来实现音量调节 我们这里设置默认的最大值为100&#xff0c;默认Value值也为100&#xff0c;默认声音开到最大 这里目前完全由前端控制音量调节&#xff0c;可以直接使用ValueChanged事件实…

Vue3技术开发,使用纯CSS3动手制作一个3D环绕的相册展示效果,支持传入任意图片.3D轮播相册的组件

主要讲述封装一个3D轮播相册的组件&#xff0c;效果图如下&#xff0c;仅仅传入一个图片的数组即可&#xff0c;效果如下&#xff1a; 使用Vue3技术开发&#xff0c;支持传入任意张数的图片。 使用方法 <template><Swiper :list"list" /> </templat…