えくすとらんのブログ

pygletをさわってみた6

うさこさんに動きを加え

あおいうさぎさんからなるべく逃げるように

プログラムをしてみました

#!/usr/bin/python
# -*- coding: utf-8 -*-
import pyglet
import random
from time import sleep
from pyglet.window import mouse
from pyglet.window import key

window = pyglet.window.Window(width=600, height=600, caption='usagitest')

usa_image = pyglet.resource.image('usa.png')
usa_image.anchor_x = usa_image.width / 2
usa_image.anchor_y = usa_image.height / 2

print("usawidth",usa_image.width)
print("usaheight",usa_image.height)

usako_image = pyglet.resource.image('usako.png')
usako_image.anchor_x = usako_image.width / 2
usako_image.anchor_y = usako_image.height / 2

usa_sprite = pyglet.sprite.Sprite(img=usa_image, x=300, y=300)
usako_sprite = pyglet.sprite.Sprite(img=usako_image, x=350, y=300)

keys = pyglet.window.key.KeyStateHandler()


def update(dt):
    window.push_handlers(keys)
    left = keys[pyglet.window.key.LEFT]
    right = keys[pyglet.window.key.RIGHT]
    up = keys[pyglet.window.key.UP]
    down = keys[pyglet.window.key.DOWN]
 
    usako_sprite.rotation += dt * 90
    usako_sprite.x += dt * int(usa_sprite.y - usako_sprite.y) * 2
    usako_sprite.y += dt * int(usa_sprite.x - usako_sprite.x) * 2
 
   #print(usako_sprite.rotation)

    if usako_sprite.x > 570:
            usako_sprite.x = 30
    elif usako_sprite.x < 30:
              usako_sprite.x = 570
    elif usako_sprite.y > 570:
              usako_sprite.y = 30
    elif usako_sprite.y < 30:
              usako_sprite.y = 570
    if up and down:
        None
    elif up:
        usa_sprite.y += dt * 150
       #print("\033[32mup\033[40m")
        if usa_sprite.y > 600:
            usa_sprite.y = 0
        elif abs(usa_sprite.y - usako_sprite.y) < 16 and abs(usa_sprite.x - usako_sprite.x) < 16:
            print("\033[31mHIT!\033[40m")
            sleep(0.5)
    elif down:
        usa_sprite.y -= dt * 150
       #print("\033[32mdown\033[40m")
        if usa_sprite.y < 0:
            usa_sprite.y = 600
        elif abs(usa_sprite.y - usako_sprite.y) < 16 and abs(usa_sprite.x - usako_sprite.x) < 16:
            print("\033[31mHIT!\033[40m")
            sleep(0.5)
    if right and left:
        None

    elif right:
        usa_sprite.x += dt * 150
       #print("\033[32mright\033[40m")
        if usa_sprite.x > 600:
            usa_sprite.x = 0
        elif abs(usa_sprite.x - usako_sprite.x) < 16 and abs(usa_sprite.y - usako_sprite.y) < 16:
            print("\033[31mHIT!\033[40m")
            sleep(0.5)
    elif left:
        usa_sprite.x -= dt * 150
       #print("\033[32mleft\033[40m")
        if usa_sprite.x < 0:
            usa_sprite.x = 600
        elif abs(usa_sprite.x - usako_sprite.x) < 16 and abs(usa_sprite.y - usako_sprite.y) < 16:
            print("\033[31mHIT!\033[40m")
            sleep(0.5)
@window.event
def on_draw():
    window.clear()
    usa_sprite.draw()
    usako_sprite.draw()


pyglet.clock.schedule_interval(update, 1 / 60.0)


pyglet.app.run()


うさこさんにあおいうさぎさんがタッチすることができると少しだけウエイトが入り
HIT!とターミナルに表示されます
とりあえずゲームっぽくなりました


得点なんかつけたらさらにゲームっぽくなりそうですが
とりあえずこのプログラムをここまでにして
最初に考えていたことにもどってみようとおもいます

プログラムとイメージは(うさとうさこ)は倉庫においておきましたので
ご自由におつかいください
ただ えくすとらんは素人ですのでトラブル等に対応できませんので
よろしくお願いします



pygletさわってみた 5

pyglet衝突判定探してみた ちゃんとあるみたい....だが...

なんだか難しい...えくすとらんのレベルではいまのところ解読不可能...

