seangriffin

Box2D UDF - Physics and Game Engine for AutoIT

8 posts in this topic

#1 ·  Posted (edited)

This is my first release of Box2D for AutoIT.  A very fun and exciting UDF to be bringing to you all.  For those who don't know, Box2D is a physics engine (see http://box2d.org/).  It simulates physical systems using rigid bodies and collision detection.  It is arguably the most prevalent physics engine in existence, within popular physics-based games like Angry Birds using it, and is also at the core of other advanced physics engines such as Unity.

For a quick demonstration of this UDF in action see the following YouTube video ->  https://youtu.be/h5QH1O63Wik

Or play "Angry Nerds", the demo game, for yourself.  Visit the EXAMPLES section below.

Box2D is purely a mathematical engine.  It can model physics numerically.  This in itself is quite interesting, however it really shines when applied to a good graphics engine.  Recently I posted my SFML UDF over here ...

After benchmarking several popular graphics engines (i.e. GDI+, Direct2D, Irrlicht and SFML) with this Box2D UDF I've selected SFML as my favourite, and the engine that I believe performs the best (fastest) with a rich set of functions appropriate for any physics engine.  With Box2D married with SFML, and running on AutoIT, the results are stunning.

A HUGE THANK-YOU to jRowe and linus (for the Irrlicht UDF) and UEZ for his post on GDI+ loading screens and trancexx and Eukalyptus for their work on Direct2D.  Without their talents I would not have been able to reach this point on my own.

The Box2D library is available for C++.  Way back in 2010 it was ported to Pure C by "Paril" and made available on Google Code and known as "Box2C".  Google Code has since been shut down but the but the archive of Box2C still exists to this day here -> https://code.google.com/archive/p/box2c.  This is the library which I have ported to AutoIT in this UDF.

SFML I am also porting to AutoIT under a separate UDF, as linked above.

Building this UDF has been a dream come true.  I've been fascinated by physics-based games as far back as the golden age of gaming in the 80's, with thrust style games like Asteroids and platformers like Donkey Kong.  I admired game developers like Jeremy Smith who created what may have been the first true game physics engines for the home computers.  I was astonished by their talents in games like Thrust and Exile for the C64.  Over the years I've attempted to mimic at least some of their success in my own games but alas I can not match their skills.  Now much older automation tools have become my game.  I use them almost every day, AutoIT included.  I've dabbled in other languages for physics game development, like Scratch and Unity, but sadly I had wondered why AutoIT, with all it's glorious capabilities and rapid scripting features, didn't have such a feature.  Hence this UDF.

This UDF demands a big time investment, and I am time poor, but I have a keen interest in the topic and will do my best to continue it's development.  I am only a hobbyist game developer and welcome comments and suggestions from those far smarter than I on this topic.

REQUIREMENTS:

  • AutoIt3 3.2 or higher

LIST OF FUNCTIONS (in progress):

I've split this UDF into two halves.  "Box2C.au3" is a UDF specifically for Box2C, the C API for Box2D.  It provides the mathematics behind the engine.  Additionally I'm providing "Box2CEx.au3" as an Extension that provides the graphics and gaming functions for Box2D.

Within the core "Box2C.au3" UDF:

  • _Box2C_Startup
  • _Box2C_Shutdown
  • _Box2C_b2Vec2_Constructor
  • _Box2C_b2Vec2_Length
  • _Box2C_b2Vec2_Distance
  • _Box2C_b2World_Constructor
  • _Box2C_b2World_CreateBody
  • _Box2C_b2World_DestroyBody
  • _Box2C_b2World_CreateFixture
  • _Box2C_b2World_CreateFixtureFromShape
  • _Box2C_b2World_Step
  • _Box2C_b2BoxShape_Constructor
  • _Box2C_b2CircleShape_Constructor
  • _Box2C_b2PolygonShape_Constructor
  • _Box2C_b2PolygonShape_Set
  • _Box2C_b2PolygonShape_CrossProductVectorScalar
  • _Box2C_b2PolygonShape_CrossProductVectorVector
  • _Box2C_b2PolygonShape_Normalize
  • _Box2C_b2PolygonShape_ComputeCentroid
  • _Box2C_b2BodyDef_Constructor
  • _Box2C_b2Body_DestroyFixture
  • _Box2C_b2Body_GetPosition
  • _Box2C_b2Body_SetPosition
  • _Box2C_b2Body_GetAngle
  • _Box2C_b2Body_SetAngle
  • _Box2C_b2Body_SetAwake
  • _Box2C_b2Body_SetTransform
  • _Box2C_b2Body_GetLinearVelocity
  • _Box2C_b2Body_SetLinearVelocity
  • _Box2C_b2Body_GetAngularVelocity
  • _Box2C_b2Body_SetAngularVelocity
  • _Box2C_b2Body_ApplyForce
  • _Box2C_b2Body_ApplyForceAtBody
  • _Box2C_b2Body_ApplyDirectionalForceAtBody
  • _Box2C_b2Body_ApplyTorque
  • _Box2C_b2Fixture_GetShape
  • _Box2C_b2Fixture_GetDensity
  • _Box2C_b2Fixture_SetDensity
  • _Box2C_b2Fixture_GetRestitution
  • _Box2C_b2Fixture_SetRestitution
  • _Box2C_b2Fixture_GetFriction
  • _Box2C_b2Fixture_SetFriction
  • _Box2C_b2Fixture_SetSensor

