raylib U3 - 用鼠标控制小球
先看效果

有了鼠标控制,再加上碰撞检测,基本上就是一个反弹球的小游戏了。
代码实现
这个功能其实很简单,三个步骤:
- 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;
}

浙公网安备 33010602011771号