週刊トビタテ留学記

ただの高専生がオーストラリアへトビタテ留学をするお話。

こんにちは、今週の週刊トビタテ留学記よろしくお願いします

22週目:3Dプリンター、3Dモデリング、Pygame、木工、染め物

ついに留学も半ばか!?

今日でオーストラリアに到着してから5か月目のSaaaya、本当に英語レベルが上がっているのか怪しいところですが、確実にリスニング力は上がっている気がします。
ただ、やっぱ語彙力の低さと発音の悪さ、そして緊張感が目立ちます。留学を2月ごろに終えるとしたら折り返しの時期ですね。後悔が無いように、「人見知りしてなるものか!」という気持ちで積極的に行きたいです。
今回は、最近やっている楽しいことをお伝えしたいです。

3DCadさん、3Dプリンターさん、初めまして。

ダーダン!!

そうなんです、植木鉢を作ったのです!

ちゃんとアイデア出しから始まって、Rhinoという3DCadを使わせていただき設計して、Graphicsの授業で3Dプリンターを使わせてもらいました。
電気科の私は、建築科の方たちみたいにデザイン力無いし(偏見)、機械科の方たちみたいに3Dキャドもプリンターも使ったことがない(偏見)のですが、2DCadは一年生の頃少し授業で触ったことがあります。
つまりほぼ初心者の私なのですが、何とか想像していくつか案を作りました。
写真は撮り忘れたのですが、「さいころ型」「本型」「地球型」とかを思うままに白紙に描きました。冒頭で写真を貼ったので想像つくと思いますが、「かんたんそうだから」さいころ型にしました。
そうして、Cadの使い方を少し教えてもらい、何とか自力で作りました。

f:id:Saaaya-11:20180923193332p:plain

"Fillet"だかなんだかのコマンドでかくかくしたのを丸めたりしてもらいました。感想としては、まずこのソフトを開発した人がすごい・・・!って感じでした。どういう仕組みなのか考えてもわかりませんし、考えたくなくなるレベルです・・・。調べていただくとわかりますが、かなり高級なソフトです、これ。

そして3D プリンターにデータを送信して、待つこと約1日間。完成。

完成したとき、さいころの目がくっついてないとことかめっちゃあったんですけど、ホットグルーで後で付けたいと思います。(今は仮に両面テープで付けてます)

そうして先生に植物を入れてもらいました。しかも生徒たちの目の前で・・・
結構生徒からは「あーもうそれ買いたいわ」みたいな声が聴けたので、ちょっとハッピーでした!9年生(中三)がまさにこれをしています。中三からこんな機会があるなんて羨ましいですよね!彼らは、パズルのピースの形の植木鉢だったり、キャラクターぽいのだったり、星の形だったり、たくさん面白そうなアイデアを持っていて、私としてはとても勉強になります。
私は3Dプリンター結構気に入ったので、本当に趣味で遊びたいレベルでほしいです。ちなみにこの学校のは200ドルくらいだったそうです。でも材料費半端ないだろうなあ~

Blenderモデリング

高校生のITの授業で生徒たちがやっていたのが面白そうだったし、なんか無料ソフトらしかったので少し使ってみました、Blender
これは3Dアニメーション作成ソフトです。でも私はまだアニメーションに手を付けてません・・・ただただ二つほどモデリングしただけです。来期から学校でもアニメーションに入るらしいので、初心者ながらもちょっと混ぜてもらおうかな・・・

さて、私が練習がてら何を作ったかというと、国内で内戦が起きるほどの勢力をもつ、この二つです。

f:id:Saaaya-11:20180923195908p:plain
f:id:Saaaya-11:20180923195913p:plain


私の処女作は上のきのこです。最初ならではの歪な感じがありますが、まあ悪くない仕上がりでしょう。今すぐにでも食べたくなります。

一方たけのこのほうは私の敵軍なので、最低限のたけのこの里感を出してもらいながら、クッキーの方はぼそぼそ感を出さなくてもいいかな~って思って手を抜きました。

でもやっぱ二作目なのでこっちのほうがきれいに見えますね・・・無念・・・。いずれはアニメーションに使いたいので、きのこのアップグレードをして、戦闘シーンでも作れたらと思います。

Pythonでゲーム作り

九年生のITを教えている先生に少し相談をいただいて、現在二人してPygameというものに手を出そうとしています。私は日本人なので、日本人が書いてるいい感じのサンプルないかな~と探すとありました!

