游戏逻辑
标签: 消灭星星小游戏
学习人数: 9.2k

上一节课,我们完成了一个最基本的初始化界面,但是还不够完善。

 

这节课我们需要简单梳理一下游戏的逻辑,然后继续完善初始的游戏界面。

 

思考:我们如果想实现手机里消灭星星的初始界面应该怎么把我们的星星图片画到背景上去?

 

第一步:计算横竖能放多少张星星图片

背景图片的大小是450*600,星星的大小是30*30.

意味着我们可以横着放15个星星,竖着放20个星星。

但是这么星星我们不可能把代码复制那么多份,所以需要考虑用数组来实现。

 

第二步:二维数组来对应相应的星星图片区域

我们开一个15*20的数组即可

int mpt[15][20] = { 0 };

 

第三步:初始化各个星星图片

void Init() {
	image_background = imread("./Image/background.png");
	image_red = imread("./Image/red.png");
	image_yellow = imread("./Image/yellow.png");
	image_green = imread("./Image/green.png");
	image_purple = imread("./Image/purple.png");
	image_blue = imread("./Image/blue.png");
	if (image_background.empty()) {
		printf("could not load image...\n");
		exit(1);
	}
}

 

第四步:将上一节讲到的绘画部分单独写成一个函数,方便复用代码

void DrawImage(int posX, int posY) {//在背景图片上的偏移量
	for (int h = 0; h < image_red.rows; h++) {
		for (int w = 0; w < image_red.cols; w++) {
			Vec3b& carPixel = image_red.at<Vec3b>(h, w);
			uchar* ptr = image_background.ptr<uchar>(posX + h, posY + w);
			if ((carPixel[0] <= 30) && (carPixel[1] <= 30) && (carPixel[2] <= 30))
				continue;//RPG 0,0,0即为黑色 我们需要将星星图片周围偏黑的部分过滤掉
			ptr[0] = carPixel[0];
			ptr[1] = carPixel[1];
			ptr[2] = carPixel[2];
		}
	}
}

 

第五步:我们将各个不同颜色的星星图片用不同的值来代替

1表示红色

2表示黄色

3表示绿色

4表示紫色

5表示蓝色

 

第六步:我们试一下效果

代码如下:

#include<opencv2/opencv.hpp>
#include<stdio.h>
using namespace cv;

const int WIDTH = 15;
const int HEIGHT = 20;

int mpt[WIDTH][HEIGHT] = { 0 };
Mat image_background;
Mat image_red;
Mat image_yellow;
Mat image_green;
Mat image_purple;
Mat image_blue;

void Init() {
	image_background = imread("./Image/background.png");
	image_red = imread("./Image/red.png");
	image_yellow = imread("./Image/yellow.png");
	image_green = imread("./Image/green.png");
	image_purple = imread("./Image/purple.png");
	image_blue = imread("./Image/blue.png");
	if (image_background.empty()) {
		printf("could not load image...\n");
		exit(1);
	}
}

void DrawImage(int posX, int posY) {//在背景图片上的偏移量
	for (int h = 0; h < image_red.rows; h++) {
		for (int w = 0; w < image_red.cols; w++) {
			Vec3b& carPixel = image_red.at<Vec3b>(h, w);
			uchar* ptr = image_background.ptr<uchar>(posX + h, posY + w);
			if ((carPixel[0] <= 30) && (carPixel[1] <= 30) && (carPixel[2] <= 30))
				continue;//RPG 0,0,0即为黑色 我们需要将星星图片周围偏黑的部分过滤掉
			ptr[0] = carPixel[0];
			ptr[1] = carPixel[1];
			ptr[2] = carPixel[2];
		}
	}
}

int main(int argc, char** argv) {
	Init();

	for (int i = 0; i < WIDTH; i++) {
		for (int j = 0; j < HEIGHT; j++) {
			int posY = i * 30;
			int posX = j * 30;
			DrawImage(posX, posY);
		}
	}

	namedWindow("PopStarGame", 1);
	imshow("PopStarGame", image_background);
	waitKey(0);

	return 0;
}

运行之后效果如下:

 

第七步:我们需要不同颜色星星随机打乱,所以需要对代码进行改进

代码如下:

#include<opencv2/opencv.hpp>
#include<stdio.h>
using namespace cv;

const int WIDTH = 15;
const int HEIGHT = 20;

int mpt[WIDTH][HEIGHT] = { 0 };
Mat image_background;
Mat image_red;
Mat image_yellow;
Mat image_green;
Mat image_purple;
Mat image_blue;

void Init() { //初始化加载要用到的图片
	image_background = imread("./Image/background.png");
	image_red = imread("./Image/red.png");
	image_yellow = imread("./Image/yellow.png");
	image_green = imread("./Image/green.png");
	image_purple = imread("./Image/purple.png");
	image_blue = imread("./Image/blue.png");
	if (image_background.empty()) {
		printf("could not load image...\n");
		exit(1);
	}
}

Mat SwitchColor(int color) {//1对应红色星星 2对应黄色星星
	switch (color)
	{
	case 1:
		return image_red;
	case 2:
		return image_yellow;
	case 3:
		return image_green;
	case 4:
		return image_purple;
	case 5:
		return image_blue;
	default:
		break;
	}
}

void DrawImage(int posX, int posY, int color) {//在背景图片上的偏移量
	Mat image_star = SwitchColor(color);
	for (int h = 0; h < image_star.rows; h++) {
		for (int w = 0; w < image_star.cols; w++) {
			Vec3b& carPixel = image_star.at<Vec3b>(h, w);
			uchar* ptr = image_background.ptr<uchar>(posX + h, posY + w);
			if ((carPixel[0] <= 30) && (carPixel[1] <= 30) && (carPixel[2] <= 30))
				continue;//RPG 0,0,0即为黑色 我们需要将星星图片周围偏黑的部分过滤掉
			ptr[0] = carPixel[0];
			ptr[1] = carPixel[1];
			ptr[2] = carPixel[2];
		}
	}
}

void RandomMap() {//初始化地图
	srand(time(NULL));//使用时间做随机种子,每次生成的地图不一样
	for (int i = 0; i < WIDTH; i++) {
		for (int j = 0; j < HEIGHT; j++) {
			int x = rand() % 5 + 1;//在1-5之间随机一个数
			mpt[i][j] = x;
		}
	}
}

int main(int argc, char** argv) {
	Init();
	RandomMap();

	for (int i = 0; i < WIDTH; i++) {
		for (int j = 0; j < HEIGHT; j++) {
			int posY = i * 30;
			int posX = j * 30;
			DrawImage(posX, posY, mpt[i][j]);
		}
	}

	namedWindow("PopStarGame", 1);
	imshow("PopStarGame", image_background);
	waitKey(0);

	return 0;
}

运行之后效果如下:

 

大功告成!!!!!



课后作业

完成本节课的内容


登录后开始许愿

暂无评论,来抢沙发