① 怎样用C语言绘制直线
【C语言的用MoveTo()和LineTo()】
#include<graphics.h>
#include<math.h>
/*
###############################################################################
功 能:本函数的作用是用逐点比较法来画一条直线
格 式:void myline1(int x1,int y1,int x2,int y2,int color)
参数说明:x1,y1是起始点坐标,x2,y2是终止点,color是画线的颜色
调用示例:myline1(10,20,500,440,4)
###############################################################################
*/
void myline1(int x1,int y1,int x2,int y2,int color)
{
/*变量定义开始(2007/10/16增加)*/
int iTx; /*x轴终点的相对坐标xa或临时变量*/
int iTy; /*y轴终点的相对坐标ya或临时变量*/
int iDx; /*x轴方向的步长dx*/
int iDy; /*y轴方向的步长dy*/
int iFt; /*偏差Fm*/
int iSt; /*记数循环数(dx+dy)S*/
int iXt; /*x方向循环变量xm*/
int iYt; /*y方向循环变量ym*/
/*变量定义结束*/
/*变量初始化开始*/
/*如果是第三象限或第四象限则换成第一或第二象限*/
if(y2<y1)
{
iTx=x1;
x1=x2;
x2=iTx;
iTy=y1;
y1=y2;
y2=iTy;
}
iTx=x2-x1; /*取x轴的相对坐标*/
iTy=y2-y1; /*取y轴的相对坐标*/
iDx=1;
iDy=1;
iFt=0;
iSt=iTx+iTy;
if(iTx<0)iSt=-1*iTx+iTy;; /*如果在第二象限,则x轴方向步长取负值*/
iXt=0;
iYt=0;
/*变量初始化结束*/
/*数据处理开始*/
while(iSt>0)
{
putpixel(x1+iXt,y1+iYt,color);
if(iTx>=0) /*如果在第一象限*/
{
if(iFt<0) /*如果偏差小于0*/
{
iYt+=iDy; /*y方向走一步*/
iFt+=iTx;
}
else /*如果偏差大于或等于0*/
{
iXt+=iDx; /*x方向走一步*/
iFt-=iTy;
}
}
else
{
if(iFt<0) /*如果偏差小于0*/
{
iXt-=iDx; /*负x方向走一步*/
iFt+=iTy;
}
else /*如果偏差大于或等于0*/
{
iYt+=iDy; /*y方向走一步*/
iFt+=iTx;
}
}
iSt--;
}
}
/*
###############################################################################
功 能:本函数的作用是用来画一条直线
格 式:void myline2(int x1,int y1,int x2,int y2,int color)
参数说明:x1,y1是起始点坐标,x2,y2是终止点,color是画线的颜色
调用示例:myline2(10,20,500,440,4)
###############################################################################
*/
int myline2(int x1,int y1,int x2,int y2,int color)
{
int iX; /*x方向的坐标变量*/
int iY; /*y方向的坐标变量*/
int iTx; /*x方向的步长变量*/
int iTy; /*y方向的步长变量*/
float fDx; /*x方向的差分变量*/
float fDy; /*y方向的差分变量*/
float fMinf; /*算法中的f*/
float fMaxF; /*算法中的F*/
float fS; /*终点判断变量*/
fMinf=0.5; /*f=0.5*/
iX=x1;
iY=y1;
putpixel(x1,y1,color);
if(x1==x2&&y1==y2) /*如果终点和起始点相同*/
{
return(1);
}
iTx=1;
iTy=1;
fDx=(float)(x2-x1);
fDy=(float)(y2-y1);
fMaxF=fDy/fDx>0?fDy/fDx:(-fDy/fDx); /*F=|dy/dx|*/
if(fDx<0)iTx=-1;
if(fDy<0)iTy=-1;
fS=fDx>0?fDx:(-fDx);
if(fMaxF==1) /*如果F=1*/
{
iX=x1;
iY=y1;
while(fS>0)
{
iX+=iTx; /*x方向走一步*/
iY+=iTy; /*y方向走一步*/
putpixel(iX,iY,color);
fS--;
}
}
else if(fMaxF>1) /*如果F>1*/
{
fS+=fDy>0?fDy:(-fDy);
while(fS>0)
{
iY+=iTy; /*y方向走一步*/
putpixel(iX,iY,color);
fMinf+=1/fMaxF; /*f=f+1/F*/
fS--;
if(fMinf>=1) /*如果f>=1*/
{
iX+=iTx; /*x方向走一步*/
fMinf--; /*f=f-1*/
putpixel(iX,iY,color);
fS--;
}
}
}
else /*如果F<1*/
{
fS+=fDy>0?fDy:(-fDy);
while(fS>0)
{
iX+=iTx; /*x方向走一步*/
putpixel(iX,iY,color);
fMinf+=fMaxF; /*f=f+F*/
fS--;
if(fMinf>=1) /*如果f>=1*/
{
iY+=iTy; /*y方向走一步*/
fMinf--; /*f=f-1*/
putpixel(iX,iY,color);
fS--;
}
}
}
}【能够画出任意斜率的直线算法程序】
int dx,dy,incrE,incrNE,d,x,y;
if ((point[1].x-point[0].x)==0){ //垂直的直线
x=point[0].x;
for(y=point[0].y;y<point[1].y;y++)
pDC->SetPixel(x,y,50);
}
else if(abs((point[1].y-point[0].y)/(point[1].x-point[0].x))<=1){ //斜率 -1到 1 之间
dx=point[1].x-point[0].x;
dy=point[0].y-point[1].y;
d=dx-2*dy; incrE=-2*dy;
incrNE=2*(dx-dy);
x=point[0].x,y=point[0].y;
pDC->SetPixel(x,y,50);
if(point[0].y>point[1].y){
while(x<point[1].x)
{
if(d>=0){
d+=incrE;
x++;
}
else
{d+=incrNE;<br> x++;<br> y--;<br> }
pDC->SetPixel(x,y,50);
}
}
else if(point[0].y<=point[1].y){
dy=point[1].y-point[0].y;
incrE=-2*dy;
incrNE=2*(dx-dy);
x=point[0].x,y=point[0].y;
pDC->SetPixel(x,y,50);
while(x<point[1].x)
{
if(d>=0){
d+=incrE;
x++;
}
else
{d+=incrNE;<br> x++;<br> y++;<br> }
pDC->SetPixel(x,y,50);
}
}
}
else { //斜率 <-1 和 >1的直线
if(point[1].x>=point[0].x){
dx=point[1].x-point[0].x;
dy=point[1].y-point[0].y;
d=2*dx-dy;
incrE=2*dx;
incrNE=2*(dx-dy);
x=point[0].x,y=point[0].y;
pDC->SetPixel(x,y,50);
while(x<point[1].x)
{
if(d<0){
d+=incrE;
y++;
}
else
{d+=incrNE;<br> pDC->SetPixel(x,y,50);<br> x++;<br> y++;<br> }
pDC->SetPixel(x,y,50);
}
}
else if((point[1].y-point[0].y)/(point[1].x-point[0].x)<-1){
dx=point[1].x-point[0].x;
dy=point[0].y-point[1].y;
d=2*dx-dy;
incrE=2*dx;
incrNE=2*(dx-dy);
x=point[0].x,y=point[0].y;
pDC->SetPixel(x,y,50);
while(y<point[1].y)
{
if(d>0){
d+=incrE;
y++;
}
else
{d+=incrNE;<br> x--;<br> y++;<br> }
pDC->SetPixel(x,y,50);
} }
}
② 我已经在vc中加载DirectX 9.0的SDK,为什么在运行一个从网上下的3D游戏的源代码是提示找不到"d3d8.h”
得新装个D3D8的SDK才行。
首先D3D8里面有些接口函数跟D3D9的不一样,我只记得VB是不一样的,VC的没看过。
而且,D3D8的文件名也和D3D9不一样啊。
实在不想装的话,试试把代码里面"D3D8"改成"D3D9"试试,编译不通过对地方查一下说明文档。如果涉及范围不多的话有希望改过来,不过估计很麻烦。
个人建议加装D3D8吧。不过以前是要先卸载D3D9再装D3D8然后再装D3D9的。
③ 怎么注册大漠插件和使用DX后台键盘(最好源码参考)
下载的大漠插件里有个大漠插件接口说明
PutAttachment "c:\test_game","*.*"
set ws=createobject("Wscript.Shell")
ws.run "regsvr32 c:\test_game\dm.dll /s"
set ws=nothing
Delay 1500
Set dm = CreateObject("dm.dmsoft")
ver = dm.Ver()
If len(ver) = 0 Then
MessageBox "创建对象失败,检查系统是否禁用了vbs脚本权限"
EndScript
End If
这是注册源码
后台键盘有多种模式 说明里也有
"normal" : 正常模式,平常我们用的前台键盘模式
"windows": Windows模式,采取模拟windows消息方式 同按键的后台插件.
"dx": dx模式,采用模拟dx后台键盘模式。有些窗口在此模式下绑定时,需要先激活窗口再绑定(或者绑定以后激活),否则可能会出现绑定后键盘无效的情况.
④ 求DirectX角色扮演游戏编程第二版源代码
我已经上传到
http://pickup.mofile.com/8206390134597261
第二版用的也是DX8,不过改起来比较方便,一般根据DX文档改就可以了