一个SDL的实验——模拟分子的运动

本文介绍了一个使用SDL库编写的简单程序,该程序模拟了分子的随机运动。通过两个线程分别处理屏幕刷新与数据计算,实现了30个点在屏幕上的随机移动。每个点交替显示两种不同的图像,形成有趣的视觉效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天(周六)加班。。。给别的公司做技术支持,于是乎必须呆着,但是没事的时候自己安排。

于是学学SDL,我用它写了一个可视化的C随机函数发生器的小程序。

刚开始所有点都位于同一点,然后随机的向周围移动。模拟分子的运动情况。

很有意思,这里分享一下代码,用的两个线程(一个线程刷新屏幕,一个线程用于计算)——这也是一个游戏采用的结构。

 

 

 

 

代码,貌似TAB缩进出了点问题。。

#pragma comment(lib,"SDL/SDL.lib")
#pragma comment(lib,"SDL/SDLmain.lib")

#include"include/SDL.h"

#include <stdlib.h> 
#include <stdio.h> 
#include <time.h>

#include<iostream>
using namespace std;


SDL_Surface *screen;
SDL_Surface *image1;
SDL_Surface *image2;
SDL_Surface *image3;

int const MAX = 30;

int const fps = 75;
int const datarefresh = 1;

SDL_Rect offsect[MAX];

SDL_Thread *thread = NULL;

void work();
void cls();
void drawscreen();
void init();
void quit();
int my_thread( void *data );


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

 while(1)
 {
  cls();
  SDL_Delay( 1000 / fps );
  drawscreen();
 }

 quit();
 return 0;
}

void init()
{
 SDL_Init(SDL_INIT_VIDEO);
 screen = SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE);
 srand( time( 0 ) );

 image1 = SDL_LoadBMP("res/test3.bmp");
 image2 = SDL_LoadBMP("res/test2.bmp");
 image3 = SDL_LoadBMP("res/back.bmp");

 Uint32 colorkey = SDL_MapRGB( image1->format, 0xFF, 0xFF, 0xFF );
 SDL_SetColorKey( image1, SDL_SRCCOLORKEY, colorkey );
 SDL_SetColorKey( image2, SDL_SRCCOLORKEY, colorkey );
 SDL_SetColorKey( image3, SDL_SRCCOLORKEY, colorkey );

 for( int i=0; i < MAX; i++ )
 {
  offsect[i].x = 300;
  offsect[i].y = 200;
  offsect[i].w = image1->w;
  offsect[i].h = image1->h;
 }

 thread = SDL_CreateThread( my_thread, NULL );
}

void cls()
{
 SDL_Rect tmp;
 tmp.x = 0;
 tmp.y = 0;
 tmp.w = 640;
 tmp.h = 480;

 SDL_BlitSurface( image3, 0, screen, &tmp );
}

void drawscreen()
{
 SDL_UpdateRect(screen, 0, 0, 640, 480);
}

void work()
{
 static bool turn = false; 
 SDL_Rect offsectnew;


 for( int i=0; i < MAX; i++ )
 { 
  offsectnew = offsect[i];
  int x_delta,y_delta;
  
  do
  {
   x_delta = ( (rand()%3) -1 )*1; 
   y_delta = ( (rand()%3) -1 )*1;
  }
  while( (offsectnew.x+x_delta)<0 && (offsectnew.x+x_delta)>640 
   && (offsectnew.y+y_delta)<0 && (offsectnew.y+y_delta)>480 );
  
  offsectnew.x += x_delta ;
  offsectnew.y += y_delta ;
  
  turn = !turn;
  SDL_Surface *image;
  
  
  if(turn)
   image = image1;
  else
   image = image2;
  
  
  SDL_BlitSurface(image, 0, screen, &offsectnew);
  
  
  offsect[i] = offsectnew;
 }
}


int my_thread( void *data )
{
    while( 1 )
    {
  work();
  SDL_Delay( datarefresh );
    }
    
    return 0;    
}

void quit()
{
 SDL_FreeSurface(image1);
 SDL_FreeSurface(image2);
 SDL_FreeSurface(image3);
 SDL_KillThread( thread );
 SDL_Quit();
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值