Cheat Engine Forum Index Cheat Engine
The Official Site of Cheat Engine
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 


Create Games with CE (Holiday Fun)

 
Post new topic   Reply to topic    Cheat Engine Forum Index -> Cheat Engine Tutorials -> LUA Tutorials
View previous topic :: View next topic  
Author Message
AylinCE
Grandmaster Cheater Supreme
Reputation: 36

Joined: 16 Feb 2017
Posts: 1511

PostPosted: Sun Jul 13, 2025 5:58 pm    Post subject: Create Games with CE (Holiday Fun) Reply with quote

Create Games with CE (Holiday Fun)

I'm offering a coding primer that's just for fun and can be further shaped by your imagination.

What will we do?

1) We'll structure our images and GIFs as "Sprite Sheets" to take up less space.
2) Using the main code snippet and accurate calculations,
we'll divide our Sprite Sheet image into pieces and transfer them to the spreadsheets.
3) We'll complete and test our first movements with a timer, a form, and a few buttons.

So, let's get started.

1) Creating Sprite Sheet Characters:
Create this completely free and easy-to-create, download, and use template,
which includes a wide variety of character, costume, skin, armor, and weapon options.

https://liberatedpixelcup.github.io/Universal-LPC-Spritesheet-Character-Generator

2) Crop the character image you created, which includes many movement variations, and where each line adds up to a GIF, and arrange it in squares on a table.

Code:
-- Direction-row mapping for each sprite (customizable by user)
local allDirections = { }

-- Extract individual frames from a sprite sheet
-- Organizes as: [spriteIndex][directionName][frameIndex] = picture
function extractFrames(spriteFile, frameCounts, frameWidth, frameHeight)
  local sprite = createPicture()
  sprite.loadFromStream(findTableFile(spriteFile).stream)

  local allFrames = {}
  local currentRow = 0

  for spriteIndex = 1, 2 do
    allFrames[spriteIndex] = {}
    for dirName, rowIndex in pairs(allDirections[spriteIndex]) do
      local frameCount = frameCounts[rowIndex]
      local y = (rowIndex - 1) * frameHeight
      local rowFrames = {}

      for frameIndex = 1, frameCount do
        local framePic = createPicture()
        framePic.Bitmap.Width = frameWidth
        framePic.Bitmap.Height = frameHeight
        framePic.Bitmap.Canvas.copyRect(
          0, 0, frameWidth, frameHeight,
          sprite.Bitmap.Canvas,
          (frameIndex - 1) * frameWidth, y,
          frameIndex * frameWidth, y + frameHeight
        )
        framePic.Transparent = true
        framePic.Bitmap.Transparent = true
        framePic.Bitmap.TransparentColor = framePic.Bitmap.Canvas.getPixel(0, 0)
        table.insert(rowFrames, framePic)
      end

      allFrames[spriteIndex][dirName] = rowFrames
    end
  end

  return allFrames
end