要は相手との距離がゼロなら衝突ってことでいいんじゃないかなぁなどとおもい

キーイベントにスプライト同士の距離をはかる計算をいれてみました




#!/usr/bin/python
# -*- coding: utf-8 -*-
import pyglet

from pyglet.window import mouse
from pyglet.window import key

window = pyglet.window.Window(width=600, height=600, caption='Sprite animation')

usa_image = pyglet.resource.image('usa.png')
usa_image.anchor_x = usa_image.width / 2
usa_image.anchor_y = usa_image.height / 2

print("usawidth",usa_image.width)
print("usaheight",usa_image.height)

usako_image = pyglet.resource.image('usako.png')
usako_image.anchor_x = usako_image.width / 2
usako_image.anchor_y = usako_image.height / 2

usa_sprite = pyglet.sprite.Sprite(img=usa_image, x=300, y=300)
usako_sprite = pyglet.sprite.Sprite(img=usako_image, x=350, y=300)

keys = pyglet.window.key.KeyStateHandler()


def update(dt):
    window.push_handlers(keys)
    left = keys[pyglet.window.key.LEFT]
    right = keys[pyglet.window.key.RIGHT]
    up = keys[pyglet.window.key.UP]
    down = keys[pyglet.window.key.DOWN]

    if up and down:
        None
    elif up:
        usa_sprite.y += dt * 300
        print("\033[32mup\033[40m")
        if usa_sprite.y > 570:
            usa_sprite.y = 30
        elif abs(usa_sprite.y - usako_sprite.y) < 16 and abs(usa_sprite.x - usako_sprite.x) < 16:
            print("\033[31mHIT!\033[40m")

    elif down:
        usa_sprite.y -= dt * 300
        print("\033[32mdown\033[40m")
        if usa_sprite.y < 30:
            usa_sprite.y = 570
        elif abs(usa_sprite.y - usako_sprite.y) < 16 and abs(usa_sprite.x - usako_sprite.x) < 16:
            print("\033[31mHIT!\033[40m")

    if right and left:
        None

    elif right:
        usa_sprite.x += dt * 300
        print("\033[32mright\033[40m")
        if usa_sprite.x > 570:
            usa_sprite.x = 30
        elif abs(usa_sprite.x - usako_sprite.x) < 16 and abs(usa_sprite.y - usako_sprite.y) < 16:
            print("\033[31mHIT!\033[40m")

    elif left:
        usa_sprite.x -= dt * 300
        print("\033[32mleft\033[40m")
        if usa_sprite.x < 30:
            usa_sprite.x = 570
        elif abs(usa_sprite.x - usako_sprite.x) < 16 and abs(usa_sprite.y - usako_sprite.y) < 16:
            print("\033[31mHIT!\033[40m")

@window.event
def on_draw():
    window.clear()
    usa_sprite.draw()
    usako_sprite.draw()


pyglet.clock.schedule_interval(update, 1 / 60.0)

pyglet.app.run()

ここにきてピンクのうさこさんに登場していただきました
GIMPで色だけかえました
これを実行すると





こんな感じになりました
print文でターミナルの文字色も変えてみました

ちなみに最初はX座標だけ(Y座標だけ)のマイナスだけで値をとったところ
Y座標を動かしても同じX座標でhitがでたため
X座標hit”かつ”(and) Y座標もhitという式になりました

あと16という数字は一応イメージサイズが32×32のチップなので
中心くらいで検出するといいのかなと思いこの数字にしてみました





pygletさわってみた4

スプライトの座標確認と

ウインドウの端についたら反対側から出てくるようにしてみた

#!/usr/bin/python
# -*- coding: utf-8 -*-
import pyglet

from pyglet.window import mouse
from pyglet.window import key

window = pyglet.window.Window(width=600, height=600, caption='Sprite animation')

usa_image = pyglet.resource.image('usa.png')
usa_image.anchor_x = usa_image.width / 2
usa_image.anchor_y = usa_image.height / 2

usa_sprite = pyglet.sprite.Sprite(img=usa_image, x=300, y=300)

keys = pyglet.window.key.KeyStateHandler()