Within y "Box2CEx.au3" extension:

  • x_metres_to_gui_x
  • y_metres_to_gui_y
  • metres_to_pixels
  • atan2
  • radians_to_degrees
  • degrees_to_radians
  • _Box2C_Setup_SFML
  • _Box2C_b2Vec2_GetGUIPosition
  • _Box2C_b2World_Setup
  • _Box2C_b2World_GDIPlusSetup
  • _Box2C_b2World_SetPixelsPerMetre
  • _Box2C_b2World_SetGUIArea
  • _Box2C_b2World_GetGUIArea
  • _Box2C_b2World_GetGUIAreaCenter
  • _Box2C_b2World_Create
  • _Box2C_b2World_Step_Ex
  • _Box2C_b2World_StartAnimation
  • _Box2C_b2World_Animate_SFML
  • _Box2C_b2World_Animate_GDIPlus
  • _Box2C_b2World_WaitForAnimateEnd
  • _Box2C_b2ShapeArray_AddItem_SFML
  • _Box2C_b2ShapeArray_SetItem_SFML
  • _Box2C_b2ShapeArray_GetItemImagePath_SFML
  • _Box2C_b2PolygonShape_ArrayAdd_Irrlicht
  • _Box2C_b2PolygonShape_ArrayAdd_GDIPlus
  • _Box2C_b2BodyDefArray_AddItem
  • _Box2C_b2FixtureArray_SetItemSensor
  • _Box2C_b2FixtureArray_GetItemDensity
  • _Box2C_b2FixtureArray_SetItemDensity
  • _Box2C_b2FixtureArray_GetItemRestitution
  • _Box2C_b2FixtureArray_SetItemRestitution
  • _Box2C_b2FixtureArray_GetItemFriction
  • _Box2C_b2FixtureArray_SetItemFriction
  • _Box2C_b2BodyArray_AddItem_SFML
  • _Box2C_b2Body_ArrayAdd_Irrlicht
  • _Box2C_b2Body_ArrayAdd_GDIPlus
  • _Box2C_b2BodyArray_GetItemCount
  • _Box2C_b2BodyArray_GetItemPosition
  • _Box2C_b2BodyArray_SetItemPosition
  • _Box2C_b2BodyArray_GetItemAngle
  • _Box2C_b2BodyArray_SetItemAngle
  • _Box2C_b2BodyArray_GetItemLinearVelocity
  • _Box2C_b2BodyArray_SetItemActive
  • _Box2C_b2BodyArray_SetItemAwake
  • _Box2C_b2BodyArray_SetItemImage_SFML
  • _Box2C_b2BodyArray_SetItemDraw
  • _Box2C_b2BodyArray_ApplyItemForceAtBody
  • _Box2C_b2BodyArray_ApplyItemDirectionalForceAtBody
  • _Box2C_b2BodyArray_Transform_SFML
  • _Box2C_b2Body_Transform_GDIPlus
  • _Box2C_b2BodyArray_Draw_SFML
  • _Box2C_b2Body_ArrayDrawDisplay_SFML
  • _Box2C_b2Body_Destroy
  • _Box2C_b2Body_Destroy_SFML
  • _Box2C_b2Body_Rotate_GDIPlus

The SFML functions used in the tests and demos will be available in the SFML UDF post (see reference above).

EXAMPLES:

For such a powerful physics engine coupled to such a powerful graphics engine (SFML) it's sad that I've only had time to build one functional game, thus far.  But it's a start.

My self-titled "Angry Nerds" is merely a demo of the same game concept as the ever-so-popular Angry Birds game.  Angry Birds itself is built on top of Box2D.  Likewise Angry Nerds.  AutoIT + Box2D + SFML to be exact.  I've compiled Angry Nerds and provided an installer also, so you can quickly run the demo for yourself.  From the Github site below (in the DOWNLOAD section) run "Box2C_Angry_Nerds_Game_SFML_installer.exe" to install the demo to a location on your computer (desktop by default).  Go into this folder and run "Box2C_Angry_Nerds_Game_SFML.exe".  All instructions are displayed in-game.  Should be quite easy to work out.

Aside from Angry Nerds there are also two test scripts:

  • Box2C_linear_forces_test_SFML.au3
  • Box2C_angular_forces_test_SFML.au3

Feel free to run these for a basic demonstration of rigid bodies, forces and collisions.  The heart of Box2D and any physics engine.

Lastly I also have four speed tests as follows:

  • Box2C_speed_test_SFML.au3
  • Box2C_speed_test_Irrlicht.au3
  • Box2C_speed_test_D2D.au3
  • Box2C_speed_test_GDIPlus.au3

These were my initial evaluations into a suitable graphics engine for Box2D.  I've since settled on SFML, but feel free to execute these.  Note they may become quick defective over time as the SFML functions slowly take over.

DOWNLOADS:

You can download this UDF, including the examples above and associated files, from the following GitHub page:

https://github.com/seanhaydongriffin/Box2C-UDF

Hope you all enjoy!  I certainly am :-)

Cheers,

Sean.

 

Edited by seangriffin
3 people like this

Cheers, Sean.

See my other UDFs:

Chrome UDF - Automate Chrome | SAP UDF - Automate SAP | Java UDF - Automate Java Applications & Applets | Tesseract (OCR) UDF - Capture text from applications, controls and the desktop | Textract (OCR) UDF - Capture text from applications and controls | FileSystemMonitor UDF - File, Folder, Drive and Shell Monitoring | VLC (Media Player) UDF - Creating and controlling a VLC control in AutoIT | Google Maps UDF - Creating and controlling Google Maps (inc. GE) in AutoIT | SAPIListBox (Speech Recognition) UDF - Speech Recognition via the Microsoft Speech (SAPI) ListBox | eBay UDF - Automate eBay using the eBay API | ChildProc (Parallel Processing) UDF - Parallel processing functions for AutoIT | HyperCam (Screen Recording) UDF - Automate the HyperCam screen recorder | Twitter UDF - Automate Twitter using OAuth and the Twitter API | cURL UDF - a UDF for transferring data with URL syntax

See my other Tools:

Rapid Menu Writer - Add menus to DVDs in seconds | TV Player - Automates the process of playing videos on an external TV / Monitor | Rapid Video Converter - A tool for resizing and reformatting videos | [topic130531]Rapid DVD Creator - Convert videos to DVD fast and for free | ZapPF - A tool for killing processes and recycling files | Sean's eBay Bargain Hunter - Find last minute bargains in eBay using AutoIT | Sean's GUI Inspector - A scripting tool for querying GUIs | TransLink Journey Planner with maps - Incorporating Google Maps into an Australian Journey Planner | Automate Qt and QWidgets | Brisbane City Council Event Viewer - See what's going on in Brisbane, Australia

Share this post


Link to post
Share on other sites



#2 ·  Posted

Very impressive work! :thumbsup:

The physic engine is really nice implemented! 

 

Just for my curiosity - how did "GDI+ loading screens" help you?


Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Share this post


Link to post
Share on other sites

#3 ·  Posted (edited)

Thanks UEZ. I had never developed graphics in Windows as low level as GDI before. Always preferring to use something simpler and higher level such as what Unity provides. I needed a graphics engine for Box2D and I knew that GDI might be my answer but I'd absolutely no clue where to start. Because of the popularity of your GDI loading screens topic I was immediately drawn to your work. Having fully functional GDI animation examples was the perfect way to explain to me, a novice, how GDI works. I've also admired your scripting skill for some time and knew it was going to be impressive, and it was. Your optimisation of the GDI calls is precisely whats required for a physics engine. also you introduced me to the low level and efficient timers in the Windows API that i didn't know existed. they help me run non time critical  script away from the time critical physics animation loop in my script. If it weren't for your demos I would not be this far advanced with Box2D.  A very big thanks to you UEZ you are brilliant! I really love the AutoIT community. 

