Done
This commit is contained in:
parent
4abb6cc7d5
commit
d9261a9c99
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
22
game.py
22
game.py
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
import random
|
import random
|
||||||
|
import psutil
|
||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import cv2
|
import cv2
|
||||||
|
@ -102,6 +103,7 @@ def show_frame(frame: np.ndarray, to_stdout: bool=False) -> None:
|
||||||
|
|
||||||
def main() -> int:
|
def main() -> int:
|
||||||
music = start_game_sfx()
|
music = start_game_sfx()
|
||||||
|
music_p = psutil.Process(pid=music.pid)
|
||||||
|
|
||||||
capture: VideoCapture = cv2.VideoCapture(0)
|
capture: VideoCapture = cv2.VideoCapture(0)
|
||||||
hands: mp.solutions.hands.Hands = mp_hands.Hands(max_num_hands=1)
|
hands: mp.solutions.hands.Hands = mp_hands.Hands(max_num_hands=1)
|
||||||
|
@ -115,6 +117,7 @@ def main() -> int:
|
||||||
finger_y: int = -1
|
finger_y: int = -1
|
||||||
no_collect_ratio = 0
|
no_collect_ratio = 0
|
||||||
no_finger_ratio = 0
|
no_finger_ratio = 0
|
||||||
|
timer = 100
|
||||||
|
|
||||||
i: int = 0
|
i: int = 0
|
||||||
while True:
|
while True:
|
||||||
|
@ -124,6 +127,8 @@ def main() -> int:
|
||||||
if not success:
|
if not success:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
ratio = max(no_finger_ratio, no_collect_ratio)
|
||||||
|
frame = cv2.addWeighted(frame, 1 - ratio, np.ones(frame.shape, dtype=frame.dtype), ratio, 0)
|
||||||
if i > 30:
|
if i > 30:
|
||||||
if collected_42:
|
if collected_42:
|
||||||
collected_42 = False
|
collected_42 = False
|
||||||
|
@ -139,7 +144,7 @@ def main() -> int:
|
||||||
img42_y + rand_noise_y : img42_y + img42_side_len + rand_noise_y,
|
img42_y + rand_noise_y : img42_y + img42_side_len + rand_noise_y,
|
||||||
img42_x + rand_noise_x : img42_x + img42_side_len + rand_noise_x,
|
img42_x + rand_noise_x : img42_x + img42_side_len + rand_noise_x,
|
||||||
] = img42
|
] = img42
|
||||||
no_collect_ratio = min(i, 200) / 200
|
no_collect_ratio = min(i, timer) / timer
|
||||||
|
|
||||||
finger_positions = list(get_finger_positions(frame, hands, add_landmarks=True))
|
finger_positions = list(get_finger_positions(frame, hands, add_landmarks=True))
|
||||||
if finger_positions == []:
|
if finger_positions == []:
|
||||||
|
@ -147,12 +152,12 @@ def main() -> int:
|
||||||
no_finger_ratio = min(no_fingers, 255) / 255
|
no_finger_ratio = min(no_fingers, 255) / 255
|
||||||
else:
|
else:
|
||||||
no_fingers = 0
|
no_fingers = 0
|
||||||
if no_fingers > 255:
|
|
||||||
music.kill()
|
|
||||||
return score
|
|
||||||
|
|
||||||
ratio = max(no_finger_ratio, no_collect_ratio)
|
if ratio > 0.99:
|
||||||
frame = cv2.addWeighted(frame, 1 - ratio, np.ones(frame.shape, dtype=frame.dtype), ratio, 0)
|
music.kill()
|
||||||
|
lost_sfx()
|
||||||
|
return score
|
||||||
|
|
||||||
|
|
||||||
for positions in finger_positions:
|
for positions in finger_positions:
|
||||||
index_knuckle_1_pos: tuple[int, int] = (-1, -1)
|
index_knuckle_1_pos: tuple[int, int] = (-1, -1)
|
||||||
|
@ -176,6 +181,11 @@ def main() -> int:
|
||||||
collected_42 = True
|
collected_42 = True
|
||||||
i = 0
|
i = 0
|
||||||
score += 42
|
score += 42
|
||||||
|
if score == 4200 / 4: # that's 25 collects
|
||||||
|
music_p.suspend()
|
||||||
|
initiate_rick()
|
||||||
|
music_p.resume()
|
||||||
|
timer = 60 + (timer - 60) * .9
|
||||||
collect_sfx()
|
collect_sfx()
|
||||||
show_frame(frame, to_stdout=(not sys.stdout.isatty()))
|
show_frame(frame, to_stdout=(not sys.stdout.isatty()))
|
||||||
i += 1
|
i += 1
|
||||||
|
|
|
@ -15,6 +15,8 @@ def start_game() -> None:
|
||||||
proc.communicate()
|
proc.communicate()
|
||||||
|
|
||||||
def show_highscore() -> None:
|
def show_highscore() -> None:
|
||||||
|
with open('./.score', 'w') as f:
|
||||||
|
f.write('0')
|
||||||
Popen([
|
Popen([
|
||||||
'tmux',
|
'tmux',
|
||||||
'display-popup',
|
'display-popup',
|
||||||
|
@ -30,7 +32,7 @@ def main() -> NoReturn:
|
||||||
while True:
|
while True:
|
||||||
if found_hands():
|
if found_hands():
|
||||||
start_game()
|
start_game()
|
||||||
sleep(1)
|
sleep(2)
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
main()
|
main()
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 21 KiB |
Binary file not shown.
After Width: | Height: | Size: 22 KiB |
Binary file not shown.
After Width: | Height: | Size: 22 KiB |
Binary file not shown.
After Width: | Height: | Size: 27 KiB |
Binary file not shown.
After Width: | Height: | Size: 30 KiB |
|
@ -14,6 +14,7 @@ opencv-python==4.8.0.76
|
||||||
packaging==23.1
|
packaging==23.1
|
||||||
Pillow==10.0.0
|
Pillow==10.0.0
|
||||||
protobuf==3.20.3
|
protobuf==3.20.3
|
||||||
|
psutil==5.9.5
|
||||||
pycparser==2.21
|
pycparser==2.21
|
||||||
pyparsing==3.0.9
|
pyparsing==3.0.9
|
||||||
python-dateutil==2.8.2
|
python-dateutil==2.8.2
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
|
|
||||||
TERM_FONT='SauceCodePro Nerd Font Mono'
|
TERM_FONT='SauceCodePro Nerd Font Mono'
|
||||||
TERM_FONT_SIZE='10'
|
TERM_FONT_SIZE='10'
|
||||||
OUT_TERM='xterm-mono'
|
OUT_TERM='vt100'
|
||||||
TERM_FULLSCREEN='-fullscreen'
|
TERM_FULLSCREEN='-fullscreen'
|
||||||
xterm \
|
xterm \
|
||||||
-bg black \
|
-bg black \
|
||||||
|
|
32
utils.py
32
utils.py
|
@ -1,4 +1,5 @@
|
||||||
from time import sleep
|
import sys
|
||||||
|
import time
|
||||||
from enum import Enum
|
from enum import Enum
|
||||||
from subprocess import Popen
|
from subprocess import Popen
|
||||||
from typing import Generator
|
from typing import Generator
|
||||||
|
@ -40,16 +41,37 @@ def save_score(score: int) -> None:
|
||||||
score_file.write(str(score))
|
score_file.write(str(score))
|
||||||
|
|
||||||
def start_game_sfx() -> Popen:
|
def start_game_sfx() -> Popen:
|
||||||
Popen(['paplay', './assets/sfx/start.mp3']).communicate()
|
Popen(['paplay', './assets/sound/start.mp3']).communicate()
|
||||||
sleep(.5)
|
time.sleep(.5)
|
||||||
return Popen(['paplay', './assets/sfx/background_music.mp3'])
|
return Popen(['paplay', './assets/sound/background_music.mp3'])
|
||||||
|
|
||||||
def collect_sfx() -> None:
|
def collect_sfx() -> None:
|
||||||
Popen(['paplay', './assets/sfx/collect.mp3'])
|
Popen(['paplay', './assets/sound/collect.mp3'])
|
||||||
|
|
||||||
|
def lost_sfx() -> None:
|
||||||
|
Popen(['paplay', './assets/sound/lost.mp3']).communicate()
|
||||||
|
|
||||||
def show_matrix() -> None:
|
def show_matrix() -> None:
|
||||||
Popen(['tmatrix'])
|
Popen(['tmatrix'])
|
||||||
|
|
||||||
|
def initiate_rick() -> None:
|
||||||
|
Popen(['paplay', './assets/sound/rick.mp3'])
|
||||||
|
cap = cv2.VideoCapture('./assets/video/rick2.mp4')
|
||||||
|
fps: int = int(cap.get(cv2.CAP_PROP_FPS))
|
||||||
|
desired_delay: float = 1 / fps
|
||||||
|
|
||||||
|
while True:
|
||||||
|
start_time = time.time()
|
||||||
|
ret, frame = cap.read()
|
||||||
|
if not ret:
|
||||||
|
break
|
||||||
|
sys.stdout.buffer.write(frame.tobytes())
|
||||||
|
elapsed_time = time.time() - start_time
|
||||||
|
remaining_delay = max(desired_delay - elapsed_time, 0)
|
||||||
|
time.sleep(remaining_delay)
|
||||||
|
cap.release()
|
||||||
|
|
||||||
|
|
||||||
def found_hands() -> bool:
|
def found_hands() -> bool:
|
||||||
capture: VideoCapture = cv2.VideoCapture(0)
|
capture: VideoCapture = cv2.VideoCapture(0)
|
||||||
hands = mp_hands.Hands(max_num_hands=1)
|
hands = mp_hands.Hands(max_num_hands=1)
|
||||||
|
|
Loading…
Reference in New Issue