def update(dt):
    window.push_handlers(keys)
    left = keys[pyglet.window.key.LEFT]
    right = keys[pyglet.window.key.RIGHT]
    up = keys[pyglet.window.key.UP]
    down = keys[pyglet.window.key.DOWN]

    if up and down:
        None
    elif up:
        usa_sprite.y += dt * 300
        print("うえ",usa_sprite.y)
        if usa_sprite.y > 570:
            usa_sprite.y = 30
    elif down:
        usa_sprite.y -= dt * 300
        print("した",usa_sprite.y)
        if usa_sprite.y < 30:
            usa_sprite.y = 570
    if right and left:
        None
    elif right:
        usa_sprite.x += dt * 300
        print("みぎ",usa_sprite.x)
        if usa_sprite.x > 570:
            usa_sprite.x = 30
    elif left:
        usa_sprite.x -= dt * 300
        print("ひだり",usa_sprite.x)
        if usa_sprite.x < 30:
            usa_sprite.x = 570

@window.event
def on_draw():
    window.clear()
    usa_sprite.draw()



pyglet.clock.schedule_interval(update, 1 / 60.0)

pyglet.app.run()

なかなかいい感じ



















これで一応キャラクターは好きな位置にもってこれることがわかった
もう一体くらい登場させて衝突判定とかできたらいいのになぁ
探してみたけれどpygletにそういった関数はないみたい?
cocos2d使ってくれとかという記述を見たような気がするが

sprite中心座標に丸か四角のポイントをつくって当たり判定とか
できたら楽しいだろうなぁ






続々.pygletさわってみた

今日はマウスイベントをちょっと勉強...

#!/usr/bin/python
# -*- coding: utf-8 -*-

import pyglet

window = pyglet.window.Window(width=200, height=200, caption='Mouseev')


# MOUSE EVENTS

# mouse press
@window.event
def on_mouse_press(x, y, button, modifiers):
    print('Mouse press')
    print('  x: {}, y: {}, button: {}, modifiers: {}'.format(x, y, button, modifiers)
)

# mouse release
@window.event
def on_mouse_release(x, y, button, modifiers):
    print('Mouse release')
    print('  x: {}, y: {}, button: {}, modifiers: {}'.format(x, y, button, modifiers)
)

# mouse drag
pyglet.app.run()

ウインドウ内をクリックするとカーソル位置座標とクリックボタン名などを
返すようだ

返り値を使えばクリック座標にイメージやスプライトを配置することが
できるかもしれない


続 続 pygletさわってみた

昨日つくったプログラムを少し改造してみた

#!/usr/bin/python
# -*- coding: utf-8 -*-
import pyglet

from pyglet.window import mouse
from pyglet.window import key

window = pyglet.window.Window(width=600, height=240, caption='Sprite animation')

usa_image = pyglet.resource.image('usa.png')
usa_image.anchor_x = usa_image.width / 2
usa_image.anchor_y = usa_image.height / 2

usa_sprite = pyglet.sprite.Sprite(img=usa_image, x=20, y=30)
usa_run = 1

@window.event
def on_draw():
window.clear()
usa_sprite.draw()

@window.event
def on_key_press(symbol, modifiers):
if symbol == key.RIGHT:
usa_sprite.x += 10
elif symbol == key.LEFT:
usa_sprite.x -= 10
elif symbol == key.UP:
usa_sprite.y += 10
elif symbol == key.DOWN:
usa_sprite.y -= 10
うんわかりやすい!

おお ひとまずこれで画像をキーボードで動かすことができるようになった
えくすとらんの考えているソフトにはこの動きでもいい
....がこれではアクションゲームやシューティングには使えないなぁ
なめらかに動かすにはやはりupdate(dt)をつかって
キーを押している時間*距離したほうがよさそう

そして...
#!/usr/bin/python
# -*- coding: utf-8 -*-
import pyglet

from pyglet.window import mouse
from pyglet.window import key

window = pyglet.window.Window(width=600, height=240, caption='Sprite animation')

usa_image = pyglet.resource.image('usa.png')
usa_image.anchor_x = usa_image.width / 2
usa_image.anchor_y = usa_image.height / 2

usa_sprite = pyglet.sprite.Sprite(img=usa_image, x=20, y=30)

keys = pyglet.window.key.KeyStateHandler()


def update(dt):
    window.push_handlers(keys)
    left = keys[pyglet.window.key.LEFT]
    right = keys[pyglet.window.key.RIGHT]
    up = keys[pyglet.window.key.UP]
    down = keys[pyglet.window.key.DOWN]

    if up and down:
        None
    elif up:
        usa_sprite.y += dt * 300
        print("うえ")
    elif down:
        usa_sprite.y -= dt * 300
        print("した")
    if right and left:
        None
    elif right:
        usa_sprite.x += dt * 300
        print("みぎ")
    elif left:
        usa_sprite.x -= dt * 300
        print("ひだり")

