Gamemaker Studio 2 Gml -
GML looks up variables slowly. Use var for temporary variables.
// SLOW (looks up sprite_width 60 times per second) repeat(100) draw_sprite(spr_player, 0, x + sprite_width, y);
// FAST var sw = sprite_width; repeat(100) draw_sprite(spr_player, 0, x + sw, y);
You have the syntax. Now you need the knowledge library.
The syntax mirrors C/JavaScript closely. gamemaker studio 2 gml
// If statement if (hp <= 0) instance_destroy(); else if (hp < 30) audio_play_sound(snd_lowhealth, 0, false);// For loop for (var i = 0; i < 10; i++) draw_text(32, 32 + (i * 20), "Enemy " + string(i));
// With statement (a GML favorite) with (obj_enemy) hp -= 10; // Reduces the HP of all enemies on screen
function Enemy(_name, _hp) constructor name = _name; hp = _hp;static take_damage = function(amount) this.hp -= amount; if (this.hp <= 0) show_debug_message(this.name + " dies!");
// Usage: var goblin = new Enemy("Goblin", 50); var troll = new Enemy("Troll", 120); goblin.take_damage(30);
Create a new script in GMS2 and name it draw_deep_paper. Paste the following code:
/// @function draw_deep_paper(x, y, depth, facing_angle, sprite_index, image_index) /// @description Draws a "deep" paper effect with simulated 3D thickness. /// @param real _x The x position to draw at. /// @param real _y The y position to draw at. /// @param real _depth The pixel thickness of the paper. /// @param real _angle The angle of the paper (0 = upright, rotates clockwise). /// @param sprite _sprite The sprite to use for the top surface. /// @param real _frame The frame index of the sprite.function draw_deep_paper(_x, _y, _depth, _angle, _sprite, _frame) GML looks up variables slowly
// 1. SETUP // Calculate the offset based on angle. // We use lengthdir to push the "back" face behind the "front" face. var _dir = _angle + 90; // Adjust so 0 degrees is "up" var _x_off = lengthdir_x(_depth, _dir); var _y_off = lengthdir_y(_depth, _dir); // Get sprite dimensions var _w = sprite_get_width(_sprite); var _h = sprite_get_height(_sprite); var _xc = sprite_get_xoffset(_sprite); var _yc = sprite_get_yoffset(_sprite); // Define Colors var _col_top = c_white; // Top face color (tint) var _col_edge = make_color_rgb(200, 200, 200); // Light grey for sides var _col_bottom = make_color_rgb(150, 150, 150); // Darker grey for underneath // 2. DRAW THE EDGES (The "Thickness") // We use primitives to draw a band connecting the top and bottom faces. draw_primitive_begin_texture(pr_trianglestrip, -1); // We define 4 points. // Points 1 & 2 are on the "Bottom" face (pushed back). // Points 3 & 4 are on the "Top" face (at position). // Bottom-Left (Back) draw_vertex_color(_x - _xc + _x_off, _y - _yc + _y_off, _col_edge, 1); // Top-Left (Back) draw_vertex_color(_x - _xc + _x_off, _y - _yc + _h + _y_off, _col_edge, 1); // Bottom-Right (Front) draw_vertex_color(_x - _xc + _w, _y - _yc, _col_edge, 1); // Top-Right (Front) draw_vertex_color(_x - _xc + _w, _y - _yc + _h, _col_edge, 1); // Note: This simple primitive creates a solid block edge. // For better visuals, we stop here and just draw a rectangle for the edge. // GMS2 Primitives are tricky for simple rects, so let's use draw_rectangle for the side. // Actually, let's just draw the "Side" as a parallelogram for simplicity. // We will draw the right-side edge (the one visible if looking from top-right). // If we assume light comes from top-left, the right edge should be visible. // Let's simplify the logic for GMS2 beginners: // We will draw a parallelogram connecting the top-right corner to the bottom-right corner. draw_primitive_end(); // End the previous attempt to keep code clean // Draw the connecting strip (The "Spine") // This connects the bottom-right corner of the "back" to the "front" draw_set_color(_col_edge); draw_primitive_begin(pr_trianglefan); draw_vertex(_x - _xc + _w + _x_off, _y - _yc + _y_off); // BR Back draw_vertex(_x - _xc + _w, _y - _yc); // BR Front draw_vertex(_x - _xc + _w, _y - _yc + _h); // TR Front draw_vertex(_x - _xc + _w + _x_off, _y - _yc + _h + _y_off); // TR Back draw_primitive_end(); // 3. DRAW THE BOTTOM FACE (The "Back") // Draw the sprite slightly offset and darkened to simulate the back of the paper. draw_set_color(_col_bottom); draw_sprite_ext(_sprite, _frame, _x + _x_off, _y + _y_off, 1, 1, 0, _col_bottom, 1); // 4. DRAW THE TOP FACE (The "Front") // Draw the main sprite. draw_set_color(_col_top); draw_sprite_ext(_sprite, _frame, _x, _y, 1, 1, 0, _col_top, 1);
| Problem | Solution |
|---------|----------|
| Object not moving | Check if Step event exists and speed vars are applied |
| Collisions jittery | Use place_meeting() + move_contact_all() |
| Memory leaks | Destroy instances with instance_destroy(); remove data structures with ds_map_destroy() etc. |
| Slow game | Avoid draw_text every step; use surfaces or culling |
// Array inventory = ["sword", "shield", "potion"];
// Struct (like a dictionary/object) player_data = name: "Kaelen", level: 5, stats: str: 12, agi: 8 ;You have the syntax
// Around suspect code
var _time = current_time;
// ... your code ...
show_debug_message("Took: " + string(current_time - _time) + "ms");