raylib U3 - 用鼠标控制小球

先看效果

image

有了鼠标控制,再加上碰撞检测,基本上就是一个反弹球的小游戏了。

代码实现

这个功能其实很简单,三个步骤:

  • 1、创建这个元素
  • 2、获取鼠标的位置
  • 3、把金色小球绘制到鼠标的位置

下面的代码分不同的模块给出了对应的代码。请大家尽量尝试自己添加到之前的代码里去。
实在不知道怎么加的,文章最后给出了完整的代码。不过不建议复制完整代码,最好自己加试试。

	//创建一个玩家的金色传说
	Image playerimg=GenImageColor(40,40,BLANK);
	ImageDrawCircle(&playerimg,20,20,19,GOLD);
	Texture playertexture = LoadTextureFromImage(playerimg);
	UnloadImage(playerimg);
	//获取鼠标的位置
	int px=GetMouseX();
	int py=GetMouseY();
	//在主循环中绘制这个小球
	//绘制帧,这一Part都是放在循环的最后的
	BeginDrawing();//开始绘制
	ClearBackground(WHITE);//重新绘制一些背景。
	for(int i=0;i<5;++i){//绘制5个红色小球
		DrawTexture(balls[i],ballx[i],bally[i],WHITE);
	}
	DrawTexture(playertexture,px-20,py-20,WHITE);//这里,就是绘制金色传说
	EndDrawing();//结束绘制
	//最后别忘了把金色传说释放掉
	UnloadTexture(playertexture);

鼠标事件

下面的鼠标事件大家可以看看,后面会用哦。

函数 说明
bool IsMouseButtonPressed(int button) 如果在本帧中button被按下,返回true;否则返回false(一次按键行为,在多帧中只会有一帧返回1)
bool IsMouseButtonDown(int button) 如果在本帧中button处于按下状态,返回true;否则返回false
bool IsMouseButtonReleased(int button) 如果在本帧中button被松开,返回true;否则返回false(一次按键行为,在多帧中只会有一帧返回1)
bool IsMouseButtonUp(int button) 如果在本帧中button处于未按下状态,返回true;否则返回false
int GetMouseX() 返回鼠标光标当前位置的X坐标
int GetMouseY() 返回鼠标光标当前位置的Y坐标
Vector2 GetMousePosition() 返回鼠标光标当前位置的坐标
Vector2 GetMouseDelta() 返回上一帧到本帧之间鼠标光标的位移
float GetMouseWheelMove() 返回上一帧到本帧之间鼠标滚轮的转动量

完整代码参考

点击查看代码
#include <raylib.h>
#include<bits/stdc++.h>
using namespace std;
#define WINDOW_WIDTH 800
#define WINDOW_HEIGHT 600

struct Ball{
	Texture t;
	int x,y;
	int speedx,speedy;
};

int main() {
	
	InitWindow(WINDOW_WIDTH, WINDOW_HEIGHT,"Test");
	SetTargetFPS(60);
	
	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);
		
	}
	
	//创建一个玩家的金色传说
	Image playerimg=GenImageColor(40,40,BLANK);
	ImageDrawCircle(&playerimg,20,20,19,GOLD);
	Texture playertexture = LoadTextureFromImage(playerimg);
	UnloadImage(playerimg);
	
	while (!WindowShouldClose()) {
		
		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;
		}
		
		int px=GetMouseX();
		int py=GetMouseY();
		
		//绘制帧,这一Part都是放在循环的最后的
		BeginDrawing();//开始绘制
		ClearBackground(WHITE);//重新绘制一些背景。
		for(int i=0;i<5;++i){
			DrawTexture(ballarray[i].t,ballarray[i].x,ballarray[i].y,WHITE);
		}
		DrawTexture(playertexture,px-20,py-20,WHITE);
		EndDrawing();//结束绘制
	}
	
	//释放texture对象
	for(int i=0;i<5;++i){
		UnloadTexture(ballarray[i].t); 
	}
	
	UnloadTexture(playertexture);
	
	//关闭窗口
	CloseWindow();
	return 0;
}


posted @ 2025-01-08 14:17  一亩食堂  阅读(218)  评论(0)    收藏  举报