Edited by seangriffin
1 person likes this

Cheers, Sean.

See my other UDFs:

Chrome UDF - Automate Chrome | SAP UDF - Automate SAP | Java UDF - Automate Java Applications & Applets | Tesseract (OCR) UDF - Capture text from applications, controls and the desktop | Textract (OCR) UDF - Capture text from applications and controls | FileSystemMonitor UDF - File, Folder, Drive and Shell Monitoring | VLC (Media Player) UDF - Creating and controlling a VLC control in AutoIT | Google Maps UDF - Creating and controlling Google Maps (inc. GE) in AutoIT | SAPIListBox (Speech Recognition) UDF - Speech Recognition via the Microsoft Speech (SAPI) ListBox | eBay UDF - Automate eBay using the eBay API | ChildProc (Parallel Processing) UDF - Parallel processing functions for AutoIT | HyperCam (Screen Recording) UDF - Automate the HyperCam screen recorder | Twitter UDF - Automate Twitter using OAuth and the Twitter API | cURL UDF - a UDF for transferring data with URL syntax

See my other Tools:

Rapid Menu Writer - Add menus to DVDs in seconds | TV Player - Automates the process of playing videos on an external TV / Monitor | Rapid Video Converter - A tool for resizing and reformatting videos | [topic130531]Rapid DVD Creator - Convert videos to DVD fast and for free | ZapPF - A tool for killing processes and recycling files | Sean's eBay Bargain Hunter - Find last minute bargains in eBay using AutoIT | Sean's GUI Inspector - A scripting tool for querying GUIs | TransLink Journey Planner with maps - Incorporating Google Maps into an Australian Journey Planner | Automate Qt and QWidgets | Brisbane City Council Event Viewer - See what's going on in Brisbane, Australia

Share this post


Link to post
Share on other sites

#4 ·  Posted (edited)

Thanks for your feedback. ^^

Well, GDI is much faster than GDI+ but I like the functions of GDI+ more to create better looking graphical stuff. But GDI+ is mostly too slow for really cool stuff.

Probably much better is DirectX / OpenGL / OpenCL / ... Your solution looks also very good. 

 

Nice to read that my GDI+ examples were useful.

Edited by UEZ

Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Share this post


Link to post
Share on other sites

#5 ·  Posted

Really useful UEZ. I'm sure you are helping many people in need such as myself. 


Cheers, Sean.

See my other UDFs:

Chrome UDF - Automate Chrome | SAP UDF - Automate SAP | Java UDF - Automate Java Applications & Applets | Tesseract (OCR) UDF - Capture text from applications, controls and the desktop | Textract (OCR) UDF - Capture text from applications and controls | FileSystemMonitor UDF - File, Folder, Drive and Shell Monitoring | VLC (Media Player) UDF - Creating and controlling a VLC control in AutoIT | Google Maps UDF - Creating and controlling Google Maps (inc. GE) in AutoIT | SAPIListBox (Speech Recognition) UDF - Speech Recognition via the Microsoft Speech (SAPI) ListBox | eBay UDF - Automate eBay using the eBay API | ChildProc (Parallel Processing) UDF - Parallel processing functions for AutoIT | HyperCam (Screen Recording) UDF - Automate the HyperCam screen recorder | Twitter UDF - Automate Twitter using OAuth and the Twitter API | cURL UDF - a UDF for transferring data with URL syntax

See my other Tools:

Rapid Menu Writer - Add menus to DVDs in seconds | TV Player - Automates the process of playing videos on an external TV / Monitor | Rapid Video Converter - A tool for resizing and reformatting videos | [topic130531]Rapid DVD Creator - Convert videos to DVD fast and for free | ZapPF - A tool for killing processes and recycling files | Sean's eBay Bargain Hunter - Find last minute bargains in eBay using AutoIT | Sean's GUI Inspector - A scripting tool for querying GUIs | TransLink Journey Planner with maps - Incorporating Google Maps into an Australian Journey Planner | Automate Qt and QWidgets | Brisbane City Council Event Viewer - See what's going on in Brisbane, Australia

Share this post


Link to post
Share on other sites

#6 ·  Posted (edited)

To give everyone an update on this UDF.  I came to the realization that this was a little ambitious for a scripting language like AutoIT.  I still love the performance of AutoIT for most endevours, but in this case (for realtime graphics) I needed something closer to the speed of a compiled language like C.  Partly due to some posts by UEZ I was drawn towards several basic style languages, which seemed to offer the speed I was after with the simplicity of a basic language that is similar to that of AutoIT.  These included FreeBasic, BlitzBasic and PureBasic.  My attempts to get Box2D working in FreeBasic failed at the DLL level.  I'm still not sure why to this day.  I then moved to PureBasic and had immediate success there.  PureBasic also has native OpenGL support.  I initially tried the SFML library there.  It was too slow.  But after moving to direct OpenGL calls I got the great preformance I was looking for.  I then attempted to integrate LiquidFun (http://google.github.io/liquidfun) into PureBasic and to my excitment that was successful also.

So for now I'm continuing my developments of LiquidFun / Box2D physics within PureBasic.  If anyone is interested in this then check out my recent post in the PureBasic forums here -> http://www.purebasic.fr/english/viewtopic.php?f=27&t=68874

The Github repository is also here -> https://github.com/seanhaydongriffin/PB-LiquidFun-C

I'm really happy with where this is going, and perhaps I could later back-port my work and lessons learned from PureBasic to AutoIT.

Edited by seangriffin

Cheers, Sean.

See my other UDFs:

Chrome UDF - Automate Chrome | SAP UDF - Automate SAP | Java UDF - Automate Java Applications & Applets | Tesseract (OCR) UDF - Capture text from applications, controls and the desktop | Textract (OCR) UDF - Capture text from applications and controls | FileSystemMonitor UDF - File, Folder, Drive and Shell Monitoring | VLC (Media Player) UDF - Creating and controlling a VLC control in AutoIT | Google Maps UDF - Creating and controlling Google Maps (inc. GE) in AutoIT | SAPIListBox (Speech Recognition) UDF - Speech Recognition via the Microsoft Speech (SAPI) ListBox | eBay UDF - Automate eBay using the eBay API | ChildProc (Parallel Processing) UDF - Parallel processing functions for AutoIT | HyperCam (Screen Recording) UDF - Automate the HyperCam screen recorder | Twitter UDF - Automate Twitter using OAuth and the Twitter API | cURL UDF - a UDF for transferring data with URL syntax

