win7 dos窗口模拟帧刷新
前几天是白色情人节,临时脑抽写了个表白神器 高端大气上档次,就是不知道该送给谁,经过两天的反射弧思考决定还是写给博客娘吧。- -~
这个程序就是打开后,在Dos窗口内模拟写出几行字母。其实主要就是模拟一下帧刷新。像游戏引擎那样每一帧都打印一个满屏,那么所有的动画也就出来了。想在里边写个小游戏也未尝不可。
但是理想丰满现实骨感,Dos窗口不断帧刷新效果很一般,是不是会出现跳动的情况,很蛋疼。
win7 dos窗口的默认宽度是80个字符,高度是25个字符。经过简单的处理,通过调用Sleep函数来控制间隔时间来无限打印80x25的字符串集合,就能模拟帧刷新了,非常的简单。
c/c++版本代码
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <windows.h>
#include <vector>
using namespace std;
//全局变量 标记是否处于update状态
bool update_flag = false;
//全局数组,每一帧打印的所有字符
];
//全局变量,打印刷新计数器
;
//结构体 代表80x25中的一个点
struct _pos
{
int _x;
int _y;
_pos(int x, int y) : _x(x), _y(y){}
};
//刷新函数的函数指针
typedef void(*_update)(vector<_pos>&);
_pos makepos(int x, int y)
{
_pos ret(x, y);
return ret;
}
//初始化要打印的点阵 虽然屏幕是80个字符的宽度,但是字符要多一个,原因是\0的字符串结尾标识符占一个//最后一行做特殊处理 没有\n换行符,以免每一帧的时候窗口被向下延伸一行
void init_screen()
{
; i < ; i++)
{
screen[i] = ();
memset(screen[i], );
//if (i == 0) screen[i][0] = 'x';
screen[i][] = '\n';
screen[i][] = '\0';
)
{
screen[i][] = '\0';
screen[i][] = '\0';
}
}
}
//打印一帧的屏幕 上边缺失的换行符在这里补充
void display_screen()
{
printf("\n");
; i < ; i++)
{
printf(screen[i]);
}
}
//更改某一点的显示字符
void set_char(int x, int y, char target)
{
&& x < && y >= && y < )
{
char* index = (screen[x] + y);
*index = target;
}
}
//开始update函数
void start_update(_update update_function, int daley, vector<_pos>& _vec)
{
update_flag = true;
while (update_flag)
{
Sleep(daley);
update_function(_vec);
}
}
//停止update
void stop_update()
{
update_flag = false;
}
//每一帧执行的函数
void processing(vector<_pos>& _vec)
{
if (pro_count < _vec.size())
set_char(_vec[pro_count]._x, _vec[pro_count]._y, 'o');
display_screen();
pro_count++;
}
//制作一个序列,这个序列用来保存需要 更改的点
void init_vec(vector<_pos>& vec)
{
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
vec.push_back(makepos(, ));
}
int main(int argc, char* argv[])
{
vector<_pos> poses;
init_vec(poses);
init_screen();
_update _s_fun = processing;
start_update(_s_fun, , poses);
system("pause");
}
下面是C#版本 C#版本追加了颜色变化效果,更浪♂van
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace confession
{
class Program
{
static void Main(string[] args)
{
InitScreen();
DisplayScreen();
List<Pos> poses = new List<Pos>();
InitPoses(poses);
Update(, poses);
Console.ReadKey();
}
static void InitPoses(List<Pos> poses)
{
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
poses.Add(Pos.MakePos(, ));
}
static private string[] screen;
static private bool update_flag;
static private int pro_count;
static void InitScreen()
{
screen = ];
update_flag = true;
pro_count = ;
; i < ; i++)
{
screen[i] = );
) screen[i] += "\n";
else screen[i] += "";
}
}
static void SetChar(int x, int y, char target)
{
&& x < && y >= && y < )
{
char[] line = screen[x].ToCharArray();
line[y] = target;
string newLine = new string(line);
screen[x] = newLine;
}
}
static void Update(int delay, List<Pos> poses)
{
while (update_flag)
{
Thread.Sleep(delay);
Processing(poses);
}
}
static void Processing(List<Pos> poses)
{
if (pro_count < poses.Count)
{
SetChar(poses[pro_count].X, poses[pro_count].Y, 'o');
}
else
{
DisplayColor();
}
DisplayScreen();
;
pro_count++;
}
static void StartUpdate()
{
update_flag = true;
}
static void StopUpdate()
{
update_flag = false;
}
static void DisplayScreen()
{
Console.WriteLine();
; i < ; i++)
{
Console.Write(screen[i]);
}
}
static void DisplayColor()
{
;
;
switch (_type)
{
:
Console.ForegroundColor = ConsoleColor.Cyan;
break;
:
Console.ForegroundColor = ConsoleColor.DarkGray;
break;
:
Console.ForegroundColor = ConsoleColor.Red;
break;
:
Console.ForegroundColor = ConsoleColor.White;
break;
:
Console.ForegroundColor = ConsoleColor.Yellow;
break;
:
Console.ForegroundColor = ConsoleColor.Green;
break;
:
Console.ForegroundColor = ConsoleColor.Magenta;
break;
:
Console.ForegroundColor = ConsoleColor.Blue;
break;
}
}
}
class Pos
{
private int x;
private int y;
public int X
{
get { return x; }
set { x = value; }
}
public int Y
{
get { return y; }
set { y = value; }
}
Pos(int _x, int _y)
{
x = _x;
y = _y;
}
public static Pos MakePos(int _x, int _y)
{
Pos ret = new Pos(_x, _y);
return ret;
}
}
}
编译后有惊喜 噗噗噗
win7 dos窗口模拟帧刷新的更多相关文章
- 学习java之电脑的常用快捷键和DOS窗口下的常用命令
学习java之电脑的常用快捷键和DOS窗口下的常用命令 电脑一些常用的快捷键 win快捷键: 单独按Windows:显示或隐藏 "开始"功能表 Windows+BREAK:显示&q ...
- Windows环境变量设置无效解决办法——DOS窗口设置环境变量
公司配置的电脑是Win7,使用的账户并不是管理员账户,我在计算机->属性中设置环境变量无效. 后来在DOS窗口中设置环境变量成功. 1. set [环境变量名称]=[所有环境变量值]:set P ...
- 系统右键菜单添加剪贴板清空项(隐藏DOS窗口)
@color 0A @title 系统右键菜单添加剪贴板清空项(隐藏DOS窗口) by wjshan0808 @echo off echo 请输入右键菜单名称 set /p name= ::创建本机A ...
- 打包bat等文件成exe,双击运行不显示dos窗口,exe不报毒
准备材料如下bat和vbs直接新建文本,然后改后缀就可以建出来了(后面发现exe运行vbs来启动bat不报毒)下面内容就是要把这些文件打包成exe,双击exe后打开图片test.jpg,不显示dos窗 ...
- visual studio 2005 编fortran程序,运行后dos窗口显示问题
比如程序: program main implicit none write(*,*) "AAAAAAAAAAAAAAAAAAAAAAAA" stop end 虽然可以看见DOS窗 ...
- HTML的窗口分帧
下面通过一个后台管理的部分设计来说明窗口分帧 frameset.html代码 <!-- <frameset>标签(常用来做后台管理界面) 属性:rows(行).cols(列).可以使 ...
- window.open窗口关闭后刷新父窗口代码
window.open窗口关闭后刷新父窗口代码 window.opener.location.href=window.opener.location.href;window.close();
- VS2012 编写C++程序的时候DOS窗口一闪而过解决办法。
在我每次通过VS2012 运行C++程序的时候,DOS窗口在显示结果的时候都是一闪而过.这样让人没法观察输出的结果.经试验找到了一较好的解决办法: 首先包含头文件"stdlib.h" ...
- 让windows系统的DOS窗口也可以显示utf8字符集
C:\Users\Administrator>chcp活动代码页: 936 windows cmd命令显示UTF8设置 在中文Windows系统中,如果一个文本文件是UTF-8编码的,那么在CM ...
随机推荐
- raid0和raid5的 实验过程
raid:独立的磁盘冗余阵列 创建raid0: 环境准备:准备三块大小相同的磁盘或分区,此处要特别注意:红色字体 [root@localhost6 home]#fdisk /dev/sdd ##对/d ...
- WPF系列学习之三(路由事件)
路由事件实际上以一上 列三种方式出现. 1.与普通的.net事件类似的直接路由事件.它们起源于一个元素,并且不传递给其他元素.例如:MouseEnter事件. 2.在包含层次中向上传递的冒 ...
- unique()函数
unique()是c++里面的一个去重函数,包含在<iostream>中. 该函数将重复的元素移至容器的末尾,返回的为前面的无重复项的尾地址. 由于返回的是地址,所以经常需要转换为数值使用 ...
- Linux Ubuntu下Jupyter Notebook的安装
Jupyter Notebook, 以前又称为IPython notebook,是一个交互式笔记本, 支持运行40+种编程语言. 可以用来编写漂亮的交互式文档. 安装步骤: pip install - ...
- 将Opencv java中的Mat通过jni传递到C++中的方法
public native void FindFeatures(long matAddrGr, long matAddrRgba); ... mRgba = new Mat(height, width ...
- Working Experience - WPF XAML 报错 - 命名空间中不存在该名称
问题 编辑 xaml 时,VS 提示一个存在的类不存在(如:命名空间"xxx"中不存在"xxx"名称). 运行环境 Windows 版本:Window 10 V ...
- 3DMAX 10 角色动作
基本流程 1保存初始姿势(保存原始T动作) 2确定动画帧数时间 3找参考动作姿态,绘制关键帧草图 4先调整出初始姿势,如果是循环动画,需要把第一帧复制到最后一帧 5大体先想好在固定时间比例调草图的关键 ...
- Vue实现选项卡效果
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8& ...
- mui框架使用心得
这段时间一直在用mui框架做项目,现在很多快速开发的app大部分是用MUI和APICloud开发的.所以我就把他们对比了一下. mui有自己的UI组件,我在项目中,很少用框架的UI组件,而使用框架的j ...
- IT兄弟连 Java语法教程 Java语言的其他特性
Java语言中除了非常重要的跨平台特性外,还有如下几个关键特性: ● 语法简单易学 Java语言的语法简单明了,容易掌握,而且是纯面向对象(OOP)的语言,Java语言的简单性主要体现在以下几个方面 ...