@window.event
def on_draw():
    window.clear()
    usa_sprite.draw()



pyglet.clock.schedule_interval(update, 1 / 60.0)

pyglet.app.run()

こんな感じにしてみた

すると.....




よし!いい感じ^^

あとはこのキャラを複製して配置後クリックでリスト表示なんかできれば
いいんだけど...まだまだ道は遠そうだなぁ

続 pyglet さわってみた

おお! なんとか画像を動かすことができた!

#!/usr/bin/python
# -*- coding: utf-8 -*-
import pyglet


window = pyglet.window.Window(width=600, height=240, caption='Sprite animation')

usa_image = pyglet.resource.image('usa.png')
usa_image.anchor_x = usa_image.width / 2
usa_image.anchor_y = usa_image.height / 2

usa_sprite = pyglet.sprite.Sprite(img=usa_image, x=30, y=90)


@window.event
def on_draw():
    window.clear()
    usa_sprite.draw()

def update(dt):
    usa_sprite.rotation += dt * 360
    usa_sprite.x += dt * 70

pyglet.clock.schedule_interval(update, 0.03)

pyglet.app.run()

これを実行すると




こんな感じになった

キーイベントに抱き合わせればキャラクターを動かせるかも....

もう少し調べてみよう!










久しぶりにプログラミング pygletをさわってみた

前々から作りたいと思っているアプリがある

それはかんたんにゆうと箱庭ゲームのような感じのもので

簡単なオブジェクトに名前をつけマップ上に配置しそれをクリック

するとリスト...あるいはデータが表示されるようなものだ

あえて簡単な(単純な色違いの四角)オブジェクトにしたいのは

用途が広がるからであり、例えば学校の席順から書籍管理に駐車場の車両管理

はたまた航空機の管制からおじいちゃんの薬の置き場所までカバー!

できるのではないかとおもっている?...

ただ...いかんせんえくすとらんは素人...

scratchを使ってなんとなくイメージを作ってみた

オブジェクトに名前をつけて配置するアプリ
(音量注意!)

...が名前はいれることができたもののリストやデータなどはまだ実装できてない

まぁおそらくできない...lol

そんなこんなでおもいたち.しばらく放置ぎみだったプログラミングをまた少しだけ

さわってみることに...

pythonのゲームフレームワークも結構あるみたいだが

自分の今の感じだとpygletがよさそうかななどとおもい

ドキュメントをちらちらみている

ひとまず デスクトップにresourceフォルダを作って
3種類のうさぎのpngチップをいれそれを表示することにした
(権限注意かなぁ)

#!/usr/bin/python
# -*- coding: utf-8 -*-
import pyglet
import resource
from pyglet.window import mouse
from easygui import*
window = pyglet.window.Window()

#リソースフォルダパス
pyglet.resource.path = ["/home/xtoran/Desktop/resource/"]
pyglet.resource.reindex()

#フォルダ中身を代入
usa1 = pyglet.resource.image("usa1.png")
usa2 = pyglet.resource.image("usamae.png")
usa3 = pyglet.resource.image("usaushiro.png")

#ドロー
@window.event
def on_draw():
    window.clear()
    sprite.draw()

def update(dt):
    pass

if __name__ == '__main__':
    sprite = pyglet.sprite.Sprite(usa2, x=100, y=100)

    pyglet.clock.schedule_interval(update, 0.5)
    pyglet.app.run()

なんとか表示されたようだ


























モジュールにeasyguiとかいれているのはあとあとlist表示とかするのに
つかえるかななんておもっている
一応マウスクリックで画面をクリックしてmsgboxがでるところまでは
確認できたので組み合わせ的にはよさそうな感じがする

しかし完成しそうにないので...えくすとらんの思っているような”無料かつ簡単な”アプリがすでにあるよとか...そんなものなら簡単にできちゃったよ とかいうかたはぜひ教えていただければ幸いですm(_ _)m




 久しぶりの更新です 備忘録 使っているarchlinuxにnvidiaのドライバを入れたところドライバがあっていなかったのかxが起動せずこれをアンインストールしたがその後xf86-video-nouveauが入っているにもかかわらずxが起動しなくなったのでarchwikiにて調...