See my other Tools:

Rapid Menu Writer - Add menus to DVDs in seconds | TV Player - Automates the process of playing videos on an external TV / Monitor | Rapid Video Converter - A tool for resizing and reformatting videos | [topic130531]Rapid DVD Creator - Convert videos to DVD fast and for free | ZapPF - A tool for killing processes and recycling files | Sean's eBay Bargain Hunter - Find last minute bargains in eBay using AutoIT | Sean's GUI Inspector - A scripting tool for querying GUIs | TransLink Journey Planner with maps - Incorporating Google Maps into an Australian Journey Planner | Automate Qt and QWidgets | Brisbane City Council Event Viewer - See what's going on in Brisbane, Australia

Share this post


Link to post
Share on other sites

#7 ·  Posted

Unfortunately free version of PureBasic is limited and cannot execute larger code via the editor but it look really awesome.  :thumbsup:

I cannot tell you why FreeBasic didn't work for you but also FB has OpenGL native support.

There is also a FreeBasic version of Particle Fluid Simulation:

''   rough smoothed particle hydrodynamics (SPH) draft
''   Michael "h4tt3n" Nissen, july 5th 2010
''   
''   todo:
''   predefined cell neighbors
''   better kernel (less bouncy liquid)
''   better broad phase collision detection
''   better mouse interaction
''   better code structure

''   includes
#Include Once "GL/gl.bi"

''   constants
Const as single      dt                  = 0.01                                 ''   timestep
Const as single      half_dt            = 0.5*dt                              ''   half timestep
const as single      r                   = 10                                    ''   interaction radius
const as single      r_2                = 2*r                                    ''   two radius (for grid)
const as single      r_sqrd             = r*r                                    ''   radius squared
Const as single      k                      = 400                                    ''   global "spring stiffnes"
Const as single      k_near             = 3000                                 ''   local "spring stiffnes"
Const as single      viscosity         = 2                                       ''   viscosity
Const as single      rest_dens       = 6                                       ''   rest density
const as single      grav_acc         = 400                                    ''   gravity
Const as single      pi                  = 4*atn(1)                           ''   pi
Const as single      radius            = 2                                       ''   particle distance on startup
const as integer  block_width      = 60                                    ''   <--- change to reduce / increase num masses
const as integer  block_height   = 100                                    ''   
Const as integer  num_masses      = block_width*block_height   ''   total number of masses
const as integer  neighbors         = 48                                    ''   max number of neighbors
Const as integer    screen_wid       = 800                                    ''   screen width
Const as integer    screen_hgt       = 400                                    ''   screen height
Const As Single    wall_friction   = 1                                       ''   wall friction (1 = full, 0 = off)
Const As Single    interaction_Radius   = 8                              ''   mouse interaction radius

Const As Integer cell_dia                  = r
Const As Integer cell_max_masses      = 24
const as integer num_cells_row         = screen_wid/cell_dia
const As integer num_cells_col         = screen_hgt/cell_dia

Const As Integer num_cells               = num_cells_row*num_cells_col

Const As Single cell_wid                  = screen_wid/num_Cells_row
Const As single cell_hgt                  = screen_hgt/num_Cells_Col
const As single half_cell_wid            = cell_wid/2

''   types
Type CellType
   As Integer Num_Masses, Mass(1 To cell_max_masses)
End Type

type vectortype
   as single x, y
end Type

Type NeighborType
   As Integer a
   As Single Dist
   As vectortype norm_dist
End Type

type masstype
   As Integer num_neighbors
   As NeighborType Neighbor(1 To neighbors)
   as vectortype frc, vel, psn
   as Single density, angvel, torque
end Type

''   dim variables
Dim as integer    center_x    = screen_wid\2
Dim as integer    center_y   = screen_hgt\2

dim as integer mouse_x, mouse_y, mouse_x_old, mouse_y_old, mouse_vel_x, mouse_vel_y

dim Shared As masstype mass(1 to num_masses)
dim Shared As celltype cell(1 to num_cells_row, 1 To num_cells_col)

''   narrow phase collision detection. Make particles neighbors if distance < r
Sub CheckIfNeighbor(ByVal a_ As Integer, ByVal b_ As Integer)
   
   If mass(a_).num_neighbors = neighbors Then Exit sub
   If mass(b_).num_neighbors = neighbors Then Exit Sub
   
   Dim As vectortype dist
   
   dist.x = mass(b_).psn.x-mass(a_).psn.x: If Abs(dist.x) > r Then Exit Sub
   dist.y = mass(b_).psn.y-mass(a_).psn.y: If Abs(dist.y) > r Then Exit Sub
   
   Dim As Single dist_sqrd = dist.x*dist.x+dist.y*dist.y
   
   If dist_sqrd > r_sqrd Or dist_sqrd = 0 Then Exit Sub
   
   Dim As Single distance = Sqr(dist_sqrd)
   
   Dim As vectortype norm_dist = (dist.x/distance, dist.y/distance)
   
   Dim As Single density = 1 - distance / r
   
   '' create neighbors and save data
   With mass(a_)
      .num_neighbors += 1
      .Neighbor(.num_neighbors).a = b_
      .Neighbor(.num_neighbors).dist = distance
      .Neighbor(.num_neighbors).norm_dist.x = norm_dist.x
      .Neighbor(.num_neighbors).norm_dist.y = norm_dist.y
      .Density += density
   End With
   
   With mass(b_)
      .num_neighbors += 1
      .Neighbor(.num_neighbors).a = a_
      .Neighbor(.num_neighbors).dist = distance
      .Neighbor(.num_neighbors).norm_dist.x = -norm_dist.x
      .Neighbor(.num_neighbors).norm_dist.y = -norm_dist.y
      .Density += density
   End With
   
End Sub

Randomize Timer

Dim As Integer n = 1

''   place particles
For i As Integer = 1 To block_width
   For j As Integer = 1 To block_height
      With mass(n)
         .psn.x = i * radius * 2
         .psn.y = screen_hgt - j * radius * 2
         
         .psn.x += (Rnd-Rnd)
         .psn.y += (Rnd-Rnd)
         
         .vel.x += (Rnd-Rnd)
         .vel.y += (Rnd-Rnd)

      End With
      n += 1
   Next
Next

''   create opengl screen
ScreenRes screen_wid, screen_hgt, 32,, 2
glMatrixMode(GL_PROJECTION)  
glLoadIdentity()
glViewport(0, 0, screen_wid, screen_hgt)
glOrtho(0, screen_wid, screen_hgt, 0, 0, 32)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
glClearColor (0.6, 0.7, 1.0, 0.0)
'glenable(GL_ALPHA)
glEnable(GL_BLEND)
glblendfunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
'glblendfunc(GL_DST_COLOR , GL_SRC_COLOR)

