raylib U3 - 拖动功能的实现

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

实现的功能:

  1. 一个小球,可以在鼠标按下的时候跟着鼠标走
  2. 从窗口中心位置,画一条线连接小球

阅读代码的时候请注意注释的部分:

#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;
}
posted @ 2025-02-12 11:43  一亩食堂  阅读(113)  评论(0)    收藏  举报