raylib U1S05 - 添加一个开始页面

news/2025/1/8 15:08:58/文章来源:https://www.cnblogs.com/evencai/p/18659697

先来看效果

看之前让我吐个槽。刚才编辑一半,结果我手贱点了个退出登录,然后都没了˃̣̣̥᷄⌓˂̣̣̥᷅

image

开始按钮的图片是用豆包AI生成的,然后用美图秀秀抠图,改颜色。懒得自己搞素材的同学保存下面的三个图,注意改名字。

普通状态 鼠标放上去 鼠标点击
image image image
start_normal.png start_hover.png start_pressed.png

实现不同页面和按钮状态的原理

我们的raylib程序只有一个循环,如果想要做不同的页面,其实是用变量来控制,不同的变量下做不同的事情。

image

体现到代码里,就是加判断:

image

就这么点事儿,然后按钮的不同状态也是加判断。

image

请务必理解了原理再往后看。

代码实现

两个管理状态的变量

下面的两个变量本来应该都用枚举来写的,不过为了防止有同学不知道枚举类型,所以用了两种方式。建议写的时候把state也改成枚举类型。

//创建一个变量,用来管理
int state=0;//创建一个枚举类型,表示按钮的状态。
enum startState{normal,hover,pressed
};//创建有一个开始状态的变量,名为start,初始是normal
enum startState start=normal;

创建三个按钮图片

	Image startimg=LoadImage("start_normal.png");Texture startnormal = LoadTextureFromImage(startimg);UnloadImage(startimg);Image startimghover=LoadImage("start_hover.png");Texture starthover = LoadTextureFromImage(startimghover);UnloadImage(startimghover);Image startimgpressed=LoadImage("start_pressed.png");Texture startpressed = LoadTextureFromImage(startimgpressed);UnloadImage(startimgpressed);

不同页面里各自的计算