getmouse(mouse_x, mouse_y)

''   main loop
Do
   
   '' save old mouse state
   mouse_x_old = mouse_x
   mouse_y_old = mouse_y
   
   ''   get new mouse state
   getmouse(mouse_x, mouse_y)
   
   '' calc mouse velocity
   mouse_vel_x = (mouse_x-mouse_x_old)/dt
   mouse_vel_y = (mouse_y-mouse_y_old)/dt
   
   ''   mouse interaction
   for i as integer = 1 to num_masses
      with mass(i)   
         
         Dim As vectortype dst
         
         dst.x = .psn.x - mouse_x:   if dst.x > interaction_radius then continue for
         dst.y = .psn.y - mouse_y:   if dst.y > interaction_radius then continue for
         
         if dst.x*dst.x+dst.y*dst.y > interaction_Radius*interaction_Radius then continue for
         
         if mouse_vel_x then .vel.x += (mouse_vel_x-.vel.x) * 0.16
         if mouse_vel_y then .vel.y += (mouse_vel_y-.vel.y) * 0.16
         
      end with   
   Next   
   
   ''   reset particles
   for i as integer = 1 to num_masses
      With mass(i)
         .density = 0
         .num_neighbors = 0
      End With
   Next
   
   ''   reset cells
   For i As Integer = 1 To num_cells_row
      For j As Integer = 1 To num_cells_col
         cell(i, j).Num_Masses = 0
      Next
   Next
   
   ''   update grid (broad phase collision detection)
   For i as integer = 1 to num_masses
      Dim As Integer cell_row = (mass(i).Psn.y\cell_hgt)+1
      Dim as integer cell_col = (mass(i).Psn.x\cell_wid)+1
      With cell(cell_col, cell_row)
         If .num_masses = cell_max_masses Then Continue For
         .num_masses += 1
         .Mass(.num_masses) = i
      End With
   Next
   
   ''   narrow phase collision detection
   For i As Integer = 1 To num_cells_row
      For j As Integer = 1 To num_cells_col
         If cell(i, j).num_masses = 0 Then Continue For
         For k_ As Integer = 1 To cell(i, j).num_masses
            Dim As Integer a_ = cell(i, j).mass(k_)
            
            If mass(a_).num_neighbors = neighbors Then Continue For
            
            ''   cell(x, y) - self 
            For l_ As Integer = k_+1 To cell(i, j).num_masses
               CheckIfNeighbor(a_, cell(i, j).mass(l_))
            Next
            
            ''   cell(x, y) - cell(x+1, y)
            If i < num_cells_row Then
               For l_ As Integer = 1 To cell(i+1, j).num_masses
                  CheckIfNeighbor(a_, cell(i+1, j).mass(l_))
               Next
            End If
            
            If j = num_cells_col Then Continue For
            
            ''   cell(x, y) - cell(x, y+1)
            For l_ As Integer = 1 To cell(i, j+1).num_masses
               CheckIfNeighbor(a_, cell(i, j+1).mass(l_))
            Next
            
            ''   cell(x, y) - cell(x+1, y+1)
            If i < num_cells_row Then
               For l_ As Integer = 1 To cell(i+1, j+1).num_masses
                  CheckIfNeighbor(a_, cell(i+1, j+1).mass(l_))
               Next
            End If
            
            ''   cell(x, y) - cell(x-1, y+1)
            If i > 1 Then
               For l_ As Integer = 1 To cell(i-1, j+1).num_masses
                  CheckIfNeighbor(a_, cell(i-1, j+1).mass(l_))
               Next
            End If
            
         Next
      Next
   Next
      
   ''   set pressure
   For i as integer = 1 to num_masses
      
      If mass(i).num_neighbors = 0 Then Continue For

      ''   mass i global pressure
      Dim As Single pressure = -k * (mass(i).density - rest_dens)
      
      For j as integer = 1 to mass(i).num_neighbors
         
         Dim As Single gradient = 1 - mass(i).neighbor(j).dist / r
            
         Dim As Integer l = mass(i).neighbor(j).a
         
         ''   mass i + l global pressure
         Dim As Single press = (pressure - k * (mass(l).density - rest_dens) )
         
         ''   mass i + l local pressure
         press -= k_near * gradient
         
         ''   viscosity
         Dim As vectortype vel = (mass(i).vel.x-mass(l).vel.x, mass(i).vel.y-mass(l).vel.y)
            
         Dim As Single proj_vel = vel.x*mass(i).neighbor(j).norm_dist.x+vel.y*mass(i).neighbor(j).norm_dist.y
         
         press -=  viscosity * proj_vel * gradient
         
         press *= gradient
            
         mass(i).frc.x += press * mass(i).neighbor(j).norm_dist.x
         mass(i).frc.y += press * mass(i).neighbor(j).norm_dist.y
         
         mass(l).frc.x -= press * mass(i).neighbor(j).norm_dist.x
         mass(l).frc.y -= press * mass(i).neighbor(j).norm_dist.y
         
      Next
      
   Next
   
   ''   integrate (since particle mass = 1, force and acceleration are identical)
   for i as integer = 1 to num_masses
      with mass(i)
         
         .frc.y += grav_acc
         
         .vel.x += .frc.x * half_dt
         .vel.y += .frc.y * half_dt
         
         .angvel += .torque * half_dt
         
         .psn.x += .vel.x * dt + .frc.x * dt * half_dt
         .psn.y += .vel.y * dt + .frc.y * dt * half_dt
         
         .vel.x += .frc.x * half_dt
         .vel.y += .frc.y * half_dt
         
         .angvel += .torque * half_dt
         
         .frc.x = 0
         .frc.y = 0
         
         .torque = 0
         
      end with
   Next
   
   ''   keep particles inside screen
   For i as integer = 1 to num_masses
      with mass(i)
         
         if .psn.x < radius then .psn.x = radius: .vel.x = -.vel.x*wall_friction: .vel.y *= wall_friction
         if .psn.x > screen_wid - radius then .psn.x = screen_wid -radius: .vel.x = -.vel.x*wall_friction: .vel.y *= wall_friction
         
         If .psn.y < radius then .psn.y = radius: .vel.y = -.vel.y*wall_friction: .vel.x *= wall_friction
         If .psn.y > screen_hgt - radius Then .psn.y = screen_hgt -radius: .vel.y = -.vel.y*wall_friction: .vel.x *= wall_friction
         
      end with
   Next
   
   ''   draw to screen
   glClear(GL_DEPTH_BUFFER_BIT Or GL_COLOR_BUFFER_BIT)
   
   glLoadIdentity()
   
   glenable(GL_POINT_SMOOTH)
   glpointsize(r)
   glcolor4f(0.0f, 0.0f, 0.0f, 0.25f)
   
   GLbegin(GL_POINTS)
      for i as integer = 1 to num_masses
         glvertex2f(mass(i).psn.x, mass(i).psn.y)
      Next
   GLend()
   
   gldisable(GL_POINT_SMOOTH)
   glpointsize(1)
   glcolor4f(1.0f, 1.0f, 0.0f, 0.75f)
   
   glbegin(GL_POINTS)
      for i as integer = 1 to num_masses
         glvertex2f(mass(i).psn.x, mass(i).psn.y)
      Next
   GLend()
   
   GLflush()
   
   Flip()
   
   sleep 1, 1
   