Note:
Don't use the entire image.
Crop only the keyframes in a photo editor.
Make sure to center and crop between the lines correctly.
Then, count the total number of frames in the image from left to right (the example image has a maximum of 9 frames).
Divide this by the width to calculate the width of each frame:
(In the example image, the width is 1.152, the maximum number of frames is 9. 1152/9 = 128
frameWidth = 128)
Similarly, calculate the frame height:
(In the example image, the height is 1014, the number of frames is 8. 1014/8 = 126.75,
frameHeight = 126.75)
Now create a table: How many frames are in each row?
(The example image has 4x9 and 4x6. So, the table is:
frameCounts = {9,9,9,9,6,6,6,6}
Finally, add the image to the CE (Table>>add file) and simply name the image in the script: spriteFile = "female3.png"

If everything went well, your character table is ready.

The rest is up to your imagination:

Here's a ready-made script using the example image:

Note: To move the images, enter the number 1 or 2 in the edit box.

Code:
-- Direction-row mapping for each sprite (customizable by user)
local allDirections = { }

-- Extract individual frames from a sprite sheet
-- Organizes as: [spriteIndex][directionName][frameIndex] = picture
function extractFrames(spriteFile, frameCounts, frameWidth, frameHeight)
  local sprite = createPicture()
  sprite.loadFromStream(findTableFile(spriteFile).stream)

  local allFrames = {}
  local currentRow = 0

  for spriteIndex = 1, 2 do
    allFrames[spriteIndex] = {}
    for dirName, rowIndex in pairs(allDirections[spriteIndex]) do
      local frameCount = frameCounts[rowIndex]
      local y = (rowIndex - 1) * frameHeight
      local rowFrames = {}

      for frameIndex = 1, frameCount do
        local framePic = createPicture()
        framePic.Bitmap.Width = frameWidth
        framePic.Bitmap.Height = frameHeight
        framePic.Bitmap.Canvas.copyRect(
          0, 0, frameWidth, frameHeight,
          sprite.Bitmap.Canvas,
          (frameIndex - 1) * frameWidth, y,
          frameIndex * frameWidth, y + frameHeight
        )
        framePic.Transparent = true
        framePic.Bitmap.Transparent = true
        framePic.Bitmap.TransparentColor = framePic.Bitmap.Canvas.getPixel(0, 0)
        table.insert(rowFrames, framePic)
      end

      allFrames[spriteIndex][dirName] = rowFrames
    end
  end

  return allFrames
end

--============================================================--
-- Direction-to-row mapping for each sprite
-- Example: sprite 1 uses rows 1–4, sprite 2 uses rows 5–8
allDirections = {
  [1] = { ["↑"]=1, ["←"]=2, ["↓"]=3, ["→"]=4 },
  [2] = { ["↑"]=5, ["←"]=6, ["↓"]=7, ["→"]=8 }
}

-- Frame setup
local frameCounts = {9,9,9,9,6,6,6,6}
local spriteFile = "female3.png"
local frameWidth, frameHeight = 128, 126.75

-- Extract and store all sprite frames
local allFrames = extractFrames(spriteFile, frameCounts, frameWidth, frameHeight)

--=============================================================--
-- Runtime state: sprite control and animation trackers
local imgArray = {}
local currentFrameIndex = { [1]=1, [2]=1 }
local spriteDirection = { [1]="↑", [2]="↑" }
local activeSprite = 1

-- Main UI form
if f2 then f2.Destroy() end
f2 = createForm()
f2.Width = 660
f2.Height = 450

f2.OnClose=function()
if frameTmr1 then frameTmr1.Destroy() frameTmr1 = nil end
f2.Destroy()
end

-- Image containers for sprites
for i=1, 2 do
  imgArray[i] = createImage(f2)
  imgArray[i].Left = (i == 1) and 40 or 500
  imgArray[i].Top = 350
  imgArray[i].Width = frameWidth
  imgArray[i].Height = frameHeight
  imgArray[i].Stretch = true
  imgArray[i].Transparent = true
end

-- Animation timer
if frameTmr1 then frameTmr1.Destroy() frameTmr1 = nil end
frameTmr1 = createTimer(f2)
frameTmr1.Interval = 125
frameTmr1.OnTimer = function()
  for i=1, 2 do
    local dir = spriteDirection[i]
    local frames = allFrames[i][dir]
    if frames and #frames > 0 then
      imgArray[i].Picture = frames[currentFrameIndex[i]]
      currentFrameIndex[i] = currentFrameIndex[i] % #frames + 1
    end
  end
end

-- Sprite selector (editbox)
local indexEdit = createEdit(f2)
indexEdit.Left = 430
indexEdit.Top = 390
indexEdit.Width = 40
indexEdit.Text = tostring(activeSprite)

indexEdit.OnChange = function(sender)
  local val = tonumber(sender.Text)
  if val == 1 or val == 2 then activeSprite = val end
end

-- Movement function updates position and direction
local function moveSprite(dx, dy, direction)
  spriteDirection[activeSprite] = direction
  imgArray[activeSprite].Left = imgArray[activeSprite].Left + dx
  imgArray[activeSprite].Top = imgArray[activeSprite].Top + dy
end

-- Directional movement buttons
local function createDirButton(caption, x, y, dx, dy)
  local btn = createButton(f2)
  btn.Left = x
  btn.Top = y
  btn.Caption = caption
  btn.OnClick = function() moveSprite(dx, dy, caption) end
end

createDirButton("←", 210, 390, -15, 0)
createDirButton("→", 335, 390, 15, 0)
createDirButton("↑", 275, 360, 0, -15)
createDirButton("↓", 275, 420, 0, 15)


(If you can't see the image, try refreshing the page.)

If you write a good game, the next step should be saving the data to a global server.

User registration...
User login system...
User data...
Online chat window...
And loading the main form with a secure login.

I've compiled all of this into a single program and integrated it into CE with "aceserver.exe."

But that's a topic for another article; it's still being developed. Idea

Until we meet again on another fun and exciting topic, enjoy it! Smile

_________________
Hi Hitler Different Trainer forms for you!
https://forum.cheatengine.org/viewtopic.php?t=619279
Enthusiastic people: Always one step ahead
Do not underestimate me Master: You were a beginner in the past
Back to top
View user's profile Send private message Visit poster's website MSN Messenger
Display posts from previous:   
Post new topic   Reply to topic    Cheat Engine Forum Index -> Cheat Engine Tutorials -> LUA Tutorials All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You cannot download files in this forum


Powered by phpBB © 2001, 2005 phpBB Group

CE Wiki   IRC (#CEF)   Twitter
Third party websites