news.mynavi.jp

を参考にしました。[Pygame 簡単 例]と調べたんですね。
一応一通り理解をしながらコピペせずに写していました。途中でちょっとアレンジしたりもしながら。
終わったころにですね、気づくんですよね。これ、PythonだけどPygameじゃないって。こちらはTkitkerといい、別のライブラリだったんです。でも私は負けません。所詮言語は同じ、方言だと思ってTkinterのライブラリを使っている個所をPygameのライブラリに置き換えればいいだけ。ということで、頑張って調べながらPygameに翻訳しました。

Saaayaは電気情報工学科とはいえ、自主的な生徒じゃないので、与えられた授業をこなすだけでした。なのではっきりと言ってそんなにプログラミングに詳しくないんです。さらに私の学科はC言語アルゴリズムよりも、電気回路やら電気系のほうが授業多いんですよね。でも、それでも一応三年間C言語触れてきたので、とても難しくは感じませんでした。
まあ全然うまくないんですけどね。
でも、こんなサンプルできたよ~って先生に送ったら、ほめていただきました!9年生の授業で参考として使ってもらえると嬉しいです。
f:id:Saaaya-11:20180923210101p:plain
これも処女作(?)置いておきます!果たして人のTkinterのコードをPygameに変換しただけで私の作品といえるのかわかりませんが・・・。

 #-*- coding:utf-8 -*-
import pygame
from pygame.locals import*
import sys
import random

#Colour info
WHITE=(255, 255, 255)
BLACK=(0, 0, 0)
BLUE=(0, 0, 255)
RED=(255, 0, 0)
GREEN=(0, 255, 0)
PURPLE=(100,0,50)

#datas
ball={"hspeed": 15, "vspeed": -15, "x": 350, "y": 300, "r": 10}
blocks=[]
block_size = {"x": 75, "y": 30}
bar = {"x": 0, "w": 100}
is_gameover = False
score = 0

def main():
    global screen
    pygame.init()
    screen=pygame.display.set_mode((600,400))
    init_game()
    #---GAME LOOP BELOW---#
    while (True): 
        draw_objects() #Draw the ball, bar, and blocks
        move_ball()
        pygame.time.delay(10) #Wait for 10[ms]
        
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            if event.type==KEYDOWN:  #press [Esc] to quit game
                if event.key==K_ESCAPE:
                    pygame.quit()
                    sys.exit()
                    
            if event.type == pygame.MOUSEBUTTONDOWN: #click to restart game 
                if event.button==1: #LeftClick=1 MiddleClick=2 RightClick=3 ScrollUp=4 ScrollDown=5
                    init_game()
            if event.type == pygame.MOUSEMOTION:
                mx, my=event.pos
                bar["x"]=mx
                
#---Initial Settings---#
def init_game(): 
    global score, is_gameover, count
    is_gameover = False
    ball["y"] = 250
    ball["vspeed"] = -10
    score = 0
    count = 0
    # give cordinations and colours to the blocks
    for iy in range(0, 5):
        for ix in range(0, 8):
            colour = RED
            if (iy + ix) % 2 == 1: colour = GREEN
            x1 = ix * block_size["x"]
            x2 = x1 + block_size["x"]
            y1 = iy * block_size["y"]
            y2 = y1 + block_size["y"]
            blocks.append([x1, y1, x2, y2, colour]) #add datas to 'Blocks' Array
    #put a caption on the top of the window
    pygame.display.set_caption("START")

#--Drawing background, blocks, a ball, and a bar--#
def draw_objects():
    global screen
    screen.fill((WHITE)) 
    #draw blocks
    for w in blocks:
        x1, y1, x2, y2, c = w
        pygame.draw.rect(screen, c, [x1, y1, block_size["x"], block_size["y"]], 0) #(surface, colour, [x, y, width, height], thickness)
    #draw a ball
    pygame.draw.circle(screen, BLUE, [ball["x"],ball["y"]],ball["r"],0) #(surface, colour, [x,y], radius, thickness)
    #draw a bar
    pygame.draw.rect(screen, PURPLE, [bar["x"], 390, bar["w"],10], 0)
    #wait for 30 [ms] then update the display
    pygame.time.wait(30) 
    pygame.display.update()
    