Loop Until MultiKey(1)

End

 


Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now

  • Similar Content

    • Slaventii_M
      By Slaventii_M
      Hi everybody!
      I've been studying Autoit not so long ago and today I want to share my game with you.
      Please check it out and tell me your opinion.
      Files in the archive:
      BG.jpg
      Mole.png
      Mole_Dead.png
      Shoot.wav
      Cursor.cur
      Game_Icon.iso
      Mole Shooter.au3
      Mole Shooter.exe
      Screenshots:
      Screenshot 1
      Screanshot 2
      Screanshot 3
      Files:
      Mole Shooter.rar
      Created and tested:
      Windows XP SP3 Game Edition (x86)
      Autoit Version: 3.3.10.2
    • seangriffin
      By seangriffin
      Here's the beginnings of SFML (the Simple and Fast Multimedia Library) for AutoIT. 
      This library provides a wealth of features for developing games and multimedia applications.  You can read up more about SFML here -> http://www.sfml-dev.org.  It uses OpenGL as the renderer for 2D graphics such as sprites, so it's performance is quite good.
      Currently my interest is in 2D sprite engines, so my focus is on the sprite and window APIs.  This is the precursor to another separate UDF I'm working on and will release soon.  If there's any interest I'll flesh out more of this API for the community.
      CSFML is the "C" binding / API for SFML, and it's this API that I'm building this UDF against.
      REQUIREMENTS:
      AutoIt3 3.2 or higher LIST OF FUNCTIONS (so far):
      _CSFML_Startup _CSFML_Shutdown _CSFML_sfClock_create _CSFML_sfClock_getElapsedTime _CSFML_sfClock_restart _CSFML_sfVector2f_Constructor _CSFML_sfVector2f_Update _CSFML_sfVector2f_Move _CSFML_sfColor_Constructor _CSFML_sfColor_fromRGB _CSFML_sfSizeEvent_Constructor _CSFML_sfEvent_Constructor _CSFML_sfVideoMode_Constructor _CSFML_sfRenderWindow_create _CSFML_sfRenderWindow_setVerticalSyncEnabled _CSFML_sfRenderWindow_isOpen _CSFML_sfRenderWindow_pollEvent _CSFML_sfRenderWindow_clear _CSFML_sfRenderWindow_drawText _CSFML_sfRenderWindow_drawSprite _CSFML_sfRenderWindow_display _CSFML_sfRenderWindow_close _CSFML_sfTexture_createFromFile _CSFML_sfSprite_create _CSFML_sfSprite_destroy _CSFML_sfSprite_setTexture _CSFML_sfSprite_setPosition _CSFML_sfSprite_setRotation _CSFML_sfSprite_rotate _CSFML_sfSprite_setOrigin _CSFML_sfFont_createFromFile _CSFML_sfText_create _CSFML_sfText_setString _CSFML_sfText_setFont _CSFML_sfText_setCharacterSize _CSFML_sfText_setFillColor EXAMPLE:
      Currently I only have one example, which is the "Short example" described in the CSFML API documentation, plus some extra features.  Essentially a window (GUI) allowing you to move a sprite around with the keyboard (including rotation).
      DOWNLOAD:
      You can download this UDF, including the example and associated files, from the following GitHub page:
      https://github.com/seanhaydongriffin/CSFML-UDF
      Cheers,
      Sean.
    • Triblade
      By Triblade
      Hi folks!
       
      First off, yeah this may be the lamest title. But it made you look anyway! 
       
      Edit: Now updated! With step-counter, reset button and a few GUI-tweaks. (the step-counter is cheating! It's calculated in advance...)
      I recently thought a screenshot of a finished maze may be smart to show, instead of only my long story and code. o=path, x=wall. Here it is:
       

       
      I started making my own implementation of the A* pathing script in a larger project, inspired by Toady's work. (But made one from scratch myself anyway )
      After the A* pathing script was working (not cleaned up yet) I wanted to test it. Unfortunately I got no good, randomized, maze lying around that also had the format I needed. So I made my own maze generator!
       
      I did a few hours of research on the matter and then a few evenings of scripting.
      For the people who are interested, one of my problems was that I needed 'one-cell' thick walls. Most maze generation have 1 pixel thick walls drawn by a line, that could be opened if a path is needed. The solution is so simple, I needed this guy to tell me. Click here for my inspiration source.
       
      This generator can be used with different sizes maze, even uneven ones! Just set the width and height settings. FYI, it must be odd numbers for this maze to work with it's containment walls.
      It's the 'simple' Depth-First Search, with backtracking. And without further ado; my a-maze-ing generator!:
      #cs ---------------------------------------------------------------------------- AutoIt Version: 3.3.12.0 Author: A-maze-ing generator Script Function: Generates a maze. In the $xy[$i][4] is the maze in array form. Don't forget to take the size with it, else it's just a string of o's and x's It does not generate an entrance or exit! #ce ---------------------------------------------------------------------------- ; Script Start - Add your code below here #include <Array.au3> #include <GUIConstantsEx.au3> #include <StaticConstants.au3> ; Set various variables ; width and height must be odd numbers to have a closed, functioning maze. Global $height = 27 ; demo height = 27 Global $width = 43; demo width = 43 ; Check if width & height are an odd number (to get the outer edge an odd number is required) If mod($height, 2) = 0 Or $height < 5 Then msgbox(0,"","Height is not an odd number or a minimum of 5 tall !") Exit ElseIf mod($width, 2) = 0 Or $width < 5 Then msgbox(0,"","Width is not an odd number of a minimum of 5 wide !") Exit EndIf ; Set various variables when script is not exited Global $grid_size = $height * $width Global $numberofsteps = (Ceiling(($height-2) / 2) * (($width-2) - Ceiling(($width-2) / 2))) + (($height-2) - Ceiling(($height-2) / 2)) ; long formula to check the number of steps this maze will take, this is a mathematical given with a fixed number of cells. And yes, I am aware I'm taking a shortcut in this formula. ;) Global $curpos Global $backtrack[1] Global $bt = 0 Local $grid_pixel = 20 ;How many pixels per square ; Initialize main array with all grid data Global $xy[$grid_size + 1][5] Global $reset_xy = $xy ; set the reset array $xy[0][0] = $grid_size ; first entry is the total number of nodes, rest is set with a header name for easy reference in _ArrayDisplay if needed. $xy[0][1] = "ID" $xy[0][2] = "Row" $xy[0][3] = "Column" $xy[0][4] = "Type" ; Fill the grid array with 'walls' For $i = 1 To $xy[0][0] $xy[$i][4] = "x" Next ; Start GUI and create standard buttons Local $gui = GUICreate("A-maze-ing generator", 180 + ($width * $grid_pixel), 80 + ($height * $grid_pixel)) ; Set the main window to the minimum width (IF) needed for the msgbox Local $aPos = WinGetPos($gui) If $aPos[2] < 696 Then $aPos[2] = 696 WinMove($gui, "", $aPos[0], $aPos[1], $aPos[2], $aPos[3]) EndIf GUICtrlCreateLabel("This is a-maze-ing!", 30, 19) Global $progress = GUICtrlCreateLabel("Standing by... " & $numberofsteps & " steps to go.", 150, 15, 550, 30) Local $iOKButton = GUICtrlCreateButton("Start", 45, 50, 60) Local $iResetButton = GUICtrlCreateButton("Reset", 45, 90, 60) Local $iExitButton = GUICtrlCreateButton("Exit", 45, 130, 60) GUICtrlSetFont($progress, 15) GUICtrlSetColor($progress, 0x00AA00) GUICtrlSetState($iResetButton, $GUI_DISABLE) ; Create label-grid and fill the xy array with the positions Local $squarenr = 0 For $i = 0 To ($height * $grid_pixel) - $grid_pixel Step $grid_pixel ; Row For $j = 0 To ($width * $grid_pixel) - $grid_pixel Step $grid_pixel ; Column $squarenr = $squarenr + 1 $xy[$squarenr][0] = GUICtrlCreateLabel('x', 150 + $j, 50 + $i, $grid_pixel, $grid_pixel, BitOr($SS_SUNKEN, $SS_CENTER)) ; if you want debugging numbers, replace 'x' with $squarenr GUICtrlSetBkColor($xy[$squarenr][0], 0x5E87C9) ; lightblue-ish $xy[$squarenr][1] = $squarenr $xy[$squarenr][2] = ($i / $grid_pixel) + 1 $xy[$squarenr][3] = ($j / $grid_pixel) + 1 Next Next $reset_xy = $xy ; Show GUI GUISwitch($gui) GUISetState(@SW_SHOW) ; Start looping and waiting for input Local $aMsg = 0 While 1 $aMsg = GUIGetMsg(1) Select Case $aMsg[0] = $iOKButton GUICtrlSetState($iOKButton, $GUI_DISABLE) GUICtrlSetState($iResetButton, $GUI_DISABLE) GUICtrlSetState($iExitButton, $GUI_DISABLE) GUICtrlSetColor($progress, 0xFF8C00) ; orange GUICtrlSetData($progress, "Running - Creating maze. Please stand by... " & $numberofsteps & " steps to go.") make_maze() GUICtrlSetColor($progress, 0xFF0000) ; red GUICtrlSetData($progress, "Maze complete!") Sleep(1000) ; Just a small sleep for dramatic effect GUICtrlSetColor($progress, 0x00AA00) ; green-ish GUICtrlSetData($progress, "Maze completed in " & $numberofsteps & " steps.") GUICtrlSetState($iResetButton, $GUI_ENABLE) GUICtrlSetState($iExitButton, $GUI_ENABLE) Case $aMsg[0] = $iResetButton GUICtrlSetData($progress, "Resetting maze...") reset_maze() GUICtrlSetState($iResetButton, $GUI_DISABLE) GUICtrlSetState($iOKButton, $GUI_ENABLE) GUICtrlSetData($progress, "Maze reset!") Sleep(1000) ; Just a small sleep for dramatic effect GUICtrlSetData($progress, "Standing by...") Case $aMsg[0] = $GUI_EVENT_CLOSE Or $aMsg[0] = $iExitButton ExitLoop EndSelect WEnd Exit ; Resetting the maze to default state Func reset_maze() $xy = $reset_xy ; Set the $xy array back to it first-run values For $i = 1 To $xy[0][0] $xy[$i][4] = "x" ; set everything to 'x' GUICtrlSetBkColor($xy[$i][0], 0x5E87C9) ; reset the background color GUICtrlSetData($xy[$i][0], "x") ; (re)set the label to 'x' Next EndFunc ; Main function Func make_maze() Local $heading Local $stepcount = $numberofsteps ; Reset the step counter. Local $timed = TimerInit() ; Start the timer to see how long the maze generation took. $backtrack[0] = 0 $curpos = $width + 2 ; This is the starting position, second row, second column - aka top-left, one in from the sides. open_maze($curpos) ; Set the starter cell to 'open / white' ; Main maze generation loop While 1 Do $heading = direction($curpos) Until $heading <> 0 If $bt = 1 Then $bt = 0 ; reset backtracking-tracker, else the backtracking array keeps adding the current position GUICtrlSetData($progress, "Running - Creating maze. Please stand by... " & $stepcount & " steps to go.") Sleep(50) ; Slow maze creation down to look at it - relax! (or don't and comment out the sleep) If $heading = -1 Then ExitLoop $stepcount -= 1 ; Count down the steps to finish. ; We got the heading - now which way do we go? After that, set the current position to the last known heading. Switch $heading Case 1 ; north open_maze($curpos - $width) open_maze($curpos - ($width * 2)) $curpos = $curpos - ($width * 2) Case 2 ; east open_maze($curpos + 1) open_maze($curpos + 2) $curpos = $curpos + 2 Case 3 ; south open_maze($curpos + $width) open_maze($curpos + ($width * 2)) $curpos = $curpos + ($width * 2) Case 4 ; west open_maze($curpos - 1) open_maze($curpos - 2) $curpos = $curpos - 2 EndSwitch ;msgbox(0,"","Turn pause") ; for debugging, click every turn. WEnd ConsoleWrite("Maze completed in " & Round(TimerDiff($timed) / 1000, 1) & " seconds." & @CRLF) ; Show the generation time in seconds, rounded up with one decimal Return EndFunc Func open_maze($dest) ; Function set inputted cells to 'open' instead of being an uncool wall. $xy[$dest][4] = "o" GUICtrlSetData($xy[$dest][0], 'o') ; If you want debugging numbers, replace 'o' with $dest GUICtrlSetBkColor($xy[$dest][0], 0xEEEEEE) EndFunc Func direction(ByRef $curpos) ; Insert current position, output next heading for path generation. Local $nesw Local $open_directions[5][2] $open_directions[0][0] = 0 $nesw = $curpos - ($width * 2) ; north side checking If $nesw > $width + 1 Then fill_open_dir($nesw, 1, $open_directions) $nesw = $curpos + 2 ; east side checking If mod($nesw - 1, $width) <> 0 Then fill_open_dir($nesw, 2, $open_directions) $nesw = $curpos + ($width * 2) ; south side checking If $nesw < $grid_size - $width Then fill_open_dir($nesw, 3, $open_directions) $nesw = $curpos - 2 ; west side checking If mod($nesw, $width) <> 0 Then fill_open_dir($nesw, 4, $open_directions) ; Check which (if any) direction(s) are already opened, if so, discard them from the results-array For $i = $open_directions[0][0] To 1 Step -1 If $xy[$open_directions[$i][1]][4] = "o" Then $open_directions[0][0] -= 1 _ArrayDelete($open_directions, $i) EndIf Next ; If there are any results left... If $open_directions[0][0] > 0 Then If $open_directions[0][0] = 1 Then Return $open_directions[1][0] ; Random does not work with min 1 and max 1 (output = 0), so in this case, return only with the only one result. Else If $bt = 0 Then ; If there is not backtracking active, add this crossroad to the backtrack-array. This is only needed if there are two or three possible sides. $backtrack[0] += 1 _ArrayAdd($backtrack, $curpos) EndIf Return $open_directions[Random(1, $open_directions[0][0], 1)][0] ; Random choose between all possible directions and return with the outcome direction. EndIf ElseIf $backtrack[0] > 0 Then ; If there are no results ánd there are entries in the backtrack list, then visit those entries to see if there still is a path possible. $curpos = $backtrack[$backtrack[0]] _ArrayDelete($backtrack, $backtrack[0]) $backtrack[0] -= 1 $bt = 1 Return 0 ; Return with a new current direction ($curpos), from the backtrack array. Else Return -1 ; If there are no paths to explorer, in the pathing, or backtracking, then return with the message that we are finished. EndIf EndFunc Func fill_open_dir($nesw, $direction, ByRef $open_directions) ; Fill the $open_directions array with a new possible way $open_directions[0][0] += 1 $open_directions[$open_directions[0][0]][1] = $nesw $open_directions[$open_directions[0][0]][0] = $direction Return EndFunc  
      P.S.  The 'slow' generation is intended because it looks cool. Comment out the Sleep line on line 157 for a fast generation.
    • rm4453
      By rm4453
      Hey guys! I need to find a way to wrap an autoit gui around a game. I am planning on making a custom gui overlay for interacting with my stream, which will allow me to run giveaways and stuff like that. But I need to find a way to force the steam games to run inside my autoit gui... I have the following code so far credit to those I took code from and modified to suite my needs "can't remember who u are pls post if i owe ty to u" If I select notepad and launch it then it works great! and the notepad window is wrapped inside my gui. However if I try it with teamfortress 2 it won't work...
       
      #include <Array.au3> #include <File.au3> #include <WinAPI.au3> #include <GUIConstants.au3> Local $msg, $hwnd, $WinHwnd ;===> UDV Start $pid = 0 $Hidden = 0 $exe = 0 $sDrive = 0 $sDir = 0 $sFileName = 0 $sExtension = 0 ;===> UDV End $hwnd = GUICreate("hello") $Open = GUICtrlCreateButton("Launch Game", 10, 30, 75, 25) $Select = GUICtrlCreateButton("Select Game", 10,60,75,25) GUISetState() ;===> UDF START Func _GetWinHwnd($pid) $aWinlist = WinList() For $i = 1 To $aWinlist[0][0] If $pid = WinGetProcess($aWinlist[$i][0]) Then Return $aWinlist[$i][0] Next EndFunc ;==>_GetWinHwnd Func _SetParentWindow($pid) $WinInfo = _GetWinHwnd($pid) $WinHwnd = ControlGetHandle($WinInfo, "", "") _WinAPI_SetParent($WinHwnd, $hwnd) _WinAPI_SetWindowLong($WinHwnd, $GWL_STYLE, $WS_POPUP + $WS_VISIBLE) WinMove($WinHwnd, "", 0, 0) EndFunc ;==>_SetParentWindow Func RedrawGui($RedrawMe) If ProcessExists($pid) And $Hidden = 0 Then GUICtrlSetState($RedrawMe, @SW_HIDE) $Hidden = 1 sleep(50) _WinAPI_RedrawWindow($pid) Sleep(50) ElseIf $Hidden = 1 And Not ProcessExists($pid) Then GUICtrlSetState($RedrawMe, @SW_SHOW) $Hidden = 0 EndIf EndFunc ;===> UDF END While 1 $msg = GUIGetMsg() Switch $msg Case $GUI_EVENT_CLOSE If ProcessExists($pid) Then ProcessClose($pid) GUICtrlSetState($Open, @SW_SHOW) Else Exit EndIf Case $Open GUICtrlSetState($Open, @SW_HIDE) Sleep(100) $pid = Run('"' & $exe & '" -game tf -steam') #cs This RUN CMD is custom made for testing with TF2 change to just $exe to select any exe you want to test with -game tf specifies to launch tf2 and -steam gets rid of insecure mode error #ce RedrawGui($Open) ProcessWait($pid) Sleep(5500) _GetWinHwnd($pid) _SetParentWindow($pid) Case $Select $exe = FileOpenDialog("Please select your game!", @ScriptDir, "Executable File (*.exe)", "1", "Process Selection") Sleep(50) FileChangeDir(@ScriptDir) _PathSplit($exe, $sDrive, $sDir, $sFileName, $sExtension) EndSwitch WEnd  
    • Wingens
      By Wingens
      Hi,
      I don't know if it is possible but I am creating a little program to catalog my game collection.
      It would be awesome if my program could get the boxcover, developer info and game info with the titles I add.
      Does anyone know how to get me started?