注意:运算部分和绘制部分是分开的,游戏结束的内容没有写,自己写写试试哦。

		if(state==0){//开始菜单,如果点击了,把state改成1就行了int x=GetMouseX();int y=GetMouseY();if(IsMouseButtonUp(MOUSE_BUTTON_LEFT)){start=normal;//判断鼠标是否在按钮的区域if(x>=(WINDOW_WIDTH-200)/2 && x<=(WINDOW_WIDTH-200)/2+200){if(y>=(WINDOW_HEIGHT-200)/2 && y<=(WINDOW_HEIGHT-200)/2+200){start=hover;}}}if(IsMouseButtonPressed(MOUSE_BUTTON_LEFT)){start=normal;if(x>=(WINDOW_WIDTH-200)/2 && x<=(WINDOW_WIDTH-200)/2+200){if(y>=(WINDOW_HEIGHT-200)/2 && y<=(WINDOW_HEIGHT-200)/2+200){start=pressed;}}}if(IsMouseButtonReleased(MOUSE_BUTTON_LEFT)){if(x>=(WINDOW_WIDTH-200)/2 && x<=(WINDOW_WIDTH-200)/2+200){if(y>=(WINDOW_HEIGHT-200)/2 && y<=(WINDOW_HEIGHT-200)/2+200){state=1;}}}}else if(state==1){//游戏进行for(int i=0;i<5;++i){//判断本次运动后,是否碰到了边界 if(ballarray[i].x+ballarray[i].speedx>=WINDOW_WIDTH-40 || ballarray[i].x+ballarray[i].speedx<=0){ballarray[i].speedx*=-1;}if(ballarray[i].y+ballarray[i].speedy>=WINDOW_HEIGHT-40 || ballarray[i].y+ballarray[i].speedy<=0){ballarray[i].speedy*=-1;} ballarray[i].x+=ballarray[i].speedx;ballarray[i].y+=ballarray[i].speedy;}}else if(state==2){//游戏结束}

绘制部分

绘制部分简单多了,直接判断然后绘制。

		//绘制帧,这一Part都是放在循环的最后的BeginDrawing();//开始绘制ClearBackground(WHITE);//重新绘制一些背景。if(state==0){//开始菜单if(start == normal)DrawTexture(startnormal,(WINDOW_WIDTH-200)/2,(WINDOW_HEIGHT-200)/2,WHITE);else if(start == hover)DrawTexture(starthover,(WINDOW_WIDTH-200)/2,(WINDOW_HEIGHT-200)/2,WHITE);else if(start == pressed)DrawTexture(startpressed,(WINDOW_WIDTH-200)/2,(WINDOW_HEIGHT-200)/2,WHITE);}else if(state==1){//游戏进行for(int i=0;i<5;++i){DrawTexture(ballarray[i].t,ballarray[i].x,ballarray[i].y,WHITE);}}else if(state==2){//游戏结束}

最后

最后,不要完了把所有的元素都释放一下

	//释放texture对象for(int i=0;i<5;++i){UnloadTexture(ballarray[i].t); }UnloadTexture(startnormal);UnloadTexture(starthover);UnloadTexture(startpressed);

完整的参考代码:

点击查看代码
#include <raylib.h>
#include<bits/stdc++.h>
using namespace std;
#define WINDOW_WIDTH 800
#define WINDOW_HEIGHT 600struct Ball{Texture t;int x,y;int speedx,speedy;
};//创建一个变量,用来管理
int state=0;//创建一个枚举类型,表示按钮的状态。
enum startState{normal,hover,pressed
};//创建有一个开始状态的变量,名为start,初始是normal
enum startState start=normal;int main() {InitWindow(WINDOW_WIDTH, WINDOW_HEIGHT,"Test");SetTargetFPS(60);//下面是三个按钮的图片Image startimg=LoadImage("start_normal.png");Texture startnormal = LoadTextureFromImage(startimg);UnloadImage(startimg);Image startimghover=LoadImage("start_hover.png");Texture starthover = LoadTextureFromImage(startimghover);UnloadImage(startimghover);Image startimgpressed=LoadImage("start_pressed.png");Texture startpressed = LoadTextureFromImage(startimgpressed);UnloadImage(startimgpressed);Ball ballarray[5];for(int i=0;i<5;++i){Image img=GenImageColor(40,40,BLANK);ImageDrawCircle(&img,20,20,19,RED);ballarray[i].t = LoadTextureFromImage(img);UnloadImage(img);ballarray[i].x=0;ballarray[i].y=0;//这里用个简单的方式让小球有不同的速度。//大家也可以研究下随机数ballarray[i].speedx=(6-i);ballarray[i].speedy=(6+i);}while (!WindowShouldClose()) {if(state==0){//开始菜单,如果点击了,把state改成1就行了int x=GetMouseX();int y=GetMouseY();if(IsMouseButtonUp(MOUSE_BUTTON_LEFT)){start=normal;//判断鼠标是否在按钮的区域if(x>=(WINDOW_WIDTH-200)/2 && x<=(WINDOW_WIDTH-200)/2+200){if(y>=(WINDOW_HEIGHT-200)/2 && y<=(WINDOW_HEIGHT-200)/2+200){start=hover;}}}if(IsMouseButtonPressed(MOUSE_BUTTON_LEFT)){start=normal;if(x>=(WINDOW_WIDTH-200)/2 && x<=(WINDOW_WIDTH-200)/2+200){if(y>=(WINDOW_HEIGHT-200)/2 && y<=(WINDOW_HEIGHT-200)/2+200){start=pressed;}}}if(IsMouseButtonReleased(MOUSE_BUTTON_LEFT)){if(x>=(WINDOW_WIDTH-200)/2 && x<=(WINDOW_WIDTH-200)/2+200){if(y>=(WINDOW_HEIGHT-200)/2 && y<=(WINDOW_HEIGHT-200)/2+200){state=1;}}}}else if(state==1){//游戏进行for(int i=0;i<5;++i){//判断本次运动后,是否碰到了边界 if(ballarray[i].x+ballarray[i].speedx>=WINDOW_WIDTH-40 || ballarray[i].x+ballarray[i].speedx<=0){ballarray[i].speedx*=-1;}if(ballarray[i].y+ballarray[i].speedy>=WINDOW_HEIGHT-40 || ballarray[i].y+ballarray[i].speedy<=0){ballarray[i].speedy*=-1;} ballarray[i].x+=ballarray[i].speedx;ballarray[i].y+=ballarray[i].speedy;}}else if(state==2){//游戏结束}//绘制帧,这一Part都是放在循环的最后的BeginDrawing();//开始绘制ClearBackground(WHITE);//重新绘制一些背景。if(state==0){//开始菜单if(start == normal)DrawTexture(startnormal,(WINDOW_WIDTH-200)/2,(WINDOW_HEIGHT-200)/2,WHITE);else if(start == hover)DrawTexture(starthover,(WINDOW_WIDTH-200)/2,(WINDOW_HEIGHT-200)/2,WHITE);else if(start == pressed)DrawTexture(startpressed,(WINDOW_WIDTH-200)/2,(WINDOW_HEIGHT-200)/2,WHITE);}else if(state==1){//游戏进行for(int i=0;i<5;++i){DrawTexture(ballarray[i].t,ballarray[i].x,ballarray[i].y,WHITE);}}else if(state==2){//游戏结束}EndDrawing();//结束绘制}//释放texture对象for(int i=0;i<5;++i){UnloadTexture(ballarray[i].t); }UnloadTexture(startnormal);UnloadTexture(starthover);UnloadTexture(startpressed);//关闭窗口CloseWindow();return 0;
}

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

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

相关文章

KES(KingBaseES)集群部署实战

今天我们将探讨关于KES(KingBaseES)的集群部署方案。作为示例,我们将以读写分离(RWC)集群为例,快速在本地进行部署和安装,并深入了解KES的部署流程。在本章中,我们将采用Windows平台上的可视化部署工具来进行集群的安装和配置。然而,由于硬件资源有限,本次演示仅展示…

测试图片功能

博客园的链接:123图床的链接:

JMeter-临界部分控制器-控制请求按顺序执行

一、路径: 二、操作: 把请求按顺序放到临界控制器下,请求会按顺序执行 三、执行效果

ArmSoM RK3588/RK3576核心板,Rockchip摄像头使用

1. Camera 简介​ArmSoM系列产品使用的是mipi-csi接口的摄像头ArmSoM-Sige7支持双摄同显: 2. RK3588硬件通路框图​rk3588支持2个isp硬件,每个isp设备可虚拟出多个虚拟节点,软件上通过回读的方式,依次从ddr读取每一路的图像数据进isp处理。对于多摄方案,建议将数据流平均分…

nifi下载Win版本安装成功运行_network

一、Apache nifi相关网址 https://nifi.apache.org/ 官网 https://nifi.apache.org/docs.html 文档 https://nifi.apache.org/download.html 下载页## 二、Apache nifi本地安装 进入https://nifi.apache.org/download.html解压到本地 bin目录下有启动和停止的…

策略梯度AC算法 - CartPole环境, 使用RNN作为策略网络

本文给出了使用RNN作为策略网络的AC算法代码示例,并在CartPole环境跑出结果。参考资料:Vanila Policy Gradient with a Recurrent Neural Network Policy – Abhishek Mishra – Artificial Intelligence researcher 动手学强化学习-HandsOnRL,本文中展示的代码都是基于《动…

Harbor配置https

harbor是不附带任何证书的,因此默认情况下使用http来进行访问 K8S在使用harbor作为私有仓库时或生产环境下强烈建议使用https 生成证书 生产环境下,需要从CA获取证书,测试或者开发可以使用OpenSSL自己生成证书 生成私钥 # 创建证书的存储目录 mkdir /home/ssl cd /home/sslo…

vue3引入ts以及js文件使用案例

ts:先确保项目正确集成TypeScript 添加tsconfig.json文件{"compilerOptions": {"target": "esnext","module": "esnext","strict": true,"jsx": "preserve","importHelpers": true…

coenzyme A 辅酶A

coenzyme A 化学式 C21H36N7O16P3S 分子量 767.535密度1.1335 g/cm3 (20C) 熔点 -5C 沸点 146 - 147是一种辅酶,值得注意的是其在合成和氧化脂肪酸的角色,和在三羧酸循环中氧化丙酮酸。

【每日一题】20250108

路的尽头什么都没有。但在路上遇见的不起眼的瞬间和记忆,最终会成就我们。【每日一题】一物体作匀加速直线运动,通过一段位移 \(\Delta x\) 所用的时间为 \(t_1\),紧接着通过下一段位移 \(\Delta x\) 所用时间为 \(t_2\).则物体运动的加速度为 A. \(\frac {2\Delta x( t_{1…

JS-21 字符串方法_charAt()

charAt方法返回指定位置的字符,参数是从0开始编号的var s =new String (zifuchuan)s.charAt(1)//"t"s.charAt(s.length-1)//"n" 如果参数为负数,或大于等于字符串的长度,charAt返回空字符串zifuchuan.charAt(-1)//""zifuchuan.charAt(9)//&…