graphics.c

来自「这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易」· C语言 代码 · 共 125 行

C
125
字号
#include <u.h>#include <libc.h>#include <draw.h>#include <event.h>#include "sokoban.h"voiddrawscreen(void){	draw(screen, screen->r, img, nil, ZP);	flushimage(display, 1);}voiddrawglenda(void){	Rectangle r;	Point p;	p = level.glenda;	p.x *= BoardX;	p.y *= BoardY;	/* leave some room from the edge of the window */	p = addpt(p, Pt(1, 1));	r = Rpt(p, Pt(p.x + BoardX, p.y+BoardY));	draw(img, r, glenda, nil, ZP);}voiddrawwin(void){	Rectangle r;	Point p;	p = level.glenda;	p.x *= BoardX;	p.y *= BoardY;	p = addpt(p, Pt(6, 6));	p = addpt(p, Pt(1, 1));	r = Rpt(p, Pt(p.x + BoardX, p.y+BoardY));	draw(img, r, text, win, ZP);}voiddrawboard(Point p){	Rectangle r;	uint square = level.board[p.x][p.y];	p.x *= BoardX;	p.y *= BoardY;	/* leave some room from the edge of the window */	p = addpt(p, Pt(1, 1));	r = Rpt(p, Pt(p.x + BoardX, p.y+BoardY));	switch(square) {	case Background:		draw(img, r, bg, nil, ZP);		break;	case Empty:		draw(img, r, empty, nil, ZP);		break;	case Wall:		draw(img, r, wall, nil, ZP);		break;	case Cargo:		draw(img, r, cargo, nil, ZP);		break;	case Goal:		draw(img, r, goal, nil, ZP);		break;	case GoalCargo:		draw(img, r, goalcargo, nil, ZP);		break;	}}voidresize(Point p){	/* resize to the size of the current level */	int fd;	fd = open("/dev/wctl", OWRITE);	if(fd >= 0){		fprint(fd, "resize -dx %d -dy %d", p.x*BoardX+10, p.y*BoardY+10);		close(fd);	}}Pointboardsize(Point p){	return Pt(p.x*BoardX+2, p.y*BoardY+2);}voiddrawlevel(void){	int x, y;	resize(level.max);	if(img)		freeimage(img);	img = eallocimage(Rpt(Pt(0, 0), boardsize(level.max)), 0, 0);		draw(img, insetrect(img->r, 1), empty, nil, ZP);	for(x = 0; x < MazeX; x++) {		for(y = 0; y < MazeY; y++) {			drawboard(Pt(x, y));		}	}	drawglenda();}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?