From 46d52dd53b7c60818e5989134dd971028bbe0ab2 Mon Sep 17 00:00:00 2001 From: rexim Date: Thu, 5 Nov 2015 00:52:20 +0600 Subject: [PATCH 1/6] Create prerendered board (#114) --- pacmacs-render.el | 7 +++++++ pacmacs.el | 48 +++++++++++++++++++++++++++++------------------ 2 files changed, 37 insertions(+), 18 deletions(-) diff --git a/pacmacs-render.el b/pacmacs-render.el index 3606baa..ea7bd76 100644 --- a/pacmacs-render.el +++ b/pacmacs-render.el @@ -57,6 +57,13 @@ (current-frame (plist-get (pacmacs-anim-get-frame anim) :frame))) (pacmacs-insert-image sprite-sheet current-frame))) +(defun pacmacs--replace-anim (start end anim) + (let* ((sprite-sheet (plist-get anim :sprite-sheet)) + (current-frame (plist-get (pacmacs-anim-get-frame anim) :frame))) + (put-text-property start end + (list (cons 'slice current-frame) + sprite-sheet)))) + (defun pacmacs--render-object (anim-object) (if anim-object (let* ((anim (plist-get anim-object :current-animation))) diff --git a/pacmacs.el b/pacmacs.el index ffd3103..63b89e8 100644 --- a/pacmacs.el +++ b/pacmacs.el @@ -444,16 +444,23 @@ (dolist (wall pacmacs--wall-cells) (pacmacs--put-object wall))) -(defun pacmacs--render-state () +(defun pacmacs--prerender-game-board () (with-current-buffer pacmacs-buffer-name (let ((inhibit-read-only t)) (erase-buffer) + (plist-bind ((width :width) + (height :height)) + pacmacs--object-board + (dotimes (row height) + (dotimes (column width) + (insert " ")) + (insert "\n")))))) - (insert (format "Score: %d\n\n" pacmacs-score)) - - (when pacmacs-debug-output - (pacmacs--render-track-board pacmacs--track-board)) - +(defun pacmacs--render-state () + (with-current-buffer pacmacs-buffer-name + (let ((inhibit-read-only t)) + ;; (erase-buffer) + (plist-bind ((width :width) (height :height)) pacmacs--object-board @@ -461,17 +468,20 @@ (dotimes (column width) (let ((anim-object (car (pacmacs--cell-wrapped-get pacmacs--object-board row column)))) - (pacmacs--render-object anim-object))) - (insert "\n"))) - (insert "\n") - (dotimes (i pacmacs-lives) - (ignore i) - (pacmacs--render-life-icon)) - - (when (equal pacmacs-game-state 'game-over) - (-> (pacmacs--read-score-table) - (pacmacs--sort-score-table) - (pacmacs--render-score-table))) + (pacmacs--render-object anim-object))))) + ;; (insert (format "Score: %d\n\n" pacmacs-score)) + + ;; (when pacmacs-debug-output + ;; (pacmacs--render-track-board pacmacs--track-board)) + + ;; (dotimes (i pacmacs-lives) + ;; (ignore i) + ;; (pacmacs--render-life-icon)) + + ;; (when (equal pacmacs-game-state 'game-over) + ;; (-> (pacmacs--read-score-table) + ;; (pacmacs--sort-score-table) + ;; (pacmacs--render-score-table))) (goto-char 0)))) (defun pacmacs--unpaused-play-state-p () @@ -559,7 +569,9 @@ wall (plist-put wall :current-animation (pacmacs-make-anim (list (pacmacs-make-frame '(0 0 40 40) 100)) - (pacmacs--wall-tile-at row column))))))) + (pacmacs--wall-tile-at row column))))) + + (pacmacs--prerender-game-board))) (provide 'pacmacs) From 1211b59ef3054213d69985a80e95563a944cfb1d Mon Sep 17 00:00:00 2001 From: rexim Date: Thu, 5 Nov 2015 00:57:06 +0600 Subject: [PATCH 2/6] Fix the compilation errors (#114) --- pacmacs-render.el | 2 +- pacmacs.el | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/pacmacs-render.el b/pacmacs-render.el index ea7bd76..077c739 100644 --- a/pacmacs-render.el +++ b/pacmacs-render.el @@ -60,7 +60,7 @@ (defun pacmacs--replace-anim (start end anim) (let* ((sprite-sheet (plist-get anim :sprite-sheet)) (current-frame (plist-get (pacmacs-anim-get-frame anim) :frame))) - (put-text-property start end + (put-text-property start end 'display (list (cons 'slice current-frame) sprite-sheet)))) diff --git a/pacmacs.el b/pacmacs.el index 63b89e8..0567a32 100644 --- a/pacmacs.el +++ b/pacmacs.el @@ -452,7 +452,9 @@ (height :height)) pacmacs--object-board (dotimes (row height) + (ignore row) (dotimes (column width) + (ignore column) (insert " ")) (insert "\n")))))) From 794501a279eeb003a395f0c390cb33964824ad33 Mon Sep 17 00:00:00 2001 From: rexim Date: Fri, 6 Nov 2015 01:48:52 +0600 Subject: [PATCH 3/6] Apply display switching technique (#114) It still doesn't work correctly. Probably because of property collapsing. --- pacmacs-render.el | 18 +++++++++++++++--- pacmacs.el | 15 ++++++++++----- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/pacmacs-render.el b/pacmacs-render.el index 077c739..c71079a 100644 --- a/pacmacs-render.el +++ b/pacmacs-render.el @@ -45,6 +45,13 @@ nil nil nil nil) '(0 0 40 40))) +(defun pacmacs--replace-empty-cell (start end) + (add-text-properties start end + `(display ,(pacmacs--create-wall-tile + 40 40 + nil nil nil nil + nil nil nil nil)))) + (defun pacmacs--render-life-icon () (when (not pacmacs--life-icon) (setq pacmacs--life-icon @@ -60,9 +67,9 @@ (defun pacmacs--replace-anim (start end anim) (let* ((sprite-sheet (plist-get anim :sprite-sheet)) (current-frame (plist-get (pacmacs-anim-get-frame anim) :frame))) - (put-text-property start end 'display - (list (cons 'slice current-frame) - sprite-sheet)))) + (add-text-properties start end `(display + ((slice . ,current-frame) + ,sprite-sheet))))) (defun pacmacs--render-object (anim-object) (if anim-object @@ -70,6 +77,11 @@ (pacmacs--render-anim anim)) (pacmacs--render-empty-cell))) +(defun pacmacs--replace-object (anim-object start end) + (plist-bind ((anim :current-animation)) + anim-object + (pacmacs--replace-anim start end anim))) + (defun pacmacs--render-track-board (track-board) (plist-bind ((width :width) (height :height)) diff --git a/pacmacs.el b/pacmacs.el index 0567a32..6a219de 100644 --- a/pacmacs.el +++ b/pacmacs.el @@ -466,11 +466,16 @@ (plist-bind ((width :width) (height :height)) pacmacs--object-board - (dotimes (row height) - (dotimes (column width) - (let ((anim-object (car (pacmacs--cell-wrapped-get pacmacs--object-board - row column)))) - (pacmacs--render-object anim-object))))) + (let ((tile-pos 1)) + (dotimes (row height) + (dotimes (column width) + (let ((anim-object (car (pacmacs--cell-wrapped-get pacmacs--object-board + row column)))) + (if anim-object + (pacmacs--replace-object anim-object tile-pos (1+ tile-pos)) + (pacmacs--replace-empty-cell tile-pos (1+ tile-pos)))) + (cl-incf tile-pos)) + (cl-incf tile-pos)))) ;; (insert (format "Score: %d\n\n" pacmacs-score)) ;; (when pacmacs-debug-output From dbba55af72247c1b51bf77f484b027702d31594e Mon Sep 17 00:00:00 2001 From: rexim Date: Fri, 6 Nov 2015 23:51:20 +0600 Subject: [PATCH 4/6] Use slicing for empty tiles (#114) Somehow it fixes the empty tile collapsing. --- pacmacs-render.el | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/pacmacs-render.el b/pacmacs-render.el index c71079a..108f4f5 100644 --- a/pacmacs-render.el +++ b/pacmacs-render.el @@ -47,10 +47,11 @@ (defun pacmacs--replace-empty-cell (start end) (add-text-properties start end - `(display ,(pacmacs--create-wall-tile - 40 40 - nil nil nil nil - nil nil nil nil)))) + `(display ((slice . (0 0 40 40)) + ,(pacmacs--create-wall-tile + 40 40 + nil nil nil nil + nil nil nil nil))))) (defun pacmacs--render-life-icon () (when (not pacmacs--life-icon) From fc53f131e6dcf577b54c59debd92f19eb2053028 Mon Sep 17 00:00:00 2001 From: rexim Date: Sat, 7 Nov 2015 00:05:33 +0600 Subject: [PATCH 5/6] Render score with display switch technique (#114) --- pacmacs-render.el | 3 +++ pacmacs.el | 6 +++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/pacmacs-render.el b/pacmacs-render.el index 108f4f5..9a9d5da 100644 --- a/pacmacs-render.el +++ b/pacmacs-render.el @@ -103,6 +103,9 @@ (insert "v"))))) (insert "\n")))) +(defun pacmacs--render-score (start end score) + (put-text-property start end 'display (format "Score: %d" score))) + (provide 'pacmacs-render) ;;; pacmacs-render.el ends here diff --git a/pacmacs.el b/pacmacs.el index 6a219de..6761a42 100644 --- a/pacmacs.el +++ b/pacmacs.el @@ -448,6 +448,7 @@ (with-current-buffer pacmacs-buffer-name (let ((inhibit-read-only t)) (erase-buffer) + (insert " \n") (plist-bind ((width :width) (height :height)) pacmacs--object-board @@ -461,12 +462,12 @@ (defun pacmacs--render-state () (with-current-buffer pacmacs-buffer-name (let ((inhibit-read-only t)) - ;; (erase-buffer) + (pacmacs--render-score 1 2 pacmacs-score) (plist-bind ((width :width) (height :height)) pacmacs--object-board - (let ((tile-pos 1)) + (let ((tile-pos 3)) (dotimes (row height) (dotimes (column width) (let ((anim-object (car (pacmacs--cell-wrapped-get pacmacs--object-board @@ -476,7 +477,6 @@ (pacmacs--replace-empty-cell tile-pos (1+ tile-pos)))) (cl-incf tile-pos)) (cl-incf tile-pos)))) - ;; (insert (format "Score: %d\n\n" pacmacs-score)) ;; (when pacmacs-debug-output ;; (pacmacs--render-track-board pacmacs--track-board)) From c7a97750457a26190a1cd6573c90453b7d7c6625 Mon Sep 17 00:00:00 2001 From: rexim Date: Sat, 7 Nov 2015 00:36:57 +0600 Subject: [PATCH 6/6] Render lives with partial buffer updating (#114) --- pacmacs-render.el | 16 +++++++++++++--- pacmacs.el | 13 ++++++++++++- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/pacmacs-render.el b/pacmacs-render.el index 9a9d5da..cf2783e 100644 --- a/pacmacs-render.el +++ b/pacmacs-render.el @@ -60,17 +60,27 @@ (plist-put pacmacs--life-icon :current-frame 2)) (pacmacs--render-anim pacmacs--life-icon)) +(defun pacmacs--replace-life-icon (start end) + (when (not pacmacs--life-icon) + (setq pacmacs--life-icon + (pacmacs-load-anim "Pacman-Chomping-Right")) + (plist-put pacmacs--life-icon :current-frame 2)) + (pacmacs--replace-anim start end pacmacs--life-icon)) + (defun pacmacs--render-anim (anim) (let* ((sprite-sheet (plist-get anim :sprite-sheet)) (current-frame (plist-get (pacmacs-anim-get-frame anim) :frame))) (pacmacs-insert-image sprite-sheet current-frame))) +(defun pacmacs--render-image (start end image) + (add-text-properties start end `(display ,image))) + (defun pacmacs--replace-anim (start end anim) (let* ((sprite-sheet (plist-get anim :sprite-sheet)) (current-frame (plist-get (pacmacs-anim-get-frame anim) :frame))) - (add-text-properties start end `(display - ((slice . ,current-frame) - ,sprite-sheet))))) + (pacmacs--render-image start end + `((slice . ,current-frame) + ,sprite-sheet)))) (defun pacmacs--render-object (anim-object) (if anim-object diff --git a/pacmacs.el b/pacmacs.el index 6761a42..3743633 100644 --- a/pacmacs.el +++ b/pacmacs.el @@ -457,7 +457,8 @@ (dotimes (column width) (ignore column) (insert " ")) - (insert "\n")))))) + (insert "\n"))) + (insert " \n")))) (defun pacmacs--render-state () (with-current-buffer pacmacs-buffer-name @@ -478,6 +479,16 @@ (cl-incf tile-pos)) (cl-incf tile-pos)))) + (plist-bind ((width :width) + (height :height)) + pacmacs--object-board + (let ((lives-counter-place (+ 3 (* (1+ width) height)))) + (delete-region lives-counter-place (point-max)) + (goto-char lives-counter-place) + (dotimes (i pacmacs-lives) + (ignore i) + (pacmacs--render-life-icon)))) + ;; (when pacmacs-debug-output ;; (pacmacs--render-track-board pacmacs--track-board))