#move the ball
def move_ball():
    global is_gameover, score, count
    if is_gameover:
        return
    bx = ball["x"] + ball["hspeed"]
    by = ball["y"] + ball["vspeed"]
    
    # if the ball touched on the edges(above, left, or right)  of blocks
    if bx < 0 or bx > 600: ball["hspeed"] *= -1
    if by < 0: ball["vspeed"] *= -1
    
    #  the ball touched on the bar 
    if by > 390 and (bar["x"] <= bx <= (bar["x"] + bar["w"])):
        ball["vspeed"] *= -1
        if random.randint(0, 1) == 0: ball["hspeed"] *= -1 # random.randint(a,b) means "Return a random integer N such that a <= N <= b". So this code means "with a probablity of 1/2"
        by = 380 #put the ball back to above the bar
        
    # if the ball touched on the blocks 
    hit_i = -14
    i=0
    for i, w in enumerate(blocks):
        x1, y1, x2, y2, color = w
        r = ball["r"]
        if (x1-r <= bx <= x2+r) and (y1-r <= by <= y2+r):
            hit_i = i
            break
    if hit_i >= 0:
        del blocks[hit_i]  #delete the block
        ball["hspeed"] *= -1
        ball["vspeed"] *= -1
        score += 10
        pygame.display.set_caption("GAME SCORE = " + str(score)) #Put/update the score on the top of the window
        
    # gameover
    if by >= 400:
        pygame.display.set_caption("Game Over!! score=" + str(score))
        is_gameover = True
        del blocks[:]  #clear Blocks array for next play
        [f:id:Saaaya-11:20180923210721p:plain]
    # update ball["x"] and ball["y"]
    if 0 <= bx <= 600: ball["x"] = bx
    if 0 <= by <= 400: ball["y"] = by


if __name__ == "__main__":
    main()


つまり、このブロック崩しの初心者向けのプログラミング程度は理解できて、さらに改良ができる程度ではあったので、もとのやつよりちょっと良バージョンになったんじゃないかと思います(笑)
あと、参考に使われてもいいように、頑張って英語でコメントを書きました・・・

ほかにも、迷路ゲーム試作や、簡単なパズルゲームを作りました。
f:id:Saaaya-11:20180923210721p:plain
f:id:Saaaya-11:20180923210749p:plain
f:id:Saaaya-11:20180923210753p:plain
一番絵を描くのが苦痛でした。でもフリー素材に頼りたくなかったので、ちょっと頑張りました。
パズルは、結構ドラッグできるようにするのが難しかったです。さらにこれ、四角以外にも、三角や丸がランダムで出てきます。三角や丸のドラッグ判定がちょっとトリッキーでした・・・
pygames - Google ドライブ
Google Driveに全部置いておきます。興味がもしあったら見てくださいね~

Pygameに興味ある方は、PythonのIDLEをインストールすると一番簡単にできると思います。

Wood WorkやTextile

私は先日木工の時間に、8年生が作っている、木のペンシルケースを作りました。思ったより少し難しかったのですが、中学の技術の時間木工だけはどうも下手だった私にしてはなかなかの出来のものができました。
さらに、レーザーカッターを使わせていただき、取っ手を作ったり、名前や模様を入れたりしました!

とても楽しかったです。次は私がアイデア出したものを作らせてもらう予定です!さらに2DCadなども教わるつもりでワクワクしております!

また、私は被服の授業で、車いすの生徒のお手伝いをしたり、準備を手伝ったりもしているのですが、みんなが染め物をしているときに、私も少しやらせていただきました!

これはプリント型で、この柄は先生が写真から作ったものらしくて、とてもセンスいい!!
また、Shibori、そう、日本の絞り染めも授業中染の参考に出てきました。私は絞り染めとかに縁のない人生を送ってきましたが、それでも日本が出てくるとちょっぴりうれしくなっちゃいます!

今週も最後までお読みいただきありがとうございます。

ちょっとマニアック気味な個所もありましたが、こんな感じでデザインやITを英語で学べる環境に居るということに感謝です。
来週からは2週間旅に出ます!パソコンは持って行かないつもりなのですが、もしWi-Fiがホテルにあって、更新できそうだったらします。来週か、3週間後に会いましょう!

来週の目標コーナー

Term3最後の週、悔い残らず楽しむ。

最後までお読みいただきありがとうございました。
来週はどんな記事をお送りできるでしょうか。
気に入ってくださるとうれしいです。
コメント・読者、お待ちしております。