raylib U3 - 拖动功能的实现
本来想做一个文字逃脱游戏的demo的。但是写起来之后发现——是真的不好写,要实现的功能太多了。要是在一节课或者一篇文章里把功能实现完,我吃不消学起来也难受,索性就拆开实现了。
这一篇先实现一个拖动的效果。看图:

实现的功能:
- 一个小球,可以在鼠标按下的时候跟着鼠标走
- 从窗口中心位置,画一条线连接小球
阅读代码的时候请注意注释的部分:
#include <raylib.h>
#include <bits/stdc++.h>
struct Player{
Texture tex;
Vector2 center;//小球的中心点,
Vector2 pos;//小球的绘制点,绘制点根据中心点来推算
float radius;
//初始化,根据位置、半径和颜色初始化
void init(int x,int y,float r,Color color){
center.x=x , center.y=y;
radius=r;
pos.x=x-r , pos.y=y-r;
Image playerimg=GenImageColor(r*2,r*2,BLANK);
ImageDrawCircle(&playerimg,r,r,r-1,color);
tex = LoadTextureFromImage(playerimg);
UnloadImage(playerimg);
}
//移动
void moveto(Vector2 target){
center=target;
pos.x=center.x-radius , pos.y=center.y-radius;
}
//绘制
void draw(Vector2 begin){
//既然每个小球都有线,那直接把画线放在小球里实现
DrawLineEx(begin,center,3.0,WHITE);
DrawTexture(tex,pos.x,pos.y,WHITE);
}
//判断是否被按住
bool ispressed(Vector2 mous){
return CheckCollisionPointCircle(mous,center,radius);
}
//释放
void unload(){
UnloadTexture(tex);
}
};
int main(void)
{
const int screenWidth = 800;
const int screenHeight = 600;
InitWindow(screenWidth, screenHeight, "文字逃脱");
SetTargetFPS(60);
//创建三个小球
Player golden;
golden.init(600,200,20,GOLD);
Player dilao;
dilao.init(300,500,20,MAROON);
Player yaoshi;
yaoshi.init(500,600,30,GREEN);
while (!WindowShouldClose())
{
//获取鼠标的位置
Vector2 moupos = GetMousePosition();
Vector2 center;
center.x=400;
center.y=300;
//鼠标按下时,触碰到哪个小球,哪个小球跟着走
if(IsMouseButtonDown(MOUSE_LEFT_BUTTON)){
if(golden.ispressed(moupos)){
golden.moveto(moupos);
}
if(dilao.ispressed(moupos)){
dilao.moveto(moupos);
}
if(yaoshi.ispressed(moupos)){
yaoshi.moveto(moupos);
}
}
// Draw
BeginDrawing();
ClearBackground(GRAY);
//调用结构体的绘制
dilao.draw(center);
golden.draw(center);
yaoshi.draw(center);
EndDrawing();
}
//释放三个小球
golden.unload();
dilao.unload();
yaoshi.unload();
CloseWindow();
return 0;
}

浙公网安备 33010602011771号