Sześcianem go ...

A może to tylko wąż zbożowy .... w potrawce
To forum jest pod patronatem Kubusia czyli forumowego węża patrolowego..
ODPOWIEDZ
Awatar użytkownika
SunRiver
Użytkownik
Posty: 1353
Rejestracja: 08 paź 2017, 11:27
Lokalizacja: Festung Oppeln
Kontakt:

Sześcianem go ...

Post autor: SunRiver »

Moje retro zabawy nabierają rozpędu, możliwe że to z powodu znalezienia moich starych kodów z c64
a może efekt nudy ... w każdym razie fajnie pobawić się takimi wprawkami ..
Tym razem bawimy się sześcianem który będzie się obracał w przestrzeni. Na komodzie w basicu to była by strata czasu,
wiec zrobiłbym to w assemblerze ....

  1. ;===============================================================================
  2.     .cpu  6510
  3.     .sid
  4.     .text
  5.  
  6. ;---------------------------------------------------------------------
  7. ; Stałe
  8. ;---------------------------------------------------------------------
  9.  
  10. SCREEN_WIDTH  = $28          ; Szerokość ekranu
  11. SCREEN_HEIGHT = $2C          ; Wysokość ekranu
  12. SCREEN_SIZE   = $BA             ; Rozmiar ekranu (40 x 25 znaków)
  13. COLOR_BG      = $3F             ; Kolor tła
  14.  
  15. CUBE_POINTS:
  16.     .byte -8, -8, -8        ; Współrzędne wierzchołków (-8, -8, -8) do (8, 8, 8)
  17.     .byte -8,  8, -8
  18.     .byte  8,  8, -8
  19.     .byte  8, -8, -8
  20.     .byte -8, -8,  8
  21.     .byte -8,  8,  8
  22.     .byte  8,  8,  8
  23.     .byte  8, -8,  8
  24.  
  25. CUBE_EDGES:
  26.     .byte 0, 1
  27.     .byte 1, 2
  28.     .byte 2, 3
  29.     .byte 3, 0
  30.     .byte 4, 5
  31.     .byte 5, 6
  32.     .byte 6, 7
  33.     .byte 7, 4
  34.     .byte 0, 4
  35.     .byte 1, 5
  36.     .byte 2, 6
  37.     .byte 3, 7
  38.  
  39. ; Zmienne globalne
  40.  
  41. cube_rotation_x:  .byte 0    ; Aktualny kąt obrotu wokół osi X
  42. cube_rotation_y:  .byte 0    ; Aktualny kąt obrotu wokół osi Y
  43. cube_rotation_z:  .byte 0    ; Aktualny kąt obrotu wokół osi Z
  44.  
  45. ; Program główny
  46.  
  47. start:
  48.     ; Inicjalizacja
  49.     sei                  ; Wyłącz przerwania
  50.     lda #$35             ; Ustaw tryb tekstowy (40 kolumn x 25 wierszy)
  51.     sta $d011
  52.     lda #$00             ; Ustaw kolor czcionki na czarny
  53.     sta $d016
  54.     lda #$3f             ; Ustaw kolor tła na biały
  55.     sta $d020
  56.     lda #$10             ; Ustaw adres pamięci ekranu na $4000
  57.     sta $d018
  58.     lda #$2c             ; Ustaw wysokość ekranu na 25 wierszy
  59.     sta SCREEN_HEIGHT
  60.     lda #$28             ; Ustaw szerokość ekranu na 40 kolumn
  61.     sta SCREEN_WIDTH
  62.     lda #$ba             ; Ustaw rozmiar ekranu (40 x 25 znaków)
  63.     sta SCREEN_SIZE
  64.     lda #$00             ; Wyłącz kursor
  65.     sta $d014
  66.     lda #$01             ; Wyłącz VIC II
  67.  
  68.    ....
  69.    ....
  70.    ....
  71.    ; i jeszcze multum linijek
  72.  
Oczywiście nie będę tu wlepiał całego kodu bo jest to bezcelowe i może 30 lat temu robiło wrażenie :)
w każdym razie w pythonie można zrobić to szybciej i ładniej używając bibliotek pygame i pyopengl
a taki kod prezentuje się następująco
  1.  
  2. import pygame
  3. from pygame.locals import *
  4. from OpenGL.GL import *
  5. from OpenGL.GLU import *
  6.  
  7. wierzcholki = (
  8.     (1, -1, -1),
  9.     (1, 1, -1),
  10.     (-1, 1, -1),
  11.     (-1, -1, -1),
  12.     (1, -1, 1),
  13.     (1, 1, 1),
  14.     (-1, -1, 1),
  15.     (-1, 1, 1)
  16. )
  17.  
  18. krawedzie = (
  19.     (0, 1),
  20.     (0, 3),
  21.     (0, 4),
  22.     (2, 1),
  23.     (2, 3),
  24.     (2, 7),
  25.     (6, 3),
  26.     (6, 4),
  27.     (6, 7),
  28.     (5, 1),
  29.     (5, 4),
  30.     (5, 7)
  31. )
  32.  
  33. def RysujSześcian():
  34.     glBegin(GL_LINES)
  35.     for krawedz in krawedzie:
  36.         for wierzcholek in krawedz:
  37.             glVertex3fv(wierzcholki[wierzcholek])
  38.     glEnd()
  39.  
  40. def main():
  41.     pygame.init()
  42.     rozmiar_okna = (800, 600)
  43.     pygame.display.set_mode(rozmiar_okna, DOUBLEBUF|OPENGL)
  44.  
  45.     gluPerspective(45, (rozmiar_okna[0]/rozmiar_okna[1]), 0.1, 50.0)
  46.     glTranslatef(0.0, 0.0, -5.0)
  47.  
  48.     while True:
  49.         for event in pygame.event.get():
  50.             if event.type == pygame.QUIT:
  51.                 pygame.quit()
  52.                 quit()
  53.  
  54.         glRotatef(1, 3, 1, 1) # obrót sześcianu
  55.         glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
  56.         RysujSześcian()
  57.         pygame.display.flip()
  58.         pygame.time.wait(10)
  59.  
  60. main()
  61.  
  62.  
Mam nadzieję ze się wam podoba :)
ODPOWIEDZ

Wróć do „Python